Mybatis类型转换器,接口传参类型,
Posted eenio
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mybatis类型转换器,接口传参类型,相关的知识,希望对你有一定的参考价值。
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,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,反之为false
return 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
姓名:哈哈哈
爱好:跳舞
性别:false
Process 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);
以上是关于Mybatis类型转换器,接口传参类型,的主要内容,如果未能解决你的问题,请参考以下文章
Mybatis -- MyBatis核心配置文件深入: typeHandlers标签(自定义类型转换器)plugins标签(插件标签:扩展mybatis功能 分页助手)