系列三来了…这次是Mybatis
写此系列的目的是做一个学习笔记管理,方便以后复习用。
快速入门
添加坐标
1
2
3
4
5
6
7
8
9
10<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.26</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>创建数据表
编写实体类
编写dao接口 mapper
编写映射文件UserMapper dtd的约束头参考
编写核心配置文件SqlMapConfig.xml
编写测试类
增删改查
1 | sqlSession.selectList("userMapper.findAll"); |
核心配置文件
SqlMapConfig.xml
emvironments—数据库环境的配置,指定事务管理类型和数据源
- transactionManager: JDBC, MANAGED
- dataSource: POOLED , JNDI, UNPOOLED
mappers—加载映射文件 userMapper.xml
properties—加载外部properties文件
typeAliases—定义别名
typeHandlers—配置自定义类型处理器
- 处理日期转换为例
- 定义转换类继承类BaseTypeHandler<>
- 覆盖4个未实现的方法
- 在核心配置文件SqlMapConfig.xml中进行配置
- 测试
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19public class DateTypeHandler extends BaseTypeHandler<Date> {
//将java类型转换为数据库需要的类型
public void setNonNullParameter(PreparedStatement preparedStatement, int i, Date date, JdbcType jdbcType) throws SQLException {
long time = date.getTime();
preparedStatement.setLong(i, time);
}
//以下三个将数据库类型转换为java类型
//String是要转换的字段名称
//resultSet查询出的结果集
public Date getNullableResult(ResultSet resultSet, String s) throws SQLException {
long aLong = resultSet.getLong(s);
Date date = new Date(aLong);
return date;
}
...
}1
2
3
4<!--自定义注册类型处理器-->
<typeHandlers>
<typeHandler handler="com.tsuki.handler.DateTypeHandler"/>
</typeHandlers>- 处理日期转换为例
plugins 扩展功能 – PageHelper,第三方插件进行功能扩展
步骤
导入通用的PageHelper坐标
1
2
3
4
5
6
7
8
9
10<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.3.0</version>
</dependency>
<dependency>
<groupId>com.github.jsqlparser</groupId>
<artifactId>jsqlparser</artifactId>
<version>4.2</version>
</dependency>在核心配置文件中配置PageHelper插件
1
2
3
4
5
6<!--配置分页助手插件-->
<plugins>
<plugin interceptor="com.github.pagehelper.PageHelper">
<property name="dialect" value="mysql"/>
</plugin>
</plugins>测试
PageHelper.startPage(1, 2);
相应api(单元测试用)
- SqlSessionFactoryBuilder
- SqlSessionFactory: openSession() or openSession(boolean autoCommit) 可以设置自动提交事务
- SqlSession,增删改查
Dao层实现
传统方式
代理开发方式
区别就是需不需要手动实现接口
sqlSession.getMapper(UserMapper.class);
要保持四个一致:映射文件中的mapper的namespace要是interface的全包名,id和方法名一致,parameterType和形参类型一致,resultType和返回值类型一致。
映射配置文件深入
1. 常用标签
<select> <insert> <update> <delete>
1 | <mapper namespace="com.tsuki.dao.UserMapper"> |
2. 动态sql
占内存
<if> <foreach><sql><where>
多表操作
注解
常用注解:用注解替代映射文件
简单查询—-注解加载接口方法上
@Insert @Delete @Update @Select
1 | <!--加载映射关系--> |
复杂查询
@Result @Results @One(一对一) @Many(一对多,多对多)
套娃
报错
- java.lang.ClassCastException: com.github.pagehelper.PageHelper cannot be cast to org.apache.ibatis. 探究plugins分页插件时的问题,多半是版本问题—-论springboot的好处,内置版本号
- is not known to the MapperRegistry, 原因是namespace没有修改为全包名
- 用Mybatis插入数据但是没反应,用错了标签,’
‘用成了’ ‘