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项目:如图所示的项目结构

mybatis的参数处理详解

相关配置文件配置:

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注入,提高系统安全性。文章来源地址https://www.toymoban.com/news/detail-422773.html

List list = studentDao.getStuBySgenderAndSage(map);

 System.out.println(list);
 sqlSession.close();

}

4、 #{}和${}的区别

1、#{}是预编译处理,${}是字符串替换

2、Mybatis在处理 时,就是把 {}时,就是把 时,就是把{}替换为变量的值

3、Mybatis在预处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值

4、使用#{}可以有效的防止SQL注入,提高系统安全性。

到了这里,关于mybatis的参数处理详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Logstash数据处理服务的输出插件Output配置参数详解

    output配置字段是将收集的日志数据存输出到生存储中,一般都是elasticsearch集群。 常用字段配置: hosts ES集群每个节点的地址信息。 index :指定存储到ES的哪个索引库。 将从file日志文件中收集来的数据存储到ES索引库中。

    2023年04月09日
    浏览(56)
  • 【MATLAB数据处理实用案例详解(22)】——基于BP神经网络的PID参数整定

    基于BP神经网络的PID控制的系统结构如下图所示: 考虑仿真对象,输入为r(k)=1.0,输入层为4,隐藏层为5,输出层为3,仿真输出满足 a ( k ) = 1.2 ( 1 − 0.8 e x p ( − 0.1 k ) ) , y ( k ) = a ( k ) y − 1 1 + ( y − 1 ) 2 + u − 1 a(k)=1.2(1-0.8exp(-0.1k)),y(k)=a(k) frac{y-1}{1+(y-1)^2}+u-1 a ( k ) = 1.2 ( 1 −

    2024年02月07日
    浏览(60)
  • Mybatis1.10 Mybatis参数传递

    Mybatis 接口方法中可以接收各种各样的参数,如下: 多个参数 单个参数:单个参数又可以是如下类型 POJO 类型 Map 集合类型 Collection 集合类型 List 集合类型 Array 类型 其他类型 1.10.1 多个参数 如下面的代码,就是接收两个参数,而接收多个参数需要使用 @Param 注解,那么为什么

    2024年02月10日
    浏览(45)
  • Mybatis 参数为数组

    当MyBatis中的参数为数组,如果在带有动态SQL的@Select语句中使用它时,可以使用foreach标签来遍历数组元素。 1 SQL查询语句位于script标签内,以启用动态SQL。 2 foreach标签用于遍历array参数。 3 item属性定义了用于表示数组中每个项的临时变量的名称。 4 collection属性指定要遍历的

    2024年02月12日
    浏览(29)
  • mybatis使用多参数查询

    repository接口写法: Mapper层配置文件写法: 注意:resultmap是结果集,select为查询语句。其中,#{…}中的名字要和@Param注解中的参数名对应

    2024年02月09日
    浏览(60)
  • MyBatis批量插入数据优化,增加一个参数,效率提升百倍

    项目中进行接口压测,发现批量插入的速度有点超出预期,感觉很奇怪,经过定位后发现mybatise-plus批量保存的处理十分缓慢,使用的是saveBatch方法,这点有点想不通。于是就进行了相关内容分析。 根据mybatise-plus中saveBatch的方法进行源码查看:   继续跟踪逻辑,从代码上看,

    2024年02月15日
    浏览(45)
  • 【MyBatis 学习二】增删改查&& 参数占位符 #{} 和 ${}的使用

    目录 一、增删改查 🌷1、用户类 🌷2、UserMapper 🌷3、UserMapper.xml 🌷4、测试类Test 🌷5、UserService类 🌷6、UserController类 🌷7、注意点总结 二、#{} 和${} 的使用区别 🌷1、#{}与${}的区别(SQL注入) 🌷2、$的SQL注入:用户登录演示 🌷3、$的使用场景:排序+like 🌲 使用场景1:排

    2024年02月15日
    浏览(45)
  • MyBatis中在Mapper中如何传递多个参数?(4种方法,超级详细)

    1、若Dao层函数有多个参数,那么其对应的xml中, #{0} 代表接收的是Dao层中的第一个参数, #{1} 代表Dao中的第二个参数,以此类推。 假设Dao层函数有两个参数,分别是int类型的id和String类型的name: 2、使用@Param注解,在Dao层函数的参数前面添加@Param注解来显式指定每个参数的名

    2024年02月05日
    浏览(46)
  • Mybatis注解开发@Select执行参数和执行sql语句的方式

    执行传参 @Select 是 Mybatis 框架中的一个注解,用于执行 SQL 查询语句,并把查询结果映射到指定的 Java 对象中。 具体来说,@Select 注解会将注解中的 SQL 查询语句交给 Mybatis 框架进行解析和执行。在解析过程中,Mybatis 会通过 #{} 占位符获取查询语句中的参数,并将这些参数传

    2024年02月16日
    浏览(39)
  • 使用Mybatis自定义插件实现不侵入业务的公共参数自动追加

    后台业务开发的过程中,往往会遇到这种场景:需要记录每条记录产生时间、修改时间、修改人及添加人,在查询时查询出来。 以往的做法通常是手动在每个业务逻辑里耦合上这么一块代码,也有更优雅一点的做法是写一个拦截器,然后在Mybatis拦截器中为实体对象中的公共

    2024年02月04日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包