当前位置: 首页 > article >正文

mybatis的参数处理详解

mybatis的参数处理详解

parameterType配置参数

1、参数的使用说明

使用标签的 parameterType 属性来设定。该属性的取值可以是基本类型,引用类型(例如:String 类型),还可以是实体类类型(POJO 类)。同时也可以使用实体类的包装类,使用实体类的包装类作为参数传递。

2、参数配置的注意事项

基本类型和String可以直接写类型名称也可以使用包名.类名的方式,例如:java.lang.String。
实体类类型,目前我们只能使用全限定类名。
究其原因,是mybaits在加载时已经把常用的数据类型注册了别名,从而我们在使用时可以不写包名,而我们的是实体类并没有注册别名,所以必须写全限定类名。

别名映射的类型
_bytebyte
_longlong
_shortshort
_intint
_integerint
_doubledouble
_floatfloat
_booleanboolean
stringString
byteByte
longLong
shortShort
intInteger
integerInteger
doubleDouble
floatFloat
booleanBoolean
dateDate
decimalBigDecimal
bigdecimalBigDecimal
objectObject
mapMap
hashmapHashMap
listList
arraylistArrayList
collectionCollection
iteratorIterator

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


http://www.kler.cn/a/13387.html

相关文章:

  • 0/1背包问题——从LeetCode题海中总结常见套路
  • 基础数据结构------单链表
  • 水果FL Studio21最新中文完整版下载更新及内容介绍
  • 【操作系统】互斥锁 mutex 结构解析
  • 第十篇 Spring 集成Redis
  • 机器学习 第一周
  • 家用洗地机哪款好用?好用的洗地机分享
  • RHCE第四次作业
  • 水羊转债,超达转债,晓鸣转债上市价格预测
  • ik分词
  • 热更新方案 HybridCLR 学习教程 |(一)原理及准备工作
  • ChatGPT其实并不想让开发人员做这5件事情,但却已经被玩坏了
  • 分析软件及其隐藏后门实验笔记
  • 通过使用生成对抗市场模型改进基于强化学习的交易的泛化
  • FPGA基于XDMA实现PCIE X8的HDMI视频采集 提供工程源码和QT上位机程序和技术支持
  • 开源Qt Ribbon控件——SARibbon的布局思路及介绍
  • nssctf web 入门(10)
  • 跨平台科学应用程序:QtiPlot 1.X Crack
  • MySQL数据库从入门到精通学习第2天(创建数据库)
  • 说过的话就一定要办到 - redo日志