zoukankan      html  css  js  c++  java
  • mybatistypehandler

    【转载】当 MyBatis 将一个 Java 对象作为输入参数执行 INSERT 语句操作时,它会创建一个 PreparedStatement 对象,并且 
    使用 setXXX()方式对占位符设置相应的参数值。这里,XXX 可以是 Int,String,Date 等 Java 对象属性类型的任意一个。

    INSERT INTO STUDENT(ID,NAME,EMAIL)
    VALUES(#{id},#{name},#{email})
    
    

    为了执行上面的语句,mybatis会使用PreparedStatement接口,创建如下的语句

    PreparedStatement pstmt = connection.prepareStatement
    ("INSERT INTO STUDENT(ID,NAME,EMAIL) VALUES(?,?,?)");
    

    之后再通过pstmt.setString()的方法为该对象赋值

    pstmt.setInt(1,student.getId());
    pstmt.setString(2,student.getName());
    .....
    

    但 MyBatis 是怎么知道对于 Integer 类型属性使用 setInt() 和 String 类型属性使用 setString()方法呢? 
    其实 MyBatis 是通过使用类型处理器(type handlers)来决定这么做的。 
    给出一个自定义的对象类型,来存储到数据库中,示例如下:

    package com.mybatis.entities;
    
    public class PhoneNumber {
    
        private String countryCode;
        private String stateCode;
        private String number;
    
        getter and setter
        ...
    }
    
    package com.mybatis.entities;
    
    public class User {
    
        private Integer id;
        private String name;
        private String email;
        private PhoneNumber phone;
    
        getter and setter
        ...
    }
    

    为PhoneNumber创建一个自定义的类型处理器

    public class PhoneTypehandler extends BaseTypeHandler{
    
        @Override
        public void setNonNullParameter(PreparedStatement ps, int i, PhoneNumber parameter, JdbcType jdbcType)
                throws SQLException {
            // TODO Auto-generated method stub
            ps.setString(i, parameter.getAsString());
        }
    
        @Override
        public PhoneNumber getNullableResult(ResultSet rs, String columnName) throws SQLException {
            // TODO Auto-generated method stub
            return new PhoneNumber(rs.getString(columnName));
        }
    
        @Override
        public PhoneNumber getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
            // TODO Auto-generated method stub
            return new PhoneNumber(rs.getString(columnIndex));
        }
    
        @Override
        public PhoneNumber getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
            // TODO Auto-generated method stub
            return new PhoneNumber(cs.getString(columnIndex));
        }
    
    }
    

    测试代码:

    public class UserService {
    
        @Test
        public void insertUser(){
            SqlSession session = MyBatisUtil.openSession();
            UserMapper userMapper = session.getMapper(UserMapper.class);
            User user = new User();
            user.setName("wangwu");
            user.setEmail("wangwu@email.com");
            PhoneNumber phone = new PhoneNumber();
            phone.setCountryCode("86");
            phone.setStateCode("1599");
            phone.setNumber("1234567");
            user.setPhone(phone);
            userMapper.insertUser(user);
            session.commit();
            session.close();
        }
    }
    

    需要在配置文件中加入:

        <typeHandlers>
            <typeHandler handler="com.mybatis.typehandlers.PhoneTypehandler"/>
        </typeHandlers>
    

    在配置文件中configuration中子元素配置顺序应该要符合下面的顺序,要不然会报错。 
    “configuration” 的内容必须匹配 “(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,plugins?,environments?,databaseIdProvider?,mappers?)”。 

  • 相关阅读:
    第二周学习总结
    2019春总结作业
    第十二周作业
    第十一周作业
    第九周作业
    第八周作业
    第七周作业
    第六周作业
    第五周课程总结与报告
    Java第四周编程总结
  • 原文地址:https://www.cnblogs.com/brxHqs/p/9305964.html
Copyright © 2011-2022 走看看