04.MyBatis别名的设置和类型转换器

Posted man-tou

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了04.MyBatis别名的设置和类型转换器相关的知识,希望对你有一定的参考价值。

别名的设置:(别名不区分大小写):

设置单个别名:

<configuration>
    <properties resource="db.properties" />
    <typeAliases>
        <!-- 设置单个别名 -->
        <typeAlias type="com.offcn.entity.Person" alias="person"/>
        <typeAlias type="com.offcn.entity.Book" alias="book"/>
    </typeAliases>

映射文件中直接写别名即可:

<select id="queryPersonById" parameterType="int" resultType="person">
    select * from person where id = #id
</select>

批量设置别名:

<typeAliases>
   <!-- 批量定义别名 ,别名不区分大小写,会将该包下的所有文件批量设置别名-->
    <package name="com.offcn.entity"/>
</typeAliases>

类型转换器:


1.MyBatis自带的类型转换器:

技术图片

2.自定义的类型转换器:

步骤:

a.创建转换器:需要实现TypeHandler接口,实现转换器有两种方式:

  i.实现接口TypeHandler

  ii.继承BaseTypeHander

创建converter转换器,代码如下:

package com.offcn.converter;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;

public class BooleanToIntConverter extends BaseTypeHandler<Boolean>
    //DB ---> java
    @Override
    //根据名字拿
    public Boolean getNullableResult(ResultSet rs, String columnName) throws SQLException 
        // TODO Auto-generated method stub
        int sexNo = rs.getInt(columnName);
        return sexNo == 1?true:false;
    
    //根据下标拿
    @Override
    public Boolean getNullableResult(ResultSet rs, int columnIndex) throws SQLException 
        // TODO Auto-generated method stub
        int sexNo = rs.getInt(columnIndex);
        return sexNo == 1?true:false;
    
    //根据存储过程拿
    @Override
    public Boolean getNullableResult(CallableStatement cs, int columnIndex) throws SQLException 
        // TODO Auto-generated method stub
        int sexNo = cs.getInt(columnIndex);
        return sexNo == 1?true:false;
    
    //java ---> DB
    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, Boolean parameter, JdbcType jdbc) throws SQLException 
        // TODO Auto-generated method stub
        if(parameter) 
            ps.setInt(i, 1);
        else 
            ps.setInt(i, 0);
        
    

在conf.xml文件中配置类型转换器:

<typeHandlers>
        <typeHandler handler="com.offcn.converter.BooleanToIntConverter" javaType="Boolean" jdbcType="INTEGER"/>
</typeHandlers>

映射文件中查找的sql:(DB ---> JAVA)

<!-- 带类型转换器的查询 -->
   <select id="queryPersonByIdWithConverter" parameterType="int" resultMap="personResult">
    select * from person where id = #id
  </select>
  <resultMap type="person" id="personResult">
      <!-- 分为主键和非主键,主键用id,非主键用result -->
      <id property="id" column="id"/>
      <result property="name" column="name"/>
      <result property="bir" column="bir"/>
      <result property="address" column="address"/>
      <result property="sex" column="sex" javaType="Boolean" jdbcType="INTEGER" />
  </resultMap>

接口中定义对应的方法:

Person queryPersonByIdWithConverter(int id);

测试类进行测试:

public static void queryPersonByIdWithConverter() throws IOException 
        //读取conf.xml文件
        Reader reader = Resources.getResourceAsReader("conf.xml");
        //创建sqlSessionFactory
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
        //获取sqlSession
        SqlSession session = sessionFactory.openSession();
        //通过session定位映射文件
        personMapper personMapper = session.getMapper(personMapper.class);
        //定位sql语句并执行
        Person person = personMapper.queryPersonByIdWithConverter(4);
        //提交事务
        session.commit();
        System.out.println(person);
        //关闭连接
        session.close();
    

映射文件中增加的sql:(JAVA --> DB)

<!-- 带类型转转器的增加 -->
  <insert id="insertPersonWithConverter" parameterType="person" >
      insert into person (name,bir,address,sex) value (#name,#bir,#address,#sex,javaType=Boolean,jdbcType=INTEGER)
  </insert>

接口中定义对应的方法:

测试类进行测试:

//带转换器的增加操作
    public static void insertPersonWithConverter() throws IOException 
        //读取conf.xml文件
        Reader reader = Resources.getResourceAsReader("conf.xml");
        //获取sqlSessionFactory
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
        //获取sqlSession
        SqlSession session = sessionFactory.openSession();
        //定位映射文件的位置
        personMapper personMapper = session.getMapper(personMapper.class);
        //定位sql并执行
        Person person = new Person("小孙",new Date(),"青岛",true);
        personMapper.insertPersonWithConverter(person);
        //提交事务
        session.commit();
        System.out.println("增加成功");
        //关闭连接
        session.close();
    

最后关于:sql标签中什么时候用resultType什么时候用resultMap

1.如果表中字段和实体类中的属性的类型合理识别,则用resultType,否则用resultMap

2.如果表中字段的名字和实体类中属性名能够合理识别,则用resultType,否则用resultMap

 

以上是关于04.MyBatis别名的设置和类型转换器的主要内容,如果未能解决你的问题,请参考以下文章

sh 这些是基于Linux的别名,我用它们在后台将不同类型的视频文件批量转换为mp4。

Mybatis 源码学习(10)-类型转换(TypeAliasRegistry)

Mybatis 源码学习(10)-类型转换(TypeAliasRegistry)

数据库中转换数据类型的几种方法

sql字符串转换成日期

Scala中函数类型的类型别名[关闭]