本文参考:https://www.cnblogs.com/yulinfeng/p/5991170.html

1.typeHandlers:类型处理器,设置预处理语句(PreparedStatement)中的参数或从结果集中取出一个值时,将获取到的值以合适的方式转换成 Java 类型;4;官网给出了很多的默认类型处理,点我去看

  1)举个例子:假设数据库表我设计一个字段为date,类型为varchar,这个字段我要存储时间,但是我的对应的数据库表实体类中date属性 的类型Date类型;一般的思路是把属性date获取时间后,转变为String类型,这样后再插入数据库表中;Mybatis给我们提供了更好的方法【typeHandlers】来解决这个问题

  2)操作:

    A:创建一个数据库表testth,

         

    B:创建实体类

public class TestTH {
private int id;
private Date date; public TestTH() {
} public TestTH(int id, Date date) {
this.id = id;
this.date = date;
} public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public Date getDate() {
return date;
} public void setDate(Date date) {
this.date = date;
} @Override
public String toString() {
return "TestTH{" +
"id=" + id +
", date=" + date +
'}';
}
}

    C:【***】重写已有的类型处理器或创建你自己的类型处理器来处理不支持的或非标准的类型,具体做法为:实现 org.apache.ibatis.type.TypeHandler 接口, 或继承一个很便利的类 org.apache.ibatis.type.BaseTypeHandler,这里我们使用继承org.apache.ibatis.type.BaseTypeHandler类,创建自己的类型处理类MyHandler

public class MyHandler extends BaseTypeHandler<Date> {

    /**
* 设置非空参数
*
* @param preparedStatement
* @param i
* @param date
* @param jdbcType
* @throws SQLException
*/
@Override
public void setNonNullParameter(PreparedStatement preparedStatement, int i, Date date, JdbcType jdbcType) throws SQLException {
preparedStatement.setString(i,String.valueOf(date.getTime()));
} /**
* 根据列名,获取可以为空的结果
*
* @param resultSet
* @param s
* @return
* @throws SQLException
*/
@Override
public Date getNullableResult(ResultSet resultSet, String s) throws SQLException {
String date = resultSet.getString(s);
if (null != date) {
return new Date(Long.parseLong(date));
}
return null;
} /**
* 根据列索引,获取可以为空的结果
*
* @param resultSet
* @param i
* @return
* @throws SQLException
*/
@Override
public Date getNullableResult(ResultSet resultSet, int i) throws SQLException {
String date = resultSet.getString(i);
if (null != date) {
return new Date(Long.parseLong(date));
}
return null;
} /**
* 存储过程,
*
* @param callableStatement
* @param i
* @return
* @throws SQLException
*/
@Override
public Date getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
String date = callableStatement.getString(i);
if (null != date) {
return new Date(Long.parseLong(date));
}
return null;
}
}

    D:写好自定义类型处理类后,我们在mybatis配置文件mybatis-config.xml中去注册这个类

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<properties>
<property name="jdbc.driver" value="com.mysql.jdbc.Driver"/>
<property name="jdbc.url" value="jdbc:mysql://localhost:3306/mybook?characterEncoding=UTF-8"/>
<property name="jdbc.username" value="root"/>
<property name="jdbc.password" value="root"/>
</properties> <typeHandlers>
<!--
handler:填写自定义类型处理类的全限定类名
javaType:实体类中需要处理的类型
jdbcType:数据库中需要处理的类型
-->
<typeHandler handler="com.james.mybatis.handler.MyHandler" javaType="java.util.Date" jdbcType="VARCHAR" />
</typeHandlers> <environments default="test">
<environment id="test">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments> <!--告知持久层接口的映射文件在哪里-->
<mappers>
<mapper resource="com/james/mybatis/dao/ITestTHDao.xml"/>
</mappers>
</configuration>

    E:写与数据库交互Dao层的ITestTHDao接口跟数据库映射文件ITestTHDao.xml

public interface ITestTHDao {

    /**
* 插入数据
* @param testTH
*/
void insertTest(TestTH testTH); /**
* 根据id查询数据
* @param id
* @return
*/
TestTH selectById(int id);
}
<?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.james.mybatis.dao.ITestTHDao">
<select id="selectById" resultType="com.james.mybatis.domain.TestTH" parameterType="int">
select * from testth where id = #{id}
</select>
<insert id="insertTest" parameterType="com.james.mybatis.domain.TestTH">
insert into testth (id, date) values(#{id}, #{date,typeHandler=com.james.mybatis.handler.MyHandler})
</insert>
</mapper>

    F:测试:

public class Main {
public static void main(String[] args) throws IOException {
//1.读取配置文件
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
//2.创建 SqlSessionFactory 的构建者对象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//3.使用构建者创建工厂对象 SqlSessionFactory
SqlSessionFactory factory = builder.build(in);
//4.使用 SqlSessionFactory 生产 SqlSession 对象
SqlSession session = factory.openSession();
//5.使用 SqlSession 创建 dao 接口的代理对象
ITestTHDao testTHDao = session.getMapper(ITestTHDao.class);
//6.使用代理对象执行方法
/*
TestTH testTH = new TestTH(1, new Date());
testTHDao.insertTest(testTH);
session.commit();
*/
TestTH testTH = testTHDao.selectById(1);
System.out.println(testTH);
//7.释放资源
session.close();
in.close();
}
}

    补充:在D操作中,要设置javaType实体类中需要处理的类型,jdbcType:数据库中需要处理的类型;可以设置自定义类型处理类中使用注解@MappedJdbcTypes设置数据库中的类型,使用@MappedTypes 注解指定与其关联的 Java 类型列表;其余操作都一样;不过当你使用parameterMap设置时,要把注解@MappedJdbcTypes中的属性includeNullJdbcType=true

Mybatis---04Mybatis配置文件浅析(二)的更多相关文章

  1. Mybatis配置信息浅析 MyBatis简介(二)

    官方文档入门篇中有明确说明 每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为中心的. SqlSessionFactory 的实例可以通过 SqlSessionF ...

  2. MyBatis学习总结(二)——MyBatis核心配置文件与输入输出映射

    在上一章中我们学习了<MyBatis学习总结(一)——ORM概要与MyBatis快速起步>,这一章主要是介绍MyBatis核心配置文件.使用接口+XML实现完整数据访问.输入参数映射与输出 ...

  3. MyBatis 实用篇(二)配置文件

    MyBatis 实用篇(二)配置文件 一.全局配置 全局配置:http://www.mybatis.org/mybatis-3/zh/configuration.html <?xml versi ...

  4. mybatis源码-解析配置文件(二)之解析的流程

    目录 1. 简介 2. 配置文件解析流程分析 2.1 调用 2.2 解析的目的 2.3 XML 解析流程 2.3.1 build(parser) 2.3.2 new XMLConfigBuilder( ...

  5. mybatis 详解(二)------入门实例(基于XML)

    通过上一小节,mybatis 和 jdbc 的区别:http://www.cnblogs.com/ysocean/p/7271600.html,我们对 mybatis有了一个大致的了解,下面我们通过一 ...

  6. Mybatis主配置文件常见使用讲解

    在开发中我们通常将Mybatis中配置文件分两种,主配置文件与和dao对应的映射文件. 其实最后mybatis解析的还是一个主配置文件. 而映射文件会通过我们配置<mappers>属性,或 ...

  7. 详解mybatis映射配置文件

    一  mybatis 映射文件结构 mybatis映射配置文件存在如下顶级元素,且这些元素按照如下顺序被定义. cache – 给定命名空间的缓存配置. cache-ref – 其他命名空间缓存配置的 ...

  8. Mybatis学习笔记之二(动态mapper开发和spring-mybatis整合)

    一.输入映射和输出映射 1.1 parameterType(输入类型) [传递简单类型] 详情参考Mybatis学习笔记之一(环境搭建和入门案例介绍) 使用#{}占位符,或者${}进行sql拼接. [ ...

  9. 用IntelliJ IDEA 开发Spring+SpringMVC+Mybatis框架 分步搭建二:配置MyBatis 并测试(2 配置spring-dao和测试)

    用IntelliJ IDEA 开发Spring+SpringMVC+Mybatis框架 分步搭建二:配置MyBatis 并测试(1 搭建目录环境和依赖) 四:在\resources\spring 下面 ...

  10. Springboot & Mybatis 构建restful 服务二

    Springboot & Mybatis 构建restful 服务二 1 前置条件 成功执行完Springboot & Mybatis 构建restful 服务一 2 restful ...

随机推荐

  1. 刷题[MRCTF2020]Ezpop

    解题思路 打开一看直接是代码审计的题,就嗯审.最近可能都在搞反序列化,先把反序列化的题刷烂,理解理解 代码审计 Welcome to index.php <?php //flag is in f ...

  2. jwt攻击手段

    jwt 秘钥泄漏/敏感文件泄漏 在一些配置文件被我们可查的情况下,包括各种文件读取,源码泄漏,此时伪造身份就变得很容易了. 空加密算法 对于明文的加密算法通常为HS256,在jwt中分为三个部分,以点 ...

  3. python一些小trick

    数据去重 lst = ['1','2','3','3'] lst = list(set(lst)) 不同根目录下引用另一个库 例如 |--a--a.py |--b--b.py 在b.py中调用库a.p ...

  4. @RequestParam,@RequestBody,@ResponseBody,@PathVariable注解的一点小总结

    一.前提知识: http协议规定一次请求对应一次响应,根据不同的请求方式,请求的内容会有所不同: 发送GET请求是没有请求体的,参数会直接拼接保留到url后一并发送: 而POST请求是带有请求体的,带 ...

  5. Java并发编程之ReentrantLock源码分析

    ReentrantLock介绍 从JDK1.5之前,我们都是使用synchronized关键字来对代码块加锁,在JDK1.5引入了ReentrantLock锁.synchronized关键字性能比Re ...

  6. 18-SE-你说的都队

    文章目录 前言 建设银行app分析 招商银行app分析 中国银行app分析 工商银行app分析 总结 团队成员分工与评分 前言 18-SE-你说的都队所选项目题目为"村镇银行储蓄业务系统开发 ...

  7. 在KEIL下查看单片机编程内存使用情况

    原文链接:https://blog.csdn.net/D_azzle/article/details/83410141 截至到目前为止,本人接触单片机也有将近一年的时间.这一年以来也接触过了很具代表性 ...

  8. Linux学习笔记-vi(一)

    vim编辑命令 vim命令的三种模式: 1.命令模式: vi file.txt  进入vi模式,默认为命令模式,命令模式移动光标. 2.插入模式 i (insert):在光标前插入内容 a(appen ...

  9. Azure内容审查器之羞羞图审查

    上一篇 Azure 内容审查器之文本审查我们已经介绍了如果使用Azure进行文字内容的审核.对于社区内容,上传的图片是否含有羞羞内容也是需要过虑的.但是最为一般开发者自己很难实现这种级别的智能识别.但 ...

  10. Croppie -一个Javascript图像Croppie

    下载 Croppie -一个Javascript图像CroppieCroppie -一个Javascript图像Croppie 安装 凉棚:凉棚安装作物 Npm: Npm安装作物 下载: croppi ...