优化&& 类型处理器

优化:
1.可以将配置信息单独放入db.properties文件,然后再动态引入

driver=oracle.jdbc.OracleDriver
url=jdbc:oracle:thin:@127.0.0.1:1521:mldn
username=scott
password=tiger

db.properties:
k=v;
<configuration>

<properties resource="db.properties"/>

引入之后,使用${key}

<property name="driver" value="${driver}"></property>
<property name="url" value="${url}"></property> <property name="username" value="${username}"></property> <property name="password" value="${password}"></property>

2.MyBaties全局参数
<!-- 一般不设置MyBaties全局参数
<settings>
<setting name="" value=""/>
</settings> -->

3.别名
a.设置单个别名
b.批量设置别名

<!--设置单个/多个别名 -->
<typeAliases>
<!--单个别名(别名忽略大小写) -->
<!-- <typeAlias type="org.myy.entity.Student" alias="student"/> -->
<!--批量定义别名(别名忽略大小写) 以下会自动将该包中的所有类批量定义别名 :别名就是类名(不带包名,忽略大小写) -->
<package name="org.myy.entity"/>
</typeAliases>

除了自定义别名外,MyBaties还内置了一些常见类的别名


类型处理器(类型转换器)
1.MyBatis自带一些常见的类型处理器
int-number

2.自定义MyBatis类型处理器
java-数据库(jdbc类型)
示例:
实体类Student:boolean stuSex
true:男
false:女
表student:number stuSex
1:男
0:女
自定义类型转换器(boolean-number)步骤
a.创建类型转换器:需要实现TypeHandler接口

通过阅读源码发现,此接口有一个实现类BaseTypeHandler,因此要实现转换器有2种选择:
i.实现接口TypeHandler
ii.继承BaseTypeHandler

/MyBatisProject3/src/org/myy/converter/BooleanAndIntConverter.java

package org.myy.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;

//BaseTypeHandler<java类型>
public class BooleanAndIntConverter extends BaseTypeHandler<Boolean>{

    //java(boolean)->DB(number)
    /*
     * ps:PreparedStatement对象
     * i:PreparedStatement对象操作参数的位置
     * parameter:java值
     * jdbcType:jdbc操作的数据库类型
     * 2:true 1:false
     * */
    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, Boolean parameter, JdbcType jdbcType)
            throws SQLException {
        if(parameter) {
            //2
            ps.setInt(i, 2);
        }else {
            //1
            ps.setInt(i, 1);
        }
        
    }
    //DB(number)->java(boolean)
    @Override
    public Boolean getNullableResult(ResultSet rs, String columnName) throws SQLException {
        int sexNum=rs.getInt(columnName);
//        if(sexNum==1) return true;
//        else  return false;
        return sexNum==2?true:false;
    }

    @Override
    public Boolean getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        int sexNum=rs.getInt(columnIndex);
        return sexNum==2?true:false;
    }

    @Override
    public Boolean getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        int sexNum=cs.getInt(columnIndex);
        return sexNum==2?true:false;
    }


}

b.配置conf.xml

/MyBatisProject3/src/conf.xml

<typeHandlers>
    <typeHandler handler="org.myy.converter.BooleanAndIntConverter" javaType="Boolean" jdbcType="INTEGER"/>
</typeHandlers>

/MyBatisProject3/src/org/myy/mapper/studentMapper.xml

<select id="queryStudentByStunoWithConverter" parameterType="int" resultMap="studentResult">
            select * from student1 where stuno=#{stuno}
    </select>
    <resultMap type="student" id="studentResult">
        <!-- 分为主键id和非主键result -->
        <id property="id" column="stuno"/>
        <result property="stuName" column="stuname"/>
        <result property="stuAge" column="stuage"/>
        <result property="graName" column="graname"/>
        <result property="stuSex" column="stusex" javaType="boolean" jdbcType="INTEGER"/>
    </resultMap>
    <insert id="addStudentWithConverter" parameterType="student">
        insert into student1(stuno,stuname,stuage,graname,stusex) values(#{id},#{stuName},#{stuAge},#{graName},#{stuSex,javaType=boolean,jdbcType=INTEGER})
    </insert>

需要的注意的问题:INTEGER

insert into student1(stuno,stuname,stuage,graname,stusex) values(#{stuNo},#{stuName},#{stuAge},#{graName},#{stuSex,javaType=boolean,jdbcType=INTEGER})
注意#{stuNo}中存放的是属性值,需要严格区分大小写

resultMap可以实现2个功能
1.类型转换
2.属性-字段的映射关系

原文地址:https://www.cnblogs.com/mayouyou/p/13213843.html