MyBatis-Plus基础入门
MyBatis-Plus入门
简介:Mybatis-Plus(MP)在 MyBatis 的基础上只做增强不做改变,简化开发、提高效率。本课程从现有持久层框架存在的问题切入,引出MP在项目开发中能为我们解决哪些问题。课程中细致地讲解了MP的核心功能;并且结合实际场景,讲解了某些方法在特定场景下的使用。如果想进一步提升,请观看《MyBatis-Plus进阶》课程,链接在此:https://www.imooc.com/learn/1171
第1章 简介
-
Mybatis与JPA对比
Mybatis优势
MyBatis可以进行更为细致的SQL优化,可以减少查询字段。
MyBatis容易掌握,而Hibernate门槛较高。Hibernate优势
Hibernate的DAO层开发比MyBatis简单,Mybatis需要维护SQL和结果映射。
Hibernate对对象的维护和缓存要比MyBatis好,对增删改查的对象的维护要方便。
Hibernate数据库移植性很好,MyBatis的数据库移植性不好,不同的数据库需要写不同SQL。
Hibernate有更好的二级缓存机制,可以使用第三方缓存。MyBatis本身提供的缓存机制不佳 -
Mybatis-Plus简介
MP是Mybatis的增强工具,只做增强不做改变。
MP框架结构:
-
Mybatis-Plus特性
第2章 基本使用
- 通用传统模式简介
2.排除非表字段的三种方式
1.transient关键字
2.使用静态变量(static)
3.TableField(exit=false)
第3章 MyBatis-Plus查询方法
-
普通查询
(1)单表查询所有记录 selectList@Test public void testSelect() { System.out.println(("----- 单表查询所有记录------")); List<User> userList = userMapper.selectList(null); Assert.assertEquals(6, userList.size()); //表里面的记录总条数是否等于6,如果等于6,则测试通过 userList.forEach(System.out::println); }
(2)单表根据主键id查询单条记录 selectById
@Test public void testSelectById() { System.out.println(("----- 单表根据主键id查询单条记录 ------")); User user = userMapper.selectById(2); System.out.println(user); }
(3)单表根据条件查询 selectByMap
@Test public void testSelectByMap() { System.out.println(("----- 单表根据条件查询 ------")); Map<String, Object> conditions = new HashMap<>(); conditions.put("name", "Jack"); conditions.put("age", 20); ist<User> userList= userMapper.selectByMap(conditions); userList.forEach(System.out::println); }
-
条件构造器查询
(1)多eqQueryWrapper<Student> queryWrapper = new QueryWrapper<>(); queryWrapper.lambda() .and(obj -> obj.eq(Student::getName, "西夏") .eq(Student::getAge, 26)); List<Student> studentList = list(queryWrapper); for (Student student : studentList) Console.info(new Gson().toJson(student));
(2)or
QueryWrapper<Student> queryWrapper = new QueryWrapper<>(); queryWrapper.lambda() .or(obj1 -> obj1.eq(Student::getName, "西夏")) .or(obj2 -> obj2.eq(Student::getName, "1")); List<Student> studentList = list(queryWrapper); for (Student student : studentList)
SQL语句:
SELECT * FROM t_student WHERE ( name = ? ) OR ( name = ? )
条件参数说明
询方式 说明 setSqlSelect 设置 SELECT 查询字段 where WHERE 语句,拼接 + WHERE 条件 nd AND 语句,拼接 + AND 字段=值 andNew AND 语句,拼接 + AND (字段=值) r OR 语句,拼接 + OR 字段=值 orNew OR 语句,拼接 + OR (字段=值) eq 等于= ne 不等于<> gt 大于> ge 大于等于>= lt 小于< le 小于等于<= like 模糊查询 LIKE notLike 模糊查询 NOT LIKE in IN 查询 notIn NOT IN 查询 isNull NULL 值查询 groupBy 分组 GROUP BY orderBy 排序 ORDER BY orderAsc ASC 排序 orderDesc DESC 排序 exists EXISTS 条件语句 between BETWEEN 条件语句 addFilter 自由拼接 SQL -
分页查询
(1)创建分页插件@Bean public PaginationInterceptor paginationInterceptor() { return new PaginationInterceptor(); }
(2)测试分页
/** * myabtis 实现的分页为什么还要分页插件? * <p> * 1.mybatis实现得分页时逻辑分页或者叫做内存不是物理分页 * 2.他是把符合条件的数据全部查询出来放到内存中,然后返回你需要的那部分 * 3.表中数据不多时,可以使用,速度慢一些;当数据量大时,建议使用物理分页 */ @Test public void selectPage() { QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.ge("age", 26); //总页数+总记录数 // Page<User> page = new Page<>(1, 2); // 不返回总记录数 设置false Page<User> page = new Page<>(1, 2, false); //第一种 // IPage<User> iPage = userMapper.selectPage(page, queryWrapper); // System.out.println("总页数:"+iPage.getPages()); // System.out.println("总记录数:"+iPage.getTotal()); //第二种 IPage<Map<String, Object>> iPage = userMapper.selectMapsPage(page, queryWrapper); System.out.println("总页数:" + iPage.getPages()); System.out.println("总记录数:" + iPage.getTotal()); List<Map<String, Object>> userList = iPage.getRecords(); userList.forEach(System.out::println); }
-
自定义sql
(1)找到 Dao,写一个数据库操作接口public interface StudentDao extends BaseMapper<Student> { List<Student> selectAll(); }
(2)在xml文件中写sql
<!--List<Student> selectAll();--> <select id="selectAll" resultMap="BaseResultMap"> select * from t_student </select>
最后
@Resource StudentDao studentDao; List<Student> studentList = studentDao.selectAll(); for (Student student : studentList){ Console.info(new Gson().toJson(student)); }
第4章 更新及删除
第5章 AR模式、主键策略
1.AR模式
(1)实体类对象继承Model
@EqualsAndHashCode(callSuper = false)
@Data
public class User extends Model<User> {
// 主键
private Long id;
//姓名
@TableField(condition = SqlCondition.LIKE)
private String name;
//年龄
@TableField(condition ="%s<#{%s}")
private Integer age;
//邮箱
private String email;
// 上级id
private Long manager_id;
//创建时间
private LocalDateTime createTime;
}
(2)接口服务类继承baseMapper接口
public interface UserMapper extends BaseMapper<User> {}
(3) 测试AR
@Component
public class UserMapperARTest extends MybatisPlusSamplesChapter1ApplicationTests {
@Test
public void insertAR(){
User user = new User();
user.setName("刘华");
user.setAge(20);
user.setEmail("test@gblfy.com");
user.setManager_id(1111L);
user.setCreateTime(LocalDateTime.now());
boolean insert = user.insert();
System.out.println(insert);
}
@Test
public void selectByIdAR(){
User user = new User();
User user1 = user.selectById(111L);
System.out.println(user == user1);
System.out.println(user1);
}
@Test
public void selectByIdAR2(){
User user = new User();
user.setId(11L);
User user1 = user.selectById();
System.out.println(user == user1);
System.out.println(user1);
}
@Test
public void updateByIdAR(){
User user = new User();
user.setId(11L);
user.setName("你的纳斯达克");
boolean user1 = user.updateById();
System.out.println(user1);
}
@Test
public void delByIdAR(){
User user = new User();
user.setId(11L);
boolean user1 = user.deleteById();
System.out.println(user1);
}
}
2.主键策略
mybatis plus 实体类主键策略有3种( 注解 > 全局 > 默认 )
(1)注解方式
@TableId(type = IdType.AUTO)在实体类增加注解即可
(2)全局
生成数字型ID:895503808246718464,ID长度超出JavaScript
(3)默认,mybatis plus默认使用全局唯一的数字类型
ID_WORKER(2, “全局唯一ID”),生成的ID格式:ccba0a05fcbe46898304d5213d2b5518
第6章 通用service
(1)新建接口UserService
public interface UserService extends IService<User> {
}
(2)UserService的实现类 UserServiceImpl
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
}
(3)测试类
@Autowired
private UserService userService;
@Test
public void selectOneService() {
User user = userService.getOne((Wrapper<User>) queryWrapper.gt("age", 30), false);
}
一般Java项目分层
参考:
https://blog.csdn.net/modelsetget/article/details/89972714
https://www.cnblogs.com/jackson0714/p/study-mybatis-plus2.html#_label2
https://blog.csdn.net/weixin_40816738/article/details/93382602
http://www.manongjc.com/detail/7-tcbnqblvvvqvspe.html