User user = new User(); //user.setId(66L); // 没有设置id主键,但自动生成并插入(默认方式:ID_WORKER) user.setName("学习Java"); user.setAge(17); user.setEmail("study-self@qq.com"); System.out.println("插入记录数:" + userMapper.insert(user));
2、主键生成策略
1 2 3 4 5 6 7 8 9 10 11
@TableId(type = IdType.xxx)// 看IdType源码 private Long id;
取出记录时,获取当前version 更新时,带上这个version 执行更新时,set version = new version where version = oldVersion 如果version不对,就更新失败
1 2 3 4 5 6
乐观锁:先查询,获得版本号【version=99】 -- 线程A update user set name="hello",【version=version+1】 where id=5 and 【version=99】 -- 线程B update user set name="hello",【version=version+1】 where id=5 and 【version=99】 -- 如果B抢先完成更新,这时此条在数据库中的记录【version=100】,就会导致A更新失败!
// 删除 userMapper.deleteById(1L); /* 查看控制台,逻辑删除使用的SQL语句是更新操作,而不是删除操作: UPDATE user SET deleted=1 WHERE id=? AND deleted=0 在数据库中查看,你会发现这条记录还在,只是deleted由 0 改为 1 了,但后面查询的话是查不到该记录的。 */
// 查询 System.out.println(userMapper.selectById(1L)); /* 控制台观察到的SQL语句是: SELECT id,name,age,email,create_time,update_time,version,deleted FROM user WHERE id=? AND deleted=0 查询不到任何结果! 也就是说,查询的时候会自动的过滤被逻辑删除掉的字段(sql语句后面拼接:deleted=0) */
@Test voidcontextLoads(){ // 查询所有用户 userMapper.selectList(null).forEach(System.out::println); } /* 控制台输出如下结果,用时30ms: Time:30 ms - ID:com.myself.mapper.UserMapper.selectList Execute SQL: SELECT id, name, age, email, create_time, update_time, version, deleted FROM user WHERE deleted=0 */
11、条件构造器
测试1
1 2 3 4 5 6 7 8 9
@Test publicvoidtestWrapper01(){ // SQL语句:... WHERE name IS NOT NULL AND email IS NOT NULL AND age >= ? QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.isNotNull("name") .isNotNull("email") .ge("age",20); mapper.selectList(wrapper).forEach(System.out::println); }
测试2
1 2 3 4 5 6 7 8 9
@Test publicvoidtestWrapper02(){ // SQL语句:... WHERE name = ? QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.eq("name","jack"); // 查询一个数据,得到多个结果需要使用List、Map,而One仅限一个结果,否则报错。 User user = mapper.selectOne(wrapper); System.out.println(user); }
测试3
1 2 3 4 5 6 7
@Test publicvoidtestWrapper03(){ // SQL语句:... where age between ? and ? QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.between("age",18,21); mapper.selectList(wrapper).forEach(System.out::println); }
测试4
1 2 3 4 5 6 7 8 9 10 11 12 13
@Test publicvoidtestWrapper04(){ // 模糊查询 like %xxx% // 左 %xxx、右 xxx% // SQL语句:... WHERE name LIKE '%o%' AND email LIKE 'te%' QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.like("name","o") .likeRight("email","te"); //List<User> users = mapper.selectList(wrapper); // 封装为对象 //List<Map<String,Object>> maps = mapper.selectMaps(wrapper); // 封装为Map List<Object> objs = mapper.selectObjs(wrapper); // 封装为对象 objs.forEach(System.out::println); }
测试5
1 2 3 4 5 6 7 8
@Test publicvoidtestWrapper05(){ // 子查询 // SQL语句:... WHERE id IN (select id from user where id>3) QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.inSql("id","select id from user where id>3"); mapper.selectList(wrapper).forEach(System.out::println); }