MyBatis持久层框架&plus
1. 使用方法
不用写Java代码,只专注于写SQL语句即可(使用增删查改四种标签),通过标签id与接口的方法名对应实现
Mapper接口中不允许重载
实际使用时通过SQL session,是通过工厂获取的
使用时手动创建SQL session的过程很复杂,后续这一过程交给ioc了
2. extra
2.1 传入–两种接收值的方法 #{} ${}
多表查询 / 主键设置 / 返回值类型 都是通过xml标签的属性来控制的
2.2 lombok使用
简化与数据库表对应的类
2.3 CURD案例
配置文件:
2.4 resultType和 resultMap
在MyBatis中,resultType
和resultMap
是用于指定查询结果映射的两种方式。
resultType
:通过指定Java类类型来映射查询结果。您可以使用Java的原生类型(如int、String等)或自定义的POJO(Plain Old Java Object)类。在使用resultType
时,MyBatis会根据SQL查询结果的列名和类型,自动将结果映射到指定的Java类的实例中。例如:
<select id="getUser" resultType="com.example.User">
SELECT id, name, email FROM users WHERE id = #{userId}
</select>
在上面的示例中,查询结果将被映射到com.example.User
类的实例中。
resultMap
:通过在MyBatis的映射文件中定义一个命名的结果映射来映射查询结果。通过使用resultMap
,您可以更加灵活地控制查询结果的映射规则,如处理多表联合查询、一对多关系等复杂场景。首先,在映射文件中定义一个<resultMap>
元素,其中包含各种映射规则,例如列名和Java属性之间的映射关系、嵌套对象的映射等。然后,在SQL语句中使用resultMap
的ID来指定结果映射。例如:
<resultMap id="userMap" type="com.example.User">
<id property="id" column="id" />
<result property="name" column="name" />
<result property="email" column="email" />
</resultMap>
<select id="getUser" resultMap="userMap">
SELECT id, name, email FROM users WHERE id = #{userId}
</select>
在上面的示例中,<resultMap>
定义了com.example.User
类的映射规则,然后在<select>
语句中使用resultMap="userMap"
来指定结果映射。
总结:
resultType
简单且适合于简单的查询,将结果直接映射到Java类的属性。resultMap
更加灵活且适合于复杂的查询,可以自定义映射规则来处理各种场景。
3. 多表查询
需要用户:
返回一个类
返回一个类的list
4. 会变化的SQL语句
就是给SQL语句加一点逻辑
5. 批量操作
依赖foreach标签
批量查询/删除/插入/修改
6. 分页插件 PageHelper
查询语句不用改,使用时直接设置分页参数即可
一个查询结果对应一个分页插件
//将查询结果list塞进分页插件中
PageInfo<Employee> pageInfo = new PageInfo<>(list)
7. 单表增删改查
mybatis-plus主要增强这个的
但是多表查询还得自己写
8. 总结
9. myBatis-plus快速入门
启动类的@Mapper Scan是 MyBatis 框架中的一个注解,用于扫描指定的包路径,自动将符合条件的接口标记为 MyBatis 的映射接口(Mapper)。
数据库对应表 lombok @Data:
mapper接口:
不用再写.xmlSQL语句了
使用:
真好啊真好啊真好啊
SQL条件增多,多到可以把条件封装到Wrapper
map删除:
10. Service层CRUD
Service层也有了CRUD方法:
偏向业务方法,而非纯操作DB
mapper:
获取IOC容器时都是用接口接:
11. 分页
(1)用mybatis的分页插件
(2)自定义分页:根据年龄查询的结果分页
注意:此处result Type是IPage的泛型,不是IPage
select标签内的语句不能有分号,因为在其后面要被加limit语句
使用:
12. Wrapper条件构造器
拼接条件用的
以下以基于userMapper为例
12.1 基于query的
查询:
更新:
上面是query实现,下面是专门的update实现(让专业的来)
12.2 基于lambda的
避免类名写错
对比:
13. 逻辑删除
不是真删除,实际是修改delete字段,方便数据回滚
设置此字段为1后再执行查询,mybatis-plus会自动在SQL语句后面添加where delete=0,限制一下
单个表指定:
全局指定所有表:
14. 乐观锁
并发访问可能导致的错误:
悲观锁:互斥访问,给厕所门上锁
乐观锁:没有锁,反复尝试,进去发现厕所有人,出来,隔一会再进去,发现还是有人,再出来。。。直到访问到数据(版本号方式,具体实现:
mybatis plus实现:
启动类:
数据库中添加乐观锁字段:
实体类:
使用: