zoukankan      html  css  js  c++  java
  • 优化&& 类型处理器

    优化:
    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.属性-字段的映射关系

  • 相关阅读:
    Linux-C基础知识学习:C语言作业-将5个学生成绩保存在一个数组中,单独实现一个计算平均成绩的average函数, 在main函数中获取该函数返回的平均值,并打印。
    Linux-C基础知识学习:C语言作业-输入两个数,将两个数交换,按升序输出。
    C语言学习:结构体(笔记)--未完待续
    C语言学习:结构体(笔记)
    PHP之函数
    PHP之流程控制
    PHP之常量和变量
    PHP之数据类型
    PHP之标记风格和注释
    VMware虚拟机中各类文件作用详解
  • 原文地址:https://www.cnblogs.com/mayouyou/p/13213843.html
Copyright © 2011-2022 走看看