(三)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类型,于是类型本身的范围太宽,要求使用者需要了解底层的业务方可知如何传值,那整体来看增加沟通成本,对 ...
随机推荐
- 当Parallel遇上了DI - Spring并行数据聚合最佳实践
分析淘宝PDP 让我们先看个图, Taobao的PDP(Product Detail Page)页. 打开Chrome Network面板, 让我们来看taobao是怎么加载这个页面数据的. 根据经验 ...
- Theia APIs——事件
上一篇:Theia APIs——Preferences 事件 Theia中的事件或许会让你感到困惑,希望本节能阐述清楚. 来看下面的代码: (来自logger-watcher.ts) @injecta ...
- Longhorn入门级教程!轻松实现持久化存储!
介 绍 在本文中你将学会如何使用k3s在Civo上运行Longhorn.如果你还没使用过Civo,可以到官网注册(https://www.civo.com/ )还可以申请免费的使用额度.首先,需要一个 ...
- kuangbin专题 专题九 连通图 POJ 3694 Network
题目链接:https://vjudge.net/problem/POJ-3694 题目:给定一个连通图,求桥的个数,每次查询,加入一条边,问加入这条边后还有多少个桥. 思路:tarjan + 并查集 ...
- CSP-S rp++
心无旁骛 认真思考 努力骗分(哈哈) I Love CSP! 反正像我这种大菜鸟也考不了多少 尽力打 本次考试期望 day1 100 70-100 30-? day2 100 ? ? 总:300-? ...
- VMware Workstation CentOS7 Linux 学习之路(2)--.net core环境安装
1.为了安装.NET,需要注册微软签名密钥和添加微软相关的支持.这个操作每台机器只能做一次. Add the dotnet product feed(其实就是向微软提交投名状,表示我这台服务器要用co ...
- 【JavaScript 基础知识】一篇关于 JavaScript 一些知识点的总结
JavaScript 中基础数据类型 数据类型名称 数据类型说明 Undefined 只有一个值,即 undefined ,声明变量的初始值. Null 只有一个值,即 null ,表示空指针, ...
- elasticsearch(lucene)索引数据过程
倒排索引存储-分段存储(lucene的功能)在lucene中:lucene index包含了若干个segment在elasticsearch中:index包含了若干主从shard,shard包干了若干 ...
- 最近面试 有人问 sqlite 用过么 sqlite 不是 嵌入式的 开发 么 难道最近还 web开发 了?
找了一个 sqlite expert 安装了一下
- python数据类型之字典操作
Python字典是另一种可变容器模型,且可存储任意类型对象,如字符串.数字.元组等其他容器模型.一.创建字典字典由key和value成对组成.基本语法如下: infos = {"name&q ...