04.MyBatis別名的設置和類型轉換器

別名的設置:(別名不區分大小寫):java

設置單個別名:sql

<configuration>
    <properties resource="db.properties" />
    <typeAliases>
        <!-- 設置單個別名 -->
        <typeAlias type="com.offcn.entity.Person" alias="person"/>
        <typeAlias type="com.offcn.entity.Book" alias="book"/>
    </typeAliases>

映射文件中直接寫別名便可:apache

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

批量設置別名:session

<typeAliases>
   <!-- 批量定義別名 ,別名不區分大小寫,會將該包下的全部文件批量設置別名-->
    <package name="com.offcn.entity"/>
</typeAliases>

類型轉換器:app


1.MyBatis自帶的類型轉換器:ide

2.自定義的類型轉換器:測試

步驟:ui

a.建立轉換器:須要實現TypeHandler接口,實現轉換器有兩種方式:spa

  i.實現接口TypeHandlercode

  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

相關文章
相關標籤/搜索