• (三)Mybatis类型转换器,接口传参类型,一对一,一对多查询resultMap配置


    Mybatis类型转换器

    首先明白什么时候用到它,当数据库的字段类型和java字段类型无法默认匹配时候进行转换,比如现在数据库类型是INTEGER,而java当中类型是Boolean,true表示1,false表示0,这时候你在执行sql语句插入或者查询获取结果集时,类型就会出现不匹配的情况,这时候我们只需要书写一个类型转换器,并进行配置,之后java遇到INTEGER---Boolean两个类型的时候,就会帮我们自动转换,相当于你插入数据库的值传的是true,他就会转换成1然后插入,数据库返回的结果为1,就会转换成true然后返回给你。具体如下:

    BooleanAndIntConvert.java

    package convert;
    
    import org.apache.ibatis.type.BaseTypeHandler;
    import org.apache.ibatis.type.JdbcType;
    
    import java.sql.CallableStatement;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    
    //类型转换器
    public class BooleanAndIntConvert extends BaseTypeHandler<Boolean> {
        public  void setNonNullParameter(PreparedStatement var1, int var2, Boolean var3, JdbcType var4) throws SQLException{
            if(var3){ //boolean转成int,true则插入到数据库时插入1,反之插入0
                var1.setInt(var2,1);
            }else{
                var1.setInt(var2,0);
            }
        }
        //根据列名获取值
        public  Boolean getNullableResult(ResultSet var1, String var2) throws SQLException{
            int sexNum = var1.getInt(var2);
            if(sexNum == 1)    //从数据库当中获取的值为1时,返回true,反之为false
                return true;
            return false;
        }
        //根据下标获取值
        public Boolean getNullableResult(ResultSet var1, int var2)throws SQLException{
            int sexNum = var1.getInt(var2);
            if(sexNum == 1)
                return true;
            return false;
        }
        //通过存储过程获取
        public Boolean getNullableResult(CallableStatement var1, int var2)throws SQLException{
            int sexNum = var1.getInt(var2);
            if(sexNum == 1)
                return true;
            return false;
        }
    }

    具体逻辑还是比较容易理解的,get,set方法就是当类型不匹配时进行调用,自己书写代码进行匹配

    之后再config.xml文件之中进行配置,javaType表示java当中类型,jdbcType表示jdbc之中的,注意下类型名不要写错了,jdbcType枚举类型查一下都有哪些用的时候

    <typeHandlers>
    <!--        类型转换器的配置-->
            <typeHandler handler="convert.BooleanAndIntConvert" javaType="Boolean" jdbcType="INTEGER"/>
        </typeHandlers>

    至此,就完成了,然后书写代码查询名字为  哈哈  的person,

    List<Person> persons = personMapping.selectPersonByName("哈哈哈");

    输出如下,可以看到虽然数据库存的是0,但是我们获取到的却是false,这就类型转换器帮我们自动转换了。

    "C:Program FilesJavajdk-11.0.1injava.exe" "-javaagent:C:Program FilesJetBrainsIntelliJ IDEA 2019.1.3libidea_rt.jar=56514:C:Program FilesJetBrainsIntelliJ IDEA 2019.1.3in" -Dfile.encoding=UTF-8 -classpath C:learnjavamybatisoutproductionmybatis;C:迅雷下载mybatis-3.5.2mybatis-3.5.2mybatis-3.5.2.jar;C:迅雷下载mysql-connector-java-8.0.16.jar entity.test
    id:6
    姓名:哈哈哈
    爱好:跳舞
    性别:false
    id:7
    姓名:哈哈哈
    爱好:跳舞
    性别:false
    
    Process finished with exit code 0

    接口方法传参类型:

    首先区分两种传参的方法:

    #{name} :如果传入字符串,会自动加上单引号;可防止sql注入

    ${name}:传入字符串不加单引号,多用于排序查询,或者一些需要拼接的参数,

    在书写mapper文件之中的sql语句时,传参可以传入一个变量,一个对象,一个HashMap对象,前两种没什么说的,看下第三种

    mapper文件当中,看到paramType="HashMap",之后sql语句里面直接写变量名就行

    <!--    map传值-->
        <select id="selectPersonByNameAndSex" parameterType="HashMap" resultType="person">
            select * from person where `name` = #{name} or `sex` =#{sex}
        </select>

    接口文件之中方法声明:

    List<Person> selectPersonByNameAndSex(Map<String,Object> map);

    具体使用时候,初始一个map对象,然后调用映射方法并传入,注意变量名要一致: 

    Map<String, Object> personMap = new HashMap<>();
    personMap.put("name","温鸿飞");   //设置变量的值和名字
    personMap.put("sex", "false");
    List<Person> persons = personMapping.selectPersonByNameAndSex(personMap)

    ,一对一,一对多resultMap配置

    现在有三张表,person,adress,class,person和adress是一对一关系,person和class是多对一关系

    一对一:根据id查询该person以及他的adress信息

        <select id="selectOneById" resultMap="person_adress_map" parameterType="int">
            select p.*,a.* from person p
            inner join adress a
            on p.id = #{id} and p.adressid=a.id
        </select>
        <resultMap id="person_adress_map" type="person">
            <id column="id" property="id"/>
            <result property="name" column="name"/>
            <result property="loves" column="loves"/>
            <result property="sex" column="sex"/>
            <result property="adressId" column="adressid"/>
            <association property="adress" javaType="Adress">  <!--地址的映射-->
                <id column="id" property="id"/>
                <result property="place" column="place"/>
                <result property="number" column="number"/>
            </association>
        </resultMap>

    property是类中的属性名称,column是数据库当中表的字段名

    association标签之中对Person类当中的Adress进行映射

    一对多关系:根据传入的班级id查询该班级以及该班级所有学生的信息

        <!-- 一对多关系 -->
        <select id="selectPersonByClassId" resultMap="class_person_map" parameterType="int">
            select c.*,p.* from person p
            inner join class c
            on p.classid=c.classid
            where c.classid=#{classid}
        </select>
        <resultMap id="class_person_map" type="class">
            <id column="classId" property="classId"/>
            <result property="number" column="number"/>
            <collection property="persons" ofType="person">
                <id property="id" column="id"/>
                <result property="name" column="name"/>
                <result property="loves" column="loves"/>
                <result property="sex" column="sex"/>
                <result property="classId" column="classId"/>
            </collection>
        </resultMap>

    一对多使用collection标签,注意名称一定要写正确就行了

     
  • 相关阅读:
    javaweb学习2
    javaweb学习1
    Java学习17
    python 正则表达式
    python 常用库
    python 常用内置函数
    python 函数高级功能
    python 正则表达式findall
    tcpdump
    安卓软件学习进度_1
  • 原文地址:https://www.cnblogs.com/eenio/p/11317687.html
Copyright © 2020-2023  润新知