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

摘要:
--类型转换器的配置--˃至此,就完成了,然后书写代码查询名字为哈哈的person,Listpersons=personMapping.selectPersonByName;输出如下,可以看到虽然数据库存的是0,但是我们获取到的却是false,这就类型转换器帮我们自动转换了。

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, intvar2, Boolean var3, JdbcType var4) throws SQLException{
        if(var3){ //boolean转成int,true则插入到数据库时插入1,反之插入0
            var1.setInt(var2,1);
        }else{
            var1.setInt(var2,0);
        }
    }
    //根据列名获取值
    publicBoolean 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, intvar2)throws SQLException{
        int sexNum =var1.getInt(var2);
        if(sexNum == 1)
            return true;
        return false;
    }
    //通过存储过程获取
    public Boolean getNullableResult(CallableStatement var1, intvar2)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姓名:哈哈哈
爱好:跳舞
性别:falseid: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   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   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   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   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标签,注意名称一定要写正确就行了

免责声明:文章转载自《(三)Mybatis类型转换器,接口传参类型,一对一,一对多查询resultMap配置》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇ORA-01089 数据库无法正常关闭【盘古分词】Lucene.Net 盘古分词 实现公众号智能自动回复下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

MyBatis直接执行SQL查询及批量插入数据

一、直接执行SQL查询:  1、mappers文件节选 <resultMap id="AcModelResultMap" type="com.izumi.InstanceModel">  <result column="instanceid" property="instanceID" jdbcType="VARCHAR" /> ...

解决Intellij IDEA中Mybatis Mapper自动注入警告

问题描述: 首先说明自己出现上述原因是因为在mapper接口上方用的是@mapper标签,如果用@Repository标签替换可以解决这个问题 (idea可以理解Spring的上下文。然而 UserMapper 这个接口是Mybatis的,IDEA理解不了。 而 @Autowired 注解,默认情况下要求依赖对象(也就是 userMapper )必须存在...

基于Mybatis分页插件PageHelper

基于Mybatis分页插件PageHelper1.分页插件使用1、POM依赖 PageHelper的依赖如下。需要新的版本可以去maven上自行选择 <!-- PageHelper 插件分页 --><dependency>    <groupId>com.github.pagehelper</groupId>...

SpringMVC2

1       SpringMVC架构 1.1     Spring web mvc介绍 Spring web mvc和Struts2都属于表现层的框架,它是Spring框架的一部分,我们可以从Spring的整体结构中看得出来: 1.2     Web MVC mvc设计模式在b/s系统下应用: 1、  用户发起request请求至控制器(Contro...

Spring Boot(七):Mybatis 多数据源最简解决方案

说起多数据源,一般都来解决那些问题呢,主从模式或者业务比较复杂需要连接不同的分库来支持业务。我们遇到的情况是后者,网上找了很多,大都是根据 Jpa 来做多数据源解决方案,要不就是老的 Spring 多数据源解决方案,还有的是利用 Aop 动态切换,感觉有点小复杂,其实我只是想找一个简单的多数据支持而已,折腾了两个小时整理出来,供大家参考。 废话不多说直接上...

mybatis源码分析(3)-----SqlSessionHolder作用

1、 sqlSessionHolder 是位于mybatis-spring 包下面,他的作用是对于sqlSession和事务的控制 sqlSessionHolder 继承了spring的ResourceHolderSupport public abstract class ResourceHolderSupport implements Resource...