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,反之插入0var1.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,反之为falsereturn 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 Files\Java\jdk-11.0.1\bin\java.exe" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2019.1.3\lib\idea_rt.jar=56514:C:\Program Files\JetBrains\IntelliJ IDEA 2019.1.3\bin" -Dfile.encoding=UTF-8 -classpath C:\learn\java\mybatis\out\production\mybatis;C:\迅雷下载\mybatis-3.5.2\mybatis-3.5.2\mybatis-3.5.2.jar;C:\迅雷下载\mysql-connector-java-8.0.16.jar entity.test
id:6
姓名:哈哈哈
爱好:跳舞
性别:false
id:7
姓名:哈哈哈
爱好:跳舞
性别:falseProcess 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 pinner join adress aon 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 pinner join class con p.classid=c.classidwhere 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标签,注意名称一定要写正确就行了

 

转载于:https://www.cnblogs.com/eenio/p/11317687.html

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

  1. mybatis 多表查询 一对一 一对多查询

    本文举例: 1.订单信息表 2.订单详情表 3.发票表 三表关系: 订单信息表 订单信息详情表 1:n 订单信息表 发票表 1:1 需求: 查询订单表订单详情表和发票表所有信息: <!-- 订单 ...

  2. 04.MyBatis别名的设置和类型转换器

    别名的设置:(别名不区分大小写): 设置单个别名: <configuration><properties resource="db.properties" /&g ...

  3. Mybatis类型转换器使用

    1.mybatis类型转换器,就是Java类型与数据库的类型之间转换的一个中介,由这个转换器可以对类型进行映射,mybatis对于基础类型都有默认类型转换器,你可以自定义类型转换器替代默认的转换器,大 ...

  4. 通过mybatis自定义参数类型转换器,进行数据库字段加密脱敏

    1 问题背景 在数据库存储人员的信息时,有一些信息是敏感数据,如身份证号.出生地等.为了防止信息泄漏,这些信息不允许直接在数据库中查看,此时就需要对这些字段进行加密存储,但在页面查看的仍旧是解密后的数 ...

  5. SpringMVC-应用(数据绑定-自定义类型转换器,数据的格式化,数据校验)

    一.提出问题 SpringMVC封装自定义类型对象的时候,JavaBean要和页面提交的数据一一绑定.下面要知道: 1)页面提交的数据都是字符串 2)JavaBean中的属性如:Integer age ...

  6. Struts2自定义类型转换器、自定义拦截器和用户输入数据的验证

    一.自定义类型转换器 1.编写一个类,继承com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter 2.覆盖掉其中的public Obj ...

  7. wpf中xaml的类型转换器与标记扩展

    wpf中xaml的类型转换器与标记扩展 原文:wpf中xaml的类型转换器与标记扩展 这篇来讲wpf控件属性的类型转换器 类型转换器 类型转换器在asp.net控件中已经有使用过了,由于wpf的界面是 ...

  8. 1.0jpa 2.0_JPA 2.1类型转换器–持久枚举的更好方法

    1.0jpa 2.0 可以使用JPA 2.0保留枚举,但是没有很好的方法来实现. 使用@Enumerated批注,可以使用EnumType.ORDINAL或EnumType.STRING将枚举值映射到 ...

  9. JPA 2.1类型转换器–保留枚举的更好方法

    可以使用JPA 2.0保留枚举,但是没有很好的方法来实现. 使用@Enumerated批注,可以使用EnumType.ORDINAL或EnumType.STRING将枚举值映射到其数据库表示形式. 但 ...

  10. SpringMVC框架----SpringMVC的自定义类型转换器

    上一段我们介绍了请求参数的绑定 SpringMVC请求参数的绑定 在请求参数绑定的时候,有时候会遇到一些问题,如自定义类型转换器异常 1.自定义类型转换器演示异常 现在有一个页面,想给服务器提交数据, ...

最新文章

  1. 前后端整合---请求
  2. mysql索引使用b_mysql索引的数据结构,为什么用b+树
  3. python字符串创建_python独特的字符串创建
  4. 你想要的宏基因组-微生物组知识全在这(2021.8)
  5. windows环境命令行创建虚拟环境
  6. 计算机大赛横幅标语有趣的,有创意的横幅标语大全
  7. 2022年中式烹调师(初级)考试题库及在线模拟考试
  8. 如何理解总体标准差、样本标准差与标准误
  9. PPT文件不能编辑怎么办?
  10. Freeswitch 180与183
  11. Flex和Flash的区别和联系
  12. 格式化jsp/html文件
  13. ORA-22858 invalid alteration of datatype varchar2转化clob
  14. 语音控制开关灯----mega2560
  15. TP5集成PayPal支付
  16. DICOM-RT:放疗领域中的各种影像
  17. SD-WAN与MPLS VPN,MSTP,IPSEC VPN,SSL VPN有什么区别?
  18. 【转】揭秘迅雷VIP用户的破解方法
  19. switch-case的结构及一些注意事项
  20. 傅里叶方程在计算机中的应用,5.3 傅里叶变换的应用 数理方程课件.pdf

热门文章

  1. 进程与线程之间的区别与联系
  2. 聊一聊 http2.0
  3. 如何注释ascx中的代码
  4. 日常工作中,个人总结的 - Git - 常用操作方法 (三)
  5. IOS打开pdf文件
  6. python处理文本_Python处理文本文件中控制字符的方法
  7. oracle update导入clob,【Oracle】给clob字段插入数据
  8. asp判断是否移动端_ASP判断当前访问的是PC端还是移动设备端
  9. IP地址,子网掩码,默认网关,DNS服务器是什么意思?
  10. VS code gopls requires a module at the root of your workspace