(三)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类型,于是类型本身的范围太宽,要求使用者需要了解底层的业务方可知如何传值,那整体来看增加沟通成本,对 ...
随机推荐
- git submodule 管理子项目
使用场景 拆分项目,当项目越来越大之后,我们希望 子模块 可以单独管理,并由 专门 的人去维护,这个时候只可以使用 git submodule 去完成. 常用命令 git clone <repo ...
- 简单快速破解IDEA
====================================2019.09.16更新==================================== 可以直接去掉第三步,直接在激活 ...
- Jmeter+Jenkins 搭配进行接口测试
单纯通过Jmeter的界面进行Web的接口测试,效率低下.为此将Jmeter的接口测试与Jenkins联合,实现持续集成.配置完成后,只需修改运行的Jmeter脚本即可,运行结束后测试结果发送到指定邮 ...
- iOS多线程编程原理及实践
摘要:iOS开发中,开发者不仅要做好iOS的内存管理,而且如果你的iOS涉及多线程,那你也必须了解iOS编程中对多线程的限制,iOS主线程的堆栈大小为1M,其它线程均为512KB,且这个限制开发者是无 ...
- feign架构 原理解析
什么是feign? 来自官网的解释:Feign makes writing java http clients easier 在使用feign之前,我们怎么发送请求? 拿okhttp举例: publi ...
- 搞定SpringBoot多数据源(2):动态数据源
目录 1. 引言 2. 动态数据源流程说明 3. 实现动态数据源 3.1 说明及数据源配置 3.1.1 包结构说明 3.1.2 数据库连接信息配置 3.1.3 数据源配置 3.2 动态数据源设置 3. ...
- LeetCode 第26题--数组中重复元素
1. 题目 2.题目分析与思路 3.代码 1. 题目 给定数组 nums = [1,1,2], 函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2. 你不需要考虑数组中超 ...
- Excel-条件格式
今天运用了一下条件格式中的自建规则进行公式筛选, 设置格式那里一定要将$P$8修改为$P8 然后双击修改后的第一项进行单元格的自动填充
- Java单体应用 - 导读
原文地址:http://www.work100.net/training/monolithic 更多教程:光束云 - 免费课程 Java单体应用 本阶段课程将学习如何进行Java单体Web应用开发,经 ...
- [组合数学][多项式][拉格朗日插值]count
源自 ditoly 大爷的 FJ 省队集训课件 Statement 有 \(m\) 个正整数变量,求有多少种取值方案 使得所有变量的和不超过 \(S\) 并且前 \(n\) 个变量的值都不超过 \(t ...