主要内容
本篇详解mapper接口传参的各种方式。
-
传递一个参数
-
传递一个Map参数
-
传递一个javabean参数
-
多参数中用@param指定参数名称
-
java编译中参数名称的处理
-
mapper接口传参源码分析
-
传递1个Collection参数
-
传递1个List参数
-
传递1个数组参数
-
mybatis对于集合处理源码分析
-
ResultHandler作为参数的用法
本篇文章的案例在上一篇chat03模块
上进行开发,大家可以到文章的尾部获取整个mybatis系列的案例源码。
mybatis系列的文章前后都是有依赖的,请大家按顺序去看,尽量不要跳着去看,这样不会出现看不懂的情况,建议大家系统化的学习知识,基础打牢,慢慢才能成为高手。
使用mybatis开发项目的中,基本上都是使用mapper接口的方式来执行db操作,下面我们来看一下mapper接口传递参数的几种方式及需要注意的地方。
传递一个参数
用法
Mapper接口方法中只有一个参数,如:
UserModel getByName(String name);
Mapper xml引用这个name参数:
#{任意合法名称}
如:#{name}、#{val}、${x}等等写法都可以引用上面name参数的值
。
案例
创建UserModel
类,如下:
package com.javacode2018.chat03.demo4.model;
import lombok.*;
/**
* 公众号:路人甲Java,工作10年的前阿里P7分享Java、算法、数据库方面的技术干货!坚信用技术改变命运,让家人过上更体面的生活!
*/
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
@ToString
public class UserModel {
private Long id;
private String name;
private Integer age;
private Double salary;
private Integer sex;
}
创建Mapper接口UserMapper
,如下:
package com.javacode2018.chat03.demo4.mapper;
import com.javacode2018.chat03.demo4.model.UserModel;
import java.util.List;
import java.util.Map;
/**
* 公众号:路人甲Java,工作10年的前阿里P7分享Java、算法、数据库方面的技术干货!坚信用技术改变命运,让家人过上更体面的生活!
*/
public interface UserMapper {
/**
* 通过name查询
*
* @param name
* @return
*/
UserModel getByName(String name);
}
注意上面有个getByName方法,这个方法传递一个参数。
创建Mapper xml文件UserMapper.xml
,mybatis-series\chat03\src\main\resources\com\javacode2018\chat03\demo4\mapper
目录创建UserMapper.xml
,如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.javacode2018.chat03.demo4.mapper.UserMapper">
<!-- 通过name查询 -->
<select id="getByName" resultType="com.javacode2018.chat03.demo4.model.UserModel">
<![CDATA[
SELECT * FROM t_user WHERE name = #{value} LIMIT 1
]]>
</select>
</mapper>
上面有个getByName通过用户名查询,通过#{value}引用传递进来的name参数,当一个参数的时候
#{变量名称}
中变量名称可以随意写,都可以取到传入的参数。
创建属性配置文件,mybatis-series\chat03\src\main\resources
目录创建jdbc.properties
,如下:
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/javacode2018?characterEncoding=UTF-8
jdbc.username=root
jdbc.password=root123
上面是我本地db配置,大家可以根据自己db信息做对应修改。
创建mybatis全局配置文件,mybatis-series\chat03\src\main\resources\demo4
目录创建mybatis-config.xml
,如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 引入外部jdbc配置 -->
<properties resource="jdbc.properties"/>
<!-- 环境配置,可以配置多个环境 -->
<environments default="demo4">
<environment id="demo4">
<!-- 事务管理器工厂配置 -->
<transactionManager type="JDBC"/>
<!-- 数据源工厂配置,使用工厂来创建数据源 -->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<package name="com.javacode2018.chat03.demo4.mapper"/>
</mappers>
</configuration>
上面通过properties的resource属性引入了jdbc配置文件。
package属性的name指定了mapper接口和mapper xml文件所在的包,mybatis会扫描这个包,自动注册mapper接口和mapper xml文件。
创建测试用例Demo4Test
,如下:
package com.javacode2018.chat03.demo4;
import com.javacode2018.chat03.demo4.mapper.UserMapper;
import com.javacode2018.chat03.demo4.model.UserModel;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 公众号:路人甲Java,工作10年的前阿里P7分享Java、算法、数据库方面的技术干货!坚信用技术改变命运,让家人过上更体面的生活!
*/
@Slf4j
public class Demo4Test {
private SqlSessionFactory sqlSessionFactory;
@Before
public void before() throws IOException {
//指定mybatis全局配置文件
String resource = "demo4/mybatis-config.xml";
//读取全局配置文件
InputStream inputStream = Resources.getResourceAsStream(resource);
//构建SqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
this.sqlSessionFactory = sqlSessionFactory;
}
/**
* 通过map给Mapper接口的方法传递参数
*/
@Test
public void getByName() {
try (SqlSession sqlSession = this.sqlSessionFactory.openSession(true);) {
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
UserModel userModel = userMapper.getByName("路人甲Java");
log.info("{}", userModel);
}
}
}
注意上面的getByName
方法,会调用UserMapper接口的