mybatis的参数处理详解
parameterType配置参数
1、参数的使用说明
使用标签的 parameterType 属性来设定。该属性的取值可以是基本类型,引用类型(例如:String 类型),还可以是实体类类型(POJO 类)。同时也可以使用实体类的包装类,使用实体类的包装类作为参数传递。
2、参数配置的注意事项
基本类型和String可以直接写类型名称也可以使用包名.类名的方式,例如:java.lang.String。
实体类类型,目前我们只能使用全限定类名。
究其原因,是mybaits在加载时已经把常用的数据类型注册了别名,从而我们在使用时可以不写包名,而我们的是实体类并没有注册别名,所以必须写全限定类名。
别名 | 映射的类型 |
---|---|
_byte | byte |
_long | long |
_short | short |
_int | int |
_integer | int |
_double | double |
_float | float |
_boolean | boolean |
string | String |
byte | Byte |
long | Long |
short | Short |
int | Integer |
integer | Integer |
double | Double |
float | Float |
boolean | Boolean |
date | Date |
decimal | BigDecimal |
bigdecimal | BigDecimal |
object | Object |
map | Map |
hashmap | HashMap |
list | List |
arraylist | ArrayList |
collection | Collection |
iterator | Iterator |
传递pojo包装对象(即出现条件为类和集合的参数如何处理)
开发中通过pojo传递查询条件,查询条件是综合的查询条件,不仅包括学生查询条件,还包括其他的查询条件(比如将学生的老师也作为查询条件),这时可以使用包装类对象传递输入参数,Pojo类中包含pojo
创建maven项目:如图所示的项目结构
相关配置文件配置:
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.etime</groupId>
<artifactId>day09</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<!-- 添加lombok依赖工具使用其中的注解方法可以让实体类中get,set,以及实体类中操作少一些-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.16</version>
</dependency>
<!-- 添加和引入mybatis的版本号等依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.1</version>
</dependency>
<!-- 这里添加mysql依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.11</version>
<scope>runtime</scope>
</dependency>
<!-- 如果不需要也可不进行单元测试的依赖引入-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
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>
<!-- 配置 mybatis的环境-->
<environments default="development">
<!-- 配置环境-->
<environment id="development">
<!-- 配置事物类型-->
<transactionManager type="JDBC"></transactionManager>
<!-- 配置连接数据库的信息:用的是数据源[连接池]-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<!-- jdbc:mysql://localhost:3306/db_school?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC-->
<!-- 和javaWeb servlet三层架构中的区别这里是只需要设置时区就可以了-->
<property name="url" value="jdbc:mysql://localhost:3306/db_school?serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="h123456"/>
</dataSource>
</environment>
</environments>
<!-- 注册StudentDao接口映射文件位置-->
<mappers>
<mapper resource="mapper/StudentMapper.xml"/>
</mappers>
</configuration>
添加工具类:
package com.etime.util;
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 java.io.IOException;
import java.io.InputStream;
public class SqlSessionUtil {
private static SqlSession sqlSession =null;
static {
//加载配置文件
InputStream inputStream = null;
try {
inputStream = Resources.getResourceAsStream("config.xml");
} catch (IOException e) {
e.printStackTrace();
}
//用于读取配置文件内容,生成SqlSessionFactory
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
//获取SqlSession对象
sqlSession = sqlSessionFactory.openSession();
}
public SqlSession getSqlSession(){
return sqlSession;
}
}
创建学生实体类Student.java
package com.etime.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
//添加无参构造函数
@NoArgsConstructor
//添加全参数构造函数
@AllArgsConstructor
//添加所有需要的get,set等方法
@Data
public class Student {
private int sid;
private String sname;
private String sgender;
private int sage;
private String semail;
private String sphoto;
}
创建老师实体类Teacher.java
package com.etime.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@NoArgsConstructor
@AllArgsConstructor
@Data
public class Teacher {
private int tid;
private String tname;
}
编写QueryVo.java类
package com.etime.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@AllArgsConstructor
@NoArgsConstructor
@Data
public class QueryVo {
private Student student;
private Teacher teacher;
}
编写持久层接口StudentMapper
<select id="getStuBySth" parameterType="com.etime.pojo.QueryVo" resultType="com.etime.pojo.Student"> select s.* from student s,teacher t,student_teacher st where s.sid=st.sid and st.tid=t.tid and t.tname=#{teacher.tname} and s.sgender=#{student.sgender} </select>
配置接口方法对应的sql文件
//查询刘德华老师授课的男学生有哪些 List<Student> getStuBySth(QueryVo queryVo);
测试QueryVo对象作为参数
@Test public void t07() throws IOException { SqlSession sqlSession = SqlSessionUtil.getSqlSession(); StudentDao studentDao = sqlSession.getMapper(StudentDao.class); Student student = new Student(0,null,"男",0,null,null); Teacher teacher = new Teacher(0,"刘德华"); QueryVo queryVo = new QueryVo(student,teacher); List<Student> list = studentDao.getStuBySth(queryVo); System.out.println(list); sqlSession.close(); }
map集合数据作为参数的处理方式
1、 添加接口方法参数使用map集合
//查询出所有19岁的男生的信息 List<Student> getStuBySgenderAndSage(Map<String,Object> map);
2、配置接口对应的sql配置
<select id="getStuBySgenderAndSage" parameterType="Map" resultType="com.etime.pojo.Student"> /*注意:#{}放的时传入参数map集合的key*/ select * from student where sage=#{age} and sgender=#{gender} </select>
3、测试map集合作为参数
@Test public void t08() throws IOException { SqlSession sqlSession = SqlSessionUtil.getSqlSession(); StudentDao studentDao = sqlSession.getMapper(StudentDao.class); Map<String,Object> map = new HashMap<>(); map.put("age",19); map.put("gender","男"); List<Student> list = studentDao.getStuBySgenderAndSage(map); System.out.println(list); sqlSession.close(); }
4、 #{}和${}的区别
1、#{}是预编译处理,${}是字符串替换
2、Mybatis在处理 时,就是把 {}时,就是把 时,就是把{}替换为变量的值
3、Mybatis在预处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值
4、使用#{}可以有效的防止SQL注入,提高系统安全性。
List list = studentDao.getStuBySgenderAndSage(map);
System.out.println(list); sqlSession.close();
}
4、 #{}和${}的区别
1、#{}是预编译处理,${}是字符串替换
2、Mybatis在处理 时,就是把 {}时,就是把 时,就是把{}替换为变量的值
3、Mybatis在预处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值
4、使用#{}可以有效的防止SQL注入,提高系统安全性。