(三)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,);
}else{
var1.setInt(var2,);
}
}
//根据列名获取值
public Boolean getNullableResult(ResultSet var1, String var2) throws SQLException{
int sexNum = var1.getInt(var2);
if(sexNum == ) //从数据库当中获取的值为1时,返回true,反之为false
return true;
return false;
}
//根据下标获取值
public Boolean getNullableResult(ResultSet var1, int var2)throws SQLException{
int sexNum = var1.getInt(var2);
if(sexNum == )
return true;
return false;
}
//通过存储过程获取
public Boolean getNullableResult(CallableStatement var1, int var2)throws SQLException{
int sexNum = var1.getInt(var2);
if(sexNum == )
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- -classpath C:\learn\java\mybatis\out\production\mybatis;C:\迅雷下载\mybatis-3.5.\mybatis-3.5.\mybatis-3.5..jar;C:\迅雷下载\mysql-connector-java-8.0..jar entity.test
id:
姓名:哈哈哈
爱好:跳舞
性别:false
id:
姓名:哈哈哈
爱好:跳舞
性别:false Process finished with exit code
接口方法传参类型:
首先区分两种传参的方法:
#{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标签,注意名称一定要写正确就行了
(三)Mybatis类型转换器,接口传参类型,一对一,一对多查询resultMap配置的更多相关文章
- mybatis一对多查询resultMap只返回了一条记录
问题描述:因为领导的一个需求,需要用到使用resultMap,很久没使用了,结果就除了点意外.就记录下这个问题 准备两个类:author(作者)和book(书),数据库创建对应的author-> ...
- mybatis入门系列三之类型转换器
mybatis入门系列三之类型转换器 类型转换器介绍 mybatis作为一个ORM框架,要求java中的对象与数据库中的表记录应该对应 因此java类名-数据库表名,java类属性名-数据库表字段名, ...
- Struts 2 类型转换器 输入校验 拦截器
Struts 2中内建了字符串类型和常见类型之间相互转换的转换器,能满足大多数转换需求,但不能完成字符串和User对象之间的转换. OGNL项目中有一个TypeConvert接口,这个接口是自定义类型 ...
- XAML实例教程系列 - 类型转换器(Type Converter)七
XAML实例教程系列 - 类型转换器(Type Converter) 分类: Windows 8 Silverlight2012-06-25 13:40 961人阅读 评论(0) 收藏 举报 butt ...
- wpf中xaml的类型转换器与标记扩展
原文:wpf中xaml的类型转换器与标记扩展 这篇来讲wpf控件属性的类型转换器 类型转换器 类型转换器在asp.net控件中已经有使用过了,由于wpf的界面是可以由xaml组成的,所以标签的便利也需 ...
- struts2视频学习笔记 13-14(自定义局部和全局类型转换器(转换Date格式))
课时13 自定义类型转换器 局部(对某个action类) package tutorial; import java.util.Date; public class HelloWorld { priv ...
- springmvc 类型转换器 数据回显及提示信息
处理器的写法: 类型转换器的写法: 类型转换器在springmvc.xml中的配置如下: index.jsp的写法:
- Mybatis入门——基础方式的增删该查、mapper动态代理方式的CRUD、类型转换器
一.基础方式的增删该查: 1.mybatis约定:输入参数parameterType和输出参数resulrType在形式上只能有一个. 2.如果输入/输出参数:是简单类型(8个基本类型加String) ...
- mybatis类型转换器 - 自定义全局转换enum
在数据模型.接口参数等场景部分属性参数为一些常量值,比如性别:男.女.若是定义成int或String类型,于是类型本身的范围太宽,要求使用者需要了解底层的业务方可知如何传值,那整体来看增加沟通成本,对 ...
随机推荐
- 使用内存映射文件MMF实现大数据量导出时的内存优化
前言 导出功能几乎是所有应用系统必不可少功能,今天我们来谈一谈,如何使用内存映射文件MMF进行内存优化,本文重点介绍使用方法,相关原理可以参考文末的连接 实现 我们以单次导出一个excel举例(csv ...
- GeneXus DevOps 自动化构建和部署流程
以下视频详细介绍了GeneXus DevOps自动化构建和部署流程,包括通过MS Bulid来管理自动化流程,自动化的架构,以及在GeneXus Server上使用Jenkins做为自动化引擎. 视频 ...
- const和volitale
1. const只读变量 const修饰的变量是只读的,本质还是变量 const修饰的局部变量在栈上分配空间(可以通过指针修改) const修饰的全局变量在全局数据区分配空间(指针也修改不了) con ...
- 暑假提高组集训Day1 T2
那么这一道题我在考试的时候写挂了(0分 呜呜~) 我原来的思路是广搜来骗取部分分(哈哈~) 但是我忘记了一个非常重要的问题 我广搜开的数组没有考虑负的下标 下一次考试如果再写暴力 就可以把坐标都加上一 ...
- Java框架之Spring02-AOP-动态代理-AspectJ-JdbcTemplate-事务
AOP 动态代理 代理设计模式的原理:使用一个代理将原本对象包装起来,然后用该代理对象”取代”原始对象.任何对原始对象的调用都要通过代理.代理对象决定是否以及何时将方法调用转到原始对象上. 代理模式的 ...
- JsonResponse和HttpResponse
1.联系 JsonResponse继承HttpResponse 2.区别 JsonResponse 数据类型装自动换成json字符串并相应到前端,传到前端的是数据类型而非json字符串 HttpRes ...
- Qt Installer Framework翻译(7-1)
配置文件 配置文件可自定义安装程序的用户界面和行为.该文件通常称为config.xml,位于config文件夹中. 最小配置文件由一个<Installer>根元素组成,<Name&g ...
- SpringBoot项目的parent依赖和配置文件*.properties、*.yml详解
1.idea创建SpringBoot项目 idea创建SpringBoot项目应该对很多人来说已经是菜到不能到菜的操作了,但是对于初学者小白来说,还是要讲解一下的.打开idea,然后选择Spring ...
- 基于云开发开发 Web 应用(一):项目介绍 & 初始化
基于云开发开发 Web 应用(一):项目介绍 & 初始化 背景描述 Linux 中国曾在过去的 1 - 2 年内长期运行了一个 TL;DR 的中国版.不过当时做的版本是小程序的版本,一直以来, ...
- laravel aritisan命令大全
1常用命令 显示某个命令的帮助 php artisan -h make:controller 实例命令 php artisan make:controller -r Api/TestControlle ...