Mybatis---04Mybatis配置文件浅析(二)
本文参考: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配置文件浅析(二)的更多相关文章
- Mybatis配置信息浅析 MyBatis简介(二)
官方文档入门篇中有明确说明 每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为中心的. SqlSessionFactory 的实例可以通过 SqlSessionF ...
- MyBatis学习总结(二)——MyBatis核心配置文件与输入输出映射
在上一章中我们学习了<MyBatis学习总结(一)——ORM概要与MyBatis快速起步>,这一章主要是介绍MyBatis核心配置文件.使用接口+XML实现完整数据访问.输入参数映射与输出 ...
- MyBatis 实用篇(二)配置文件
MyBatis 实用篇(二)配置文件 一.全局配置 全局配置:http://www.mybatis.org/mybatis-3/zh/configuration.html <?xml versi ...
- mybatis源码-解析配置文件(二)之解析的流程
目录 1. 简介 2. 配置文件解析流程分析 2.1 调用 2.2 解析的目的 2.3 XML 解析流程 2.3.1 build(parser) 2.3.2 new XMLConfigBuilder( ...
- mybatis 详解(二)------入门实例(基于XML)
通过上一小节,mybatis 和 jdbc 的区别:http://www.cnblogs.com/ysocean/p/7271600.html,我们对 mybatis有了一个大致的了解,下面我们通过一 ...
- Mybatis主配置文件常见使用讲解
在开发中我们通常将Mybatis中配置文件分两种,主配置文件与和dao对应的映射文件. 其实最后mybatis解析的还是一个主配置文件. 而映射文件会通过我们配置<mappers>属性,或 ...
- 详解mybatis映射配置文件
一 mybatis 映射文件结构 mybatis映射配置文件存在如下顶级元素,且这些元素按照如下顺序被定义. cache – 给定命名空间的缓存配置. cache-ref – 其他命名空间缓存配置的 ...
- Mybatis学习笔记之二(动态mapper开发和spring-mybatis整合)
一.输入映射和输出映射 1.1 parameterType(输入类型) [传递简单类型] 详情参考Mybatis学习笔记之一(环境搭建和入门案例介绍) 使用#{}占位符,或者${}进行sql拼接. [ ...
- 用IntelliJ IDEA 开发Spring+SpringMVC+Mybatis框架 分步搭建二:配置MyBatis 并测试(2 配置spring-dao和测试)
用IntelliJ IDEA 开发Spring+SpringMVC+Mybatis框架 分步搭建二:配置MyBatis 并测试(1 搭建目录环境和依赖) 四:在\resources\spring 下面 ...
- Springboot & Mybatis 构建restful 服务二
Springboot & Mybatis 构建restful 服务二 1 前置条件 成功执行完Springboot & Mybatis 构建restful 服务一 2 restful ...
随机推荐
- 《Duubo系列》-Dubbo服务暴露过程
我今天来就带大家看看 Dubbo 服务暴露过程,这个过程在 Dubbo 中其实是很核心的过程之一,关乎到你的 Provider 如何能被 Consumer 得知并调用. 今天还是会进行源码解析,毕竟我 ...
- 实用向—总结一些唯一ID生成方式
在日常的项目开发中,我们经常会遇到需要生成唯一ID的业务场景,不同的业务对唯一ID的生成方式与要求都会不尽相同,一是生成方式多种多样,如UUID.雪花算法.数据库递增等:其次业务要求上也各有不同,有的 ...
- Redis 4.0.2安装与卸载
安装 使用root用户安装: 1.wget http://download.redis.io/releases/redis-4.0.2.tar.gz 2.tar -zxvf redis-4.0.2.t ...
- sort函数居然能改变元素值?记一次有趣的Bug——四数之和
坐标leetcode: 我想都不想直接深度优先搜索暴力求解: class Solution { public: vector<vector<int>> res; //答案 in ...
- Win7 64X 安装VisualSVNServer 2.6.0过程中出现Custom action InstallWMISchemaExcute failed: Cannot query proxy blanket: No such interface supported (0x80004002)
Win7 64X 安装VisualSVNServer 2.6.0过程中出现错误:Custom action InstallWMISchemaExcute failed: Cannot query pr ...
- Matlab中image、imagesc和imshow函数用法解析
来源:https://blog.csdn.net/zhuiyuanzhongjia/article/details/79621813 1.显示RGB图像 相同点:这三个函数都是把m*n*3的矩阵中的数 ...
- HTML & CSS & JavaScript 从一个表格到一个灰阶颜色表 02
工具1:HBuilder X 1.9.9.20190522 工具2:火狐浏览器 67.0.4 (64 位) 其实,我想使用表格,做一个这样的颜色表,如下图所示: 例 3:我们参照上图,基于上一个例子, ...
- # BlackLivesMatter !
下载 # BlackLivesMatter ! https://blacklivesmatter.com/ 黑人的生命是重要的运动资源 VueCroppie VueCroppie是一个Vue 2包装C ...
- Docker笔记2:Docker 镜像仓库
Docker 镜像的官方仓库位于国外服务器上,在国内下载时比较慢,但是可以使用国内镜像市场的加速器(比如阿里云加速器)以提高拉取速度. Docker 官方的镜像市场,可以和 Gitlab 或 GitH ...
- 一个故事看懂AI神经网络工作原理
我是一个AI神经元 我是一个AI神经元,刚刚来到这个世界上,一切对我来说都特别新奇. 之所以叫这个名字,是因为我的工作有点像人类身体中的神经元. 人体中的神经元可以传递生物信号,给它输入一个信号,它经 ...