作为持久层的ORM框架,目前在国内主流之一就是MyBatis,学会用它,用好它肯定是必备的功课
我会主要从下面几个方面入整理本篇博客
- 快速搭建快发环境
- 常见的注解
- 怎么玩?
一. 快速搭建开发环境
小插曲,添加测试模块的时候,引入junit模块和spring-boot-text-starter模块有先顺序,不然ide会报错…
坐标
1 | <parent> |
- 另外插一嘴—mysql连接的版本适配
我现在用的云主机docker上的官方版mysql,版本比较新,因此我的调整版本到 8以上,不然会报错说什么
1 | com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could |
配置文件:
- 主要是配置数据库的连接,如果我们使用的是通用mapper,Mybatis可以做到零配置
1 | server: |
启动类
- 在这里告诉通用mapper我们的mapper包路径
1 | import org.springframework.boot.SpringApplication; |
编写Mapper
- 让我们自己的Mapper继承通用mapper,泛型是实体类名
- 给它实体类名,就相当与告诉它了我们的表里的字段,不让他怎么会知道如何动态生成sql ?
1 | import tk.mybatis.mapper.common.Mapper; |
ok,到现在环境就搭建好了
二. 常见的注解
- 这里的注解主要是作用在实体类上的注解,当我们撸起袖子写代码的时候,被给它难住喽,尴尬
情景1: 对于实体类
标记他对应那张表
1 | import javax.persistence.Table; |
- 注解2:
直接使用Mybatis的原生注解
1 | @Id |
情景3:
我们都知道springMVC会把前端发送过来的json转化为我们的javaBean,因此我们的javaBean里面的属性名和前端发送的那个对象的属性名要意义对应的,这是规范!
设想,加入前端一顿收集数据,把商品的品牌信息和库存信息都发送过来了,只有关于品牌的javabean,数据接受不全怎么办? 没关系,下面的注解可以搞定
- @Transient (意味短暂的)告诉mapper 他不是PO(持久层对象,Persistence Object)的属性,而且,springMvc还会把信息关于库存的信息,封装进去
1 | @Transient |
情景4:
我们的pojo属性名,和数据库中的关键字重名怎么办?
@Column() 可以解决 数据库中的字段为数据库的关键字的问题
1 | @Column(name="`numeric`") // |
情景5 :
数据表中tingint(1) 对应的javaBean的属性咋写?
1 | tingint(1) // 它是boolean的同义词 |
情景5:
关于VO , 如何选择性的返回给前端javaBean的属性?就比如说我们查询有没有这个用户,总不至于把密码,私人信息一块返回给前端吧?
1 | import com.fasterxml.jackson.annotation.JsonIgnore; |
它是jackson的注解
1 | <dependency> |
三. 怎么玩?
下面就是介绍常用的mapper的API
一. CRUD
- 两种新增
1 | //会有选择性的新增, 智能判断 brand里面有没有空的字段,有值,用这个值,没有值而使用数据库的默认值 |
- 简单查询
1 | /** |
- 简单删除
1 | /** |
- 如何玩修改?
修改主要用到下面这个api
1 | /** |
看到这个方法有没有觉得很爽? 它根据主键,修改不为null的属性,意思就是说,我们把不需要修改的地方设置为null就好了
,这样看,前面需要我们一顿整,整啥呢? 结合实际的业务逻辑,把前端给交过来的数据最新的数据放到我们的bean中直接修改,把不需要修改的属性设置为null,有属性可能需要直接删除,有的属性可能要去别的表中查询(别忘了加上事务 @Transactional )
1 | /** |
这个方法和上面的神似
二 .分页,过滤(模糊查询),搜索
API
1 | mapper.selectByExample(example) |
参照下面原生的sql.拼接查询条件
1 | select * from 表名 |
逻辑
1 | public VO queryBrandByPage(Integer page, String key, Integer rows, String sortBy, Boolean desc) { |
三 .自定义sql
Mybatis只能针对单表为我们生成sql,如果我们的需求是跨表操作,比如说涉及到两张表,我们就得去mapper里面自己写sql
原生sql
1 | select * from tb_brand b |
mapper
?用#{id} 取代
1 | @Select("select * from tb_brand b inner join tb_category_brand cb on b.id=cb.brand_id where cb.category_id=#{cid}") |
四 .拓展包–批量操作
- 批量查询,批量删除
注意他的包啊!
1 | import tk.mybatis.mapper.additional.idlist.IdListMapper; |
1 | /** |
- 批量插入:
1 | import tk.mybatis.mapper.additional.insert.InsertListMapper; |
抽取出一个baseMapper, 添加 @RegisterMapper 它才会被扫描到生效
1 | import tk.mybatis.mapper.additional.idlist.IdListMapper; |