> 文章列表 > mybatis的参数处理详解

mybatis的参数处理详解

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注入,提高系统安全性。