Mybatis
- 原始 jdbc 操作分析
- 问题:
- 数据库连接创建、释放资源造成系统浪费从而影响系统性能
- sql 语句在代码中硬编码,造成代码不易维护,实际应用 sql 变化的可能较大,sql变动需要改变代码
- 查询操作时,需要手动将结果集中的数据手动封装到实体中,插入操作时,需要手动将实体的数据设置到 sql 语句的占位符位置
- 解决方案
- 使用数据库连接池初始化连接资源
- 将 sql 语句抽取到 xml 配置文件中
- 使用反射、内省等底层技术,自动将实体与表进行熟悉你个与字段的自动映射
- 问题:
-
快速入门
-
添加坐标
-
创建 user 数据表
-
编写 user 实体类
-
编写映射文件 UserMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>- 配置mapper
-
编写核心文件 SqlMapConfig.xml
<?xml version="1.0" encoding="UTF-8"?> -
编写测试类
-
-
映射文件概述
-
-
增删改查
- 映射文件中使用 parameterType 属性指定要插入的数据类型
- 如果类型为java.lang.String等 sql语句中使用 #{任意字符串}
- sql 语句使用 #{user.username} 引用实体中的属性值
- 涉及数据库数据变化,需要提交事务
- 映射文件中使用 parameterType 属性指定要插入的数据类型
-
核心配置文件概述
- configuration 配置
- properties 标签:引入外部properties文件
- settings 设置
- typeAlisaes :设置类型别名
- typeHandlers 配置自定义类型处理器
- 开发步骤:
- 定义转换类继承类 BaseTypeHandler
- setNonNullParameter 将 java 类型转换成数据库需要的类型
- getNullableResult 将数据库中类型转换成java类型
- String参数 要转换的字段名称
- ResultSet:查询出的结果集
- MyBatis 核心配置文件中进行注册
- 开发步骤:
- objectFactory 对象工厂
- plugins 配置 Mybatis 插件
- 分页助手 PageHelper 是将分页的复杂操作进行封装,使用简单的方式即可获得分页的相关数据
- 开发步骤:
-
导入通用
- com.github.pagehelper pagehelper 3.7.5 (必须!)
- com.github.pagehelper jsqlparser 0.9.1 (必须!)
-
mybatis核心配置文件配置PageHelper插件
-
设置分页相关参数 当前页+每页显示的条数
- PageHelper.startPage(1,2);
-
获得与分页相关的参数 上下页等
- PageInfo pageInfo = new PageInfo(userList);
-
- environments 数据源环境配置标签
- transactionManager 事务管理器
- JDBC:直接使用JDBC的提交和回滚设置,依赖于从数据源得到的连接来管理事务作用域
- MANAGED
- dataSource 数据源
- UNPOOLED:数据源的实现只是每次被请求时打开和关闭连接
- POOLED:数据源的实现利用“池”的概念讲JDBC连接对象组织起来
- JNDI:
- transactionManager 事务管理器
- databaseIdProvider 数据库厂商标识
- mappers 映射器
- 加载映射配置
-
相应API
- SqlSessionFactory 工厂构建器 SqlSessionFactoryBuilder
- SqlSessionFactory 有多个方法创建 SqlSession 实例,常用两个
- openSession():默认开启一个事务,事务不会自动提交
- openSession(boolean autoCommit):参数为是否自动提交
- SqlSession 会话对象
Mybatis 的 Dao 层实现
- 代理开发方式
- 规范:
- Mapper.xml 文件中的 namespace与mapper接口的全限定名相同
- Mapper 接口方法名和Mapper.xml 中定义的每个 statement 的id 相同
- Mapper 接口方法的输入参数类型和 mapper.xml中定义的每个sql的parameterType的类型相同
- Mapper 接口方法的输出参数类型和 mapper.xml中定义的每个 sql的resultType的类型相同
- 使用 sqlSession.getMapper(UserMapper.class)
- 规范:
- 动态 sql
-
select * from users where…
-
select * from users where…in …
-
sql 语句抽取
- include使用
-
- 总结
- Mybatis 映射文件配置
- 查询
- 插入
- 修改
- 删除
- where条件
- if判断
- 循环
- sql片段抽取
- Mybatis 映射文件配置
多表查询
-
一对一(即封装的对象User):可以手动指定字段和实体之间关系 哪个字段是哪个实体的
- 返回值 resultMap
- 配置 resultMap
- * property:当前实体 * javaType:当前实体中的属性的类型
-
一对多(即封住的list集合 list):
- 返回值 resultMap
- 配置 resultMap + collection
- * property:集合名称 * ofType:集合中的数据类型
-
多对多
- 返回值 resultMap
- 配置 resultMap + collection
- 配置操作相当于上面的结合
Mybatis 注解开发
- 常用注解
- Insert:添加
- Update:修改
- Delete:删除
- Select:查询
- Result:结果集封装
- Results:与@Result一起使用,封装多个对象
- One:一对一结果集封装
- Many:一对多结果集封装
- 简单使用:
- Mapper类上 @XXX(sql语句)
- SqlMapConfig 加载映射关系(Mappers package)
- 复杂映射开发
- @Results:代替该注解中可以使用单个@Result注解,也可以使用@Result集合
- 格式:@Results({ @Result(),@Reuslt() }) 或 @Results(@Result())
- @Result:代替 标签 和 标签
- column:数据库的列名
- property:需要装配的属性名
- one:需要使用的@One 注解( @Result(one = @One) )
- many:需要使用的@Many注解(@Result(many = @Many))
- @One(一对一):代替标签,用来指定子查询返回单一对象
- select:指定用来多表查询中的 sqlmapper
- 使用格式:@Result(column="",property="",one=@One(select=""))
- @Many(一对多):代替标签,用来指定子查询返回对象集合
- 使用格式:@Result(property="",column="",many=@Many(select=""))
-
一对一查询
-
-
一对多查询
-
多对多:
- @Results:代替该注解中可以使用单个@Result注解,也可以使用@Result集合