(三)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类型,于是类型本身的范围太宽,要求使用者需要了解底层的业务方可知如何传值,那整体来看增加沟通成本,对 ...
随机推荐
- PHP高级程序员必看知识点:目录大全(不定期更新)
面试题系列: 分享一波腾讯PHP面试题 2019年PHP最新面试题(含答案) Redis 高级面试题 学会这些还怕进不了大厂? 阿里面试官三年经验PHP程序员知识点汇总,学会你就是下一个阿里人! ph ...
- mqtt实现跨平台跨应用通讯
介绍 最近物联网应用一直很火,也打算做一些这方面的尝试,就边学边做在家花了2天时间做了一个简单demo,功能很简单,使用emq x 作为mqtt broker,用python写了一个定时抓取主机CPU ...
- js以当前时间为基础,便捷获取时间(最近2天,最近1周,最近2周,最近1月,最近2月,最近半年,最近一年,本周,本月,本年)
在开发公司管理后台系统时,遇到了需要根据不同的时间段如"近一年.近半年.近三月.近一月.近一周"来获取并展示不同图表数据的需求,很是繁琐,项目开发周期又非常的短,自己想了一下,虽然 ...
- C#中的委托是什么
1.什么是委托?(方法作另一个方法的参数)delegate void MyDel(int value); //声明委托类型和类一样,委托是用户自定义的类型,但是类是数据和方法的集合,而委托是持有 ...
- Java 几道常见String面试题
String s1="abc"; String s2="abc"; System.out.println(s1==s2); System.out.println ...
- Git将一个项目同时从本地推送到GitHub和Gitee
前言 博主是根据自己的情况写这篇博文的,每个人遇到的情况和需求可能不一样哈,所以初始的步骤也不一定一致,但是同时推送到Github和Gitee的步骤都会是一致滴! Gitee拉取Github仓库 直接 ...
- Window下安装并使用InfluxDB可视化工具 —— InfluxDBStudio
下载 直接访问: https://github.com/CymaticLabs/InfluxDBStudio/releases/tag/v0.2.0-beta.1 创建or编辑InfluxDB 这个软 ...
- webpack进阶用法你都get到了么?
如何消除无用代码:打包自己的私有js库:实现代码分割和动态import提升初次加载速度:配置eslint规范团队代码规范:打包异常抓捕你都get到了么? 摇树优化:Tree Shaking webpa ...
- 多个github账号时,本地配置ssh-key
由于需要,申请了多个github账号,但是都是在同一台电脑上操作,原来只有一个账号进行ssh操作时,推送没有遇到什么问题,现在有多个账号了,推送的时候就有点懵逼了,下面是根据网上的资料来进行多个账号, ...
- [bzoj1875] [洛谷P2151] [SDOI2009] HH去散步
Description HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离. 但 是同时HH又是个喜欢变化的人,所以他不会立刻沿着刚刚走来的路走回. 又 ...