mybatis的参数处理详解
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 configurationPUBLIC "-//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();}//用于读取配置文件内容,生成SqlSessionFactorySqlSessionFactoryBuilder 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 stwhere 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对象作为参数
@Testpublic 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集合作为参数
@Testpublic 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注入,提高系统安全性。