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

posted @ 2020-06-12 18:45  Jenne  阅读(185)  评论(0)    收藏  举报