发表于: 2020-10-13 11:51:03
2 1519
今天完成的事情:
遇到的问题:
MyBatis配置文件详解
SqlMapConfig.xml文件中配置的内容
SqlMapConfig.xml文件中配置的内容和顺序如下图所示
上图标红的内容是本讲要重点讲解的东西
properties(属性)
在SqlMapConfig.xml配置文件中,我们可把数据库连接信息配置到properties标签当中,类似如下:
接下来就可以把以上配置信息添加到SqlMapConfig.xml配置文件中了。
这里没有导入自己输入地址和登录信息出错了
SqlMapConfig.xml文件像上面这样配置,虽然没问题,但是你不觉得这样很不爽吗?我们一般都是将数据库连接信息配置到一个属性文件中,然后再来引用其中的配置信息。按照这种指导思想,我们就要在classpath下创建一个属性文件了,例如jdbc.properties,既然该文件要在classpath下,所以可以在config源码目录下创建它。SqlMapConfig.xml文件引用该属性文件中的配置信息如下:
如此一来,SqlMapConfig.xml配置文件的内容就要修改成下面这个样子了。
注意:MyBatis将按照下面的顺序来加载属性:
在properties元素体内定义的属性首先被读取;
然后会读取properties元素中resource或url加载的属性,它会覆盖已读取的同名属性。
说得通俗一点就是:先加载property元素内部的属性,然后再加载jdbc.properties文件外部的属性,如果有同名属性则会覆盖。如若读者不信,则可以将properties元素内部jdbc.username属性的值故意写错,即故意将数据库连接的用户名给整错,就像上图所示的那样。结果发现仍然好使,这足以说明问题了。
将properties元素内部jdbc.username属性的值改错
结果依然正确,证明properties元素体内定义的属性首先被读取,然后被jdbc.properties的正确数据所覆盖
typeAliases(类型别名)
MyBatis支持别名
自定义别名
如果我们在SqlMapConfig.xml配置文件添加了如下配置信息:
那么就为User类定义了一个别名(别名就叫user)。这时,我们就可以在UserMapper.xml映射文件中使用这个别名了。
温馨提示:resultType属性的值就是User类的别名,且别名是不区分大小写的。
聪明的小伙伴们肯定发现如果像这样为每一个pojo定义一个别名,那不是傻逼吗!万一一个项目里面有很多pojo类呢?所以我们可以批量定义别名,就像下面这样。
TypeHandler配置分析
typeHandlers又叫类型处理器,就像在JDBC中,我们在PreparedStatement中设置预编译sql所需的参数或执行sql后根据结果集ResultSet对象获取得到的数据时,需要将数据库中的类型和java中字段的类型进行转换一样,在MyBatis中使用typeHandler来实现。所以说白了,typeHandlers就是用来完成javaType和jdbcType之间的转换。举个比较简单的例子,我创建一个博客表,表中的创建时间和修改时间用VARCHAR类型,但是在我的POJO对象中,创建时间和修改时间的类型是Date,这样我在向数据库插入数据时,需要将日期类型转化成VARCHAR,而从数据库中查询出的结果中,又需要将VARCHAR类型转换成Date.在MyBatis中,使用typeHandlers配置来实现这个转换过程。和别名一样,MyBatis中的类型处理器也存在系统定义的和自定义两种,MyBatis会根据javaType和jdbcType来决定采用哪个typeHandler来处理这些转换规则,而且系统定义的能满足大部分需求,可以说是非常好用,用户只需要自定义一些特有的转换规则,如枚举类型。下面分别介绍这两种typeHandler。
编写一个将JDBC的timestamp类型与Date类型相互转换的类型处理器配置实例。
创建DateTypeHandler
import java.sql.*;
//import 语句中的星号(*)只能代表类,不能代表包,表明导入 sql 包下的所有类。
import java.text.SimpleDateFormat;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.TypeHandler;
public class DateTypeHandler implements TypeHandler<Date> {
//转换日期类型的辅助类
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@Override
public void setParameter(PreparedStatement ps, int i, Date parameter, JdbcType jdbcType) throws SQLException {
//指定传入的Java参数对应JDBC中的数据库类型
System.out.println("其他逻辑");
ps.setDate(i,parameter);
System.out.println("其他逻辑");
}
@Override
public Date getResult(ResultSet rs, String columnName) throws SQLException {
System.out.println("其他逻辑");
return rs.getDate(columnName);
}
@Override
public Date getResult(ResultSet rs, int columnIndex) throws SQLException {
System.out.println("其他逻辑");
return rs.getDate(columnIndex);
}
@Override
public Date getResult(CallableStatement cs, int columnIndex) throws SQLException {
System.out.println("其他逻辑");
return cs.getDate(columnIndex);
}
}
写完这个@Override报错,按照百度的方法把5改成8
但是运行Java程序的时候出现
Error:java: Compilation failed: internal java compiler error
导入下面几个插件
(1)maven-compiler-plugin
(2)maven-resources-plugin
(3)maven-source-plugin
(4)maven-javadoc-plugin
正是因为我在pom中缺少了其中的“maven-compiler-plugin”插件,导致了“@Override is not allowed when implementing interface method”这个问题。
“maven-compiler-plugin”的作用?
查看它对应接口的源码
这里也定义了四个接口,一个set方法用来将javaType转为jdbcType,三个get方法用来将jdbcType转为javaType,而在BaseTypeHandler中实现的就是这四个方法。
所以当我们自定义自己的typeHandler时有两种方法:
第一种:继承BaseTypeHandler类
第二种:实现TypeHandler接口
这里我选择的是使用第二种实现TypeHandler接口
2.在MySQL表加上birthday
3.在User类加上birthday
4.在SqlMapConfig.xml文件中注册刚才自定义的DateTypeHandler
<!--类型处理器 -->
<typeHandlers>
<!-- 注册自定义handler,说明它作用的jdbcType和javaType -->
<typeHandler jdbcType="Date" javaType="date" handler="test.DateTypeHandler" />
</typeHandlers>
5.Mapper.xml文件中使用
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.daily.dao.BlogMapper">
<resultMap id="BaseResultMap" type="com.daily.pojo.Blog">
<id column="blog_id" jdbcType="INTEGER" property="blogId" />
<result column="blog_title" jdbcType="Date" property="blogTitle" />
<result column="blog_content" jdbcType="Date" property="blogContent" />
<!-- 不使用DateTypeHandler-->
<result column="create_time" jdbcType="Date" property="createTime" />
<!-- 使用DateTypeHandler-->
<result column="modify_time" typeHandler="test.DateTypeHandler" property="modifyTime" />
</resultMap>
<insert id="insert" parameterType="com.daily.pojo.Blog">
insert into blog (blog_id, blog_title, blog_content,
create_time, modify_time)
values (#{blogId,jdbcType=INTEGER}, #{blogTitle,jdbcType=Date},
#{blogContent,jdbcType=Date},
#{createTime,jdbcType=Date}, #{modifyTime,typeHandler=test.DateTypeHandler})
</insert>
</mapper>
6.结果
当去掉自定义的处理器时,MyBatis会根据结果自动选择合适的handler进行转换。
日常开发中,一般不需要定义,使用默认的就可以,除非是像枚举这种特殊类型就需要自己实现。
明天计划的事情:
根据官方mybatis文档创建JDBC的增删改查
收获:碰到了很多错误,解决很花费了时间。
评论