全网最全、最新MyBatis框架核心知识,这篇文章包你这辈子也忘不掉MyBatis(一)!!

简介: MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。

✨✨MyBatis框架


1. 软件开发常用结构


  • MyBatis是操作数据库的,相当于是一个增强的JDBC


1.1 三层架构


三层架构包括:

  • 界面层(User Interface layer)
  • 业务逻辑层(Business Logic Layer)
  • 数据访问层(Data access layer)

三层的职责:

  • 界面层(表示层,视图层):主要功能是接受用户的数据,显示请求的处理结果。使用 web 页面和 用户交互,手机 app 也就是表示层的,用户在 app 中操作,业务逻辑在服务器端处理。
    可以认为是jsp、servlet、html、css...
  • 业务逻辑层:接收表示传递过来的数据,检查数据,计算业务逻辑,调用数据访问层获取数据。可以认为是service,处理业务逻辑,调用dao的。
  • 数据访问层(持久层):与数据库打交道。主要实现对数据的增、删、改、查。将存储在数据库中的数据提交 给业务层,同时将业务层处理的数据保存到数据库.

三层对应的包:

  • 面层: controller包 (servlet)
  • 业务逻辑层: service 包(XXXService类)
  • 数据访问层: dao包(XXXDao类)用来对数据库进行增、删、改、查。

三层的处理请求的交互:

  • 用户---> 界面层--->业务逻辑层--->数据访问层--->DB 数据库

微信截图_20220608215605.png

为什么要使用三层:

  • 结构清晰、耦合度低, 各层分工明确
  • 可维护性高,可扩展性高
  • 有利于标准化
  • 开发人员可以只关注整个结构中的其中某一层的功能实现
  • 有利于各层逻辑的复用

重点 :因为每一层都对应一个处理框架

三层对应的处理框架:

  • 界面层---servlet---springmvc(框架):接收请求,处理结果。
  • 业务逻辑层---service类--spring(框架) :管理service类。
  • 数据访问层---dao类--mybatis(框架):代替JDBC访问数据库。


2. 什么是框架


框架的定义:

  • 框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方 法;另一种认为,框架是可被应用开发者定制的应用骨架、模板。 简单的说,框架其实是半成品软件,就是一组组件,供你使用完成你自己的系统。从另一个角度来 说框架一个舞台,你在舞台上做表演。在框架基础上加入你要完成的功能。 *框架是安全的,可复用的,不断升级的软件。 *
  • 简单理解:可以把框架当做是一个舞台、一个模板(规定好的一些条款、内容)。

框架解决的问题:

  • 框架要解决的最重要的一个问题是技术整合,在 J2EE 的 框架中,有着各种各样的技术,不同的应 用,系统使用不同的技术解决问题。需要从 J2EE 中选择不同的技术,而技术自身的复杂性,有导致更 大的风险。企业在开发软件项目时,主要目的是解决业务问题。 即要求企业负责技术本身,又要求解 决业务问题。这是大多数企业不能完成的。框架把相关的技术融合在一起,企业开发可以集中在业务领 域方面。
  • 另一个方面可以提供开发的效率。

框架的特点:

  • 框架一般不是全能的, 不能做所有事情
  • 框架是针对某一个领域有效。 特长在某一个方面,比如mybatis做数据库操作强,但是他不能做其它的。
  • 框架是安全的,可复用的,不断升级的软件。

常用的J2EE开发框架:

  • J2EE是一套针对企业级分布式应用的计算环境。它定义了动态Web页面功能(Servlet和Jsp)、商业组件(EJB)、异步消息传输机制(JMS)、名称和目录定位服务(JNDI)、数据库访(JDBC)、与子系统的连接器(JCA)和安全服务等。

MyBatis 框架: MyBatis 是一个优秀的基于 java 的持久层框架,内部封装了 jdbc,开发者只需要关注 sql 语句 本身,而不需要处理加载驱动、创建连接、创建 statement、关闭连接,资源等繁杂的过程。 MyBatis 通过 xml 或注解两种方式将要执行的各种 sql 语句配置起来,并通过 java 对象和 sql 的 动态参数进行映射生成最终执行的 sql 语句,最后由 mybatis 框架执行 sql 并将结果映射为 java 对象并返回。


Spring 框架: Spring 框架为了解决软件开发的复杂性而创建的。Spring 使用的是基本的 JavaBean 来完成以前 非常复杂的企业级开发。Spring 解决了业务对象,功能模块之间的耦合,不仅在 javase,web 中使用, 大部分 Java 应用都可以从 Spring 中受益。 Spring 是一个轻量级控制反转(IoC)和面向切面(AOP)的容器。


SpringMVC 框架: Spring MVC 属于 SpringFrameWork 3.0 版本加入的一个模块,为 Spring 框架提供了构建 Web 应用程序的能力。现在可以 Spring 框架提供的 SpringMVC 模块实现 web 应用开发,在 web 项目中 可以无缝使用 Spring 和 Spring MVC 框架。


3.MyBatis框架


3.1 MyBatis介绍


  • 一个框架,早期叫做ibatis, 代码在github。
  • mybatis是(MyBatis SQL Mapper Framework for Java )(sql映射框架)
  • sql mapper : sql映射 可以把数据库表中的一行数据 映射为 一个java对象。一行数据可以看做是一个java对象。操作这个对象,就相当于操作表中的数据。
  • Data Access Objects(DAOs) : 数据访问 , 对数据库执行增删改查。


3.1 MyBatis 提供的功能


  • 提供了创建Connection ,Statement, ResultSet的能力 ,不用开发人员创建这些对象了。
  • 提供了执行sql语句的能力, 不用你执行sql。
  • 提供了循环sql, 把sql的结果转为java对象, List集合的能力。
// 这是以前使用JDBC时获取到的数据库查询结果,此时需要使用循环来获取到查询的结果,并将这个结果写入到一个List集合中,很麻烦。
// 此时使用MyBatis框架,他会把这些sql语句当做是一个个的对象,在底层对自动帮我们完成这个循环,我们获取到的是一个装满sql对象的List集合。
while (rs.next()) {
        Student stu = new Student();
        stu.setId(rs.getInt("id"));
        stu.setName(rs.getString("name"));
        stu.setAge(rs.getInt("age"));
        //从数据库取出数据转为 Student 对象,封装到 List 集合
        stuList.add(stu);
      }
复制代码
  • 提供了关闭资源的能力,不用你关闭Connection, Statement, ResultSet。


3.2 开发人员做的工作


  • 提供sql语句,剩下的怎么执行这个sql语句,怎么获取到这个List集合,MyBatis会帮我们自己写好。
  • 使用MyBatis之后的开发步骤
开发人员提供sql语句--->MyBatis处理sql--->开发人员得到List集合或者java对象(表中的数据)
复制代码


3.3 对MyBatis的总结概述


  • mybatis是一个sql映射框架,提供的数据库的操作能力。增强的JDBC, 使用mybatis让开发人员集中精神写sql就可以了,不必关心Connection,Statement,ResultSet 的创建,销毁,sql的执行。


4.入门案例


5.MyBatis对象分析


5.1 Resources 类


  • Resources 类,顾名思义就是资源,*用于读取资源文件。*其有很多方法通过加载并解析资源文件,返 回不同类型的 IO 流对象。
  • 简单的说这个类就是读取以上入门案例,中的Resources: mybatis中的一个类, 负责读取主配置文件。
InputStream in = Resources.getResourceAsStream("mybatis.xml");
复制代码


5.2 SqlSessionFactoryBuilder 类


  • SqlSessionFactory 的 创 建 , 需 要 使 用 SqlSessionFactoryBuilder 对 象 的 build() 方 法 。 由 于 SqlSessionFactoryBuilder 对象在创建完工厂对象后,就完成了其历史使命,即可被销毁。所以,一般会将 该 SqlSessionFactoryBuilder 对象创建为一个方法内的局部对象,方法结束,对象销毁。
  • SqlSessionFactoryBuilder : *创建SqlSessionFactory对象。 *
SqlSessionFactoryBuilder builder  = new SqlSessionFactoryBuilder();
//创建SqlSessionFactory对象
SqlSessionFactory factory = builder.build(in);
复制代码


5.3 SqlSessionFactory 接口


  • SqlSessionFactory 接口对象是一个重量级对象(系统开销大的对象),是线程安全的,所以一个应用 只需要一个该对象即可。创建 SqlSession 需要使用 SqlSessionFactory 接口的openSession()方法。
  • SqlSessionFactory 这个接口的实现类是 DefaultSqlSessionFactory。这个实现类中有openSession()方法,使用这个接口就是为了使用这个openSession()方法来获取SqlSession对象
  • SqlSessionFactory 作用 : 获取SqlSession对象。
SqlSession sqlSession = factory.openSession();
复制代码

openSession()方法的几种形式:

➢ openSession(true):创建一个有自动提交功能的 SqlSession 。

➢ openSession(false):创建一个非自动提交功能的 SqlSession,需手动提交 。

➢ openSession():无参数,获取的是非自动提交事务的SqlSession对象。


5.4 SqlSession 接口


  • SqlSession 接口对象用于执行持久化操作。一个 SqlSession 对应着一次数据库会话,一次会话以 SqlSession 对象的创建开始,以 SqlSession 对象的关闭结束。 SqlSession 接口对象是线程不安全的,所以每次数据库会话结束前,需要马上调用其 close()方法,将 其关闭。再次需要会话,再次创建。 SqlSession 在方法内部创建,使用完毕后关闭。
  • SqlSession 接口 :* 定义了操作数据的方法。* 例如 selectOne() ,selectList() ,insert(),update(), delete(), commit(), rollback()。
  • SqlSession接口的实现类DefaultSqlSession。

使用要求:

  • SqlSession对象*不是线程安全的,*需要在方法内部使用, 在执行sql语句之前,使用openSession()获取SqlSession对象。在执行完sql语句后,需要关闭它,执行SqlSession.close(). 这样能保证他的使用是线程安全的。


6.动态代理


  • 动态代理: 使用SqlSession.getMapper(dao接口.class) 获取这个dao接口的对象
  • 注意:在接口中不要使用重载的抽象方法。


6.1 标准的mybatis配置主文件


<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace : 里边填写接口路径,这个类在项目中是唯一的,可以保证namespace值唯一-->
<mapper namespace="com.yunbocheng.dao.StudentDao">
<!--
    mybatis的配置文件:注意,一般是一个表文件一个这种配置文件。
    这个sql映射文件是写 sql语句的,mybatis会执行这些sql。
    对于这个sql映射文件的解释:
    1.指定约束文件
        <!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
        mybatis-3-mapper.dtd : 是约束文件的名称,扩展名是dtd的。
    2. 约束文件的作用
        限制、检查在当前文件中出现的标签,属性必须符合mybatis的要求。
    3.mapper(sql mapper 这个mapper就是映射的意思):是当前文件的根标签。必须的,不可以改变。
        namespace :叫做命名空间,这个空间是一个唯一值。可以是自定义的字符串
                    要求使用dao接口的【全限定名称】。定位的这个接口,而不是这个xml配置文件
                    【全限定名称】 = 包名 + 接口名(类名)
        <mapper namespace="com.yunbocheng.dao.StudentDao">
    4. 在当前文件中,可以使用特定的标签,表示数据库的特定操作。
       <select> : 表示执行查询,执行的是select语句。
       <update> : 表示更新数据库的操作,就是在<update>标签中写的是update sql语句
       <insert> : 表示插入,放的是insert语句
       <delete> : 表示删除,执行的delete语句
   5. 编写sql语句
         <select id="selectstudents" resultType="Student">
        /* 此时会将以下的数值依此赋值给Student对象 */
        select id,name,email,age from student order by id;
        </select>
        id : 代表执行的sql语句的唯一标识,mybatis会使用这个id的值来找到要
             执行的sql语句。这个id值可以自定义。但是要求使用接口中的方法名称。
             就相当于使用这个id值来代表这条sql语句。
        resultType : 代表结果的类型,是sql语句执行后得到的ResultSet,
                     遍历这个ResultSet得到Java对象的类型。
                     这个值写类型的全限定名称。
                    也就是把查询到的数据传递给com.yunbocheng.entity.Student类
                    此时MyBatis会自动创建出的一个student对象。并给属性赋值。
                    MyBatis会把从数据库中的id值赋给Student类中id的属性。
                    MyBatis会把从数据库中的name值赋给Student类中name的属性。
                    MyBatis会把从数据库中的email值赋给Student类中email的属性。
                    MyBatis会把从数据库中的age值赋给Student类中age的属性。
                    返回的这个类型和接口中方法的返回类型一致,都是一个student对象的集合。
     以上就是一个标准的 mybatis配置文件。
复制代码


7.传入参数


  • 传入参数 :从java代码(也就是测试程序中的代码)中把数据传入到mapper文件的sql语句中。


8. 深入理解参数


8.1 parameterType 参数


8.1.1 parameterType 介绍


  • *parameterType *: 接口中方法参数的类型, 类型的完全限定名或别名。这个属性是可选的,因为 MyBatis 可以推断出具体传入语句的参数,默认值为未设置(unset)。接口中方法的参数从 java 代码传入到 mapper 文件的 sql 语句。
  • 什么是parameterType :写在mapper文件中的 一个属性。 表示dao接口中方法的参数的数据类型。
    例如StudentDao接口 :public Student selectStudentById(Integer id)
  • parameterType : dao接口中方法参数的数据类型。
    parameterType 它的值是 Java的数据类型全限定名称或者是mybatis定义的别名 (这个别名可以在mybatis官方文档中查询到)。

例如 :

parameterType = "java.lang.Integer"

parameterType = "int"

int 或 java.lang.Integer

hashmap 或 java.util.HashMap

list 或 java.util.ArrayList student 或 com.yunbocheng.domain.Student

  • 注意 :parameterType 参数*不是强制的 *,mybatis通过反射机制能够发现接口参数的数据类型,可以不存在,一般我们不写。
  • select、insert、update、delete 都可以使用parameterType 指定数据类型。


8.1.2 parameterType 使用方式


  • 第一步 :在接口中声明一个带有参数抽象方法。(此时传递的参数是 :整型的id值)
    微信截图_20220608220317.png
  • 第二步 : 在mapper文件中写出查询数据库的语句。(此时是通过id查询数据)
    微信截图_20220608220335.png
    以上 parameterType 使用的是 Java数据类型的全限定名称
    微信截图_20220608220348.png
    以上省略了parameterType ,使用的是 parameterType的默认值。默认值为未设置(unset)
    微信截图_20220608220359.png
    以上 parameterType 使用的是mybatis定义的别名
  • 第三步 :这个是测试类代码,也就是要传递到mapper中的参数代码。(此时传递的id值是1005)
  • 声明*@Test*之后代表这是一个测试类,*不需要使用psvm(主函数)*也可以进行运行,如果不写@Test即不声明是一个测试类,此时需要放在主函数中才可以运行。
    微信截图_20220608220532.png
    这个时候mybatis会自动将1005这个值传递给 mapper文件中的占位符 id=#{id}
  • 以上三步就完成对特定参数的查询数据。(此时查询的是id=1005的数据)。


8.2 传入一个简单参数


  • dao 接口中方法的参数只有一个简单类型(java 基本类型和 String),占位符 #{ 任意字符 },和方 法的参数名无关。
  • 传递一个简单的参数使用 占位符 #{}
  • 一个简单类型的参数:mybatis把java的基本数据类型(包括包装类)String都叫简单类型。
    比如 :下边的这个就叫一个简单的参数。

微信截图_20220608220652.png

  • 在mapper文件中获取简单类型的一个参数的值,使用占位符 :#{任意字符}
    以下两段代码代表的含义是一样的。#{任意字符}
    微信截图_20220608220706.png
  • 查询id=1005,的student。mybatis会自动将这个1005传递给占位符id
    微信截图_20220608220753.png
  • MyBatis传递参数 :从 java 代码中把参数传递到 mapper.xml 文件。


8.3 MyBatis是封装的JDBC操作


  • 使用占位符 :#{}之后,mybatis执行sql是使用的jdbc中的PreparedStatement对象。
  • 由mybatis执行下面的代码:(mybatis中的占位符 :#{}相当于jdbc中的
  • 注意 :一个 #{}对应一个?
  1. mybatis创建Connection , PreparedStatement 对象
// 以下这些代码都是在mapper文件中的操作,是MyBatis帮我们操作的。
String sql = "select id,name,email,age from student where id= ?";
PreparedStatement pst = conn.PreparedStatement(sql);
pst.setInt(1,1001);
复制代码
  1. 执行sql封装为 resultType = "com.yunbocheng.domain.Student" 这个对象。
ResultSet rs = ps.executeQuery();
Student student = null;
while(rs.next()){
    // 从数据库取出id=1001的这一行数据,存储到一个java对象属性中。
    // 注意 :在Student类中必须有每个属性的set/get,以及创建对象时的无参构造。
    student = new Student();
    student.setId(rs.getInt("id"));
    student.setName(rs.getString("name"));
    student.setEmail(rs.getString("email"));
    student.setAge(rs.getInt("age"));
    // 也可以将这些数据写在一个student类的有参构造的方法中。
    // 此时查询的是id=1001这个对象,而不是一多个student,此时不用放在一个集合中。
}
return student;  
// 把mapper文件中查询到的这个student赋给了dao方法调用的返回值。也就是以下这段代码
// 以下这段代码是测试类代码
Student student = dao.selectStudentById(1001);
System.out.println("student = " + student);
复制代码


8.2 传入多个参数


8.2.1 [必须掌握] 多个参数-使用@Param命名参数。


  • 当 Dao 接口方法多个参数,需要通过名称使用参数。在方法形参前面加入*@Param(“自定义参数名”), mapper 文件使用#{自定义参数名}。*
  • *重点 :这里必须保证mapper 文件使用#{自定义参数名}。*中的自定义参数名与 @Param(“自定义参数名”)中的自定义参数名一致。
  • 定义格式:
// 在接口中,使用 @Param(“自定义参数名”) 形式
public List<Student> selectMulitParam(@Param("myname") String name ,                                              @Param("myage") Integer age);
复制代码
<!--mapper文件中,使用#{自定义参数名}形式。-->
<select>
    select * from student where name = #{myname} or age = {myage}
</select>
复制代码
  • 使用@Param命名参数传递多个参数
    第一步 :创建包含多个参数的接口
    微信截图_20220608220947.png
    第二步 : 创建传递多个参数的查询语句。

微信截图_20220608221005.png

注意 :必须保证接口中的自定义参数名 与 mapper文件中的自定义参数名一致

第三步 : 使用测试类传递参数,将参数传递给 mapper文件返回最后的结果。

微信截图_20220608221022.png

以上查询的是 : 名字是程云博以及年龄是50的student数据。


8.2.2 [用的最多] 多个参数-使用对象传递参数。


  • 使用 java 对象传递参数, java 的属性值就是 sql 需要的参数值。 每一个属性就是一个参数。
  • 语法格式 :
#{ property,javaType=java 中数据类型名,jdbcType=数据类型名称 }
// javaType, jdbcType 的类型 MyBatis 可以检测出来,一般不需要设置。
// 常用格式 
#{ property }
复制代码
  • 第一步 :先创建一个Java类,使用这个Java类的对象中的属性值来传递参数信息。
    微信截图_20220608221144.png
    注意 :在这个类中要声明属性值,以及无参构造,以及set/get方法。
    第二步 : 在dao接口中创建一个参数为以上QueryParma类的对象的抽象方法。
    微信截图_20220608221158.png
    注意 :这个返回值是一个Student对象集合,而不是QueryParma对象集合。
    注意 :这个并不一定非要创建出另外一个类,使用现有的Student类完全没问题。只不过是其中的属性值的数量不同
    第三步 : 在mapper文件中,创建使用该抽象方法查询数据库的SQL语句。
    微信截图_20220608221217.png
    javaType对应的就是 :这个数据类型的 全限定名称 java.lang.String。
    jdbcType对应的就是 :由mybatis提供的(见下表)
    微信截图_20220608221229.png
    注意 :这个语句有原始语句与简写语句之分。
    原始语句 :
    微信截图_20220608221435.png
    简化语句 :
    微信截图_20220608221447.png
    注意 :mapper文件中的定位符#{自定义名称},必须和QueryParma(传递参数的类)类中属性值的名称一致
    第四步 :使用测试类来创建传递参数的QueryParma对象,输出查询结果
    微信截图_20220608221529.png
    以上查询出的是名称为程云博和年龄为50的数据。


8.2.3 [了解] 多个参数-按位置


  • 参数位置从 0 开始, 引用参数语法 #{ arg 位置 } , 第一个参数是#{arg0}, 第二个是*#{arg1}*
  • 注意:mybatis-3.3 版本和之前的版本使用#{0},#{1}方式, 从 mybatis3.4 开始使用#{arg0}方式。也就是现在使用的是 #{arg0}的语法格式。
  • 其中 agr是关键字,是固定的,不可以改变,只能改变这个位置信息。

第一步:在接口中创建抽象方法

注意 :抽象方法中的参数从左到右进行编号,比如下边的这个参数,name位置是0age是1。

网络异常,图片无法展示
|

第二步 :在mapper文件中创建SQL语句

网络异常,图片无法展示
|

**注意 :在mybatis3.4之后开始使用 #{arg0}的语法格式,我们这里使用的是3.5.7版本。

注意 :#{arg0}对应的是name,如果将name对应的#{arg0}改为#{arg1},此时会将age的值传递给name,此时会赋值反。结果会变为 name = 20 age = 程云博。

第三步 :在测试类中显示查询结果

网络异常,图片无法展示
|

此时查询到的就是name是程云博或者年龄是20岁的信息。


8.2.4[了解] 多个参数-使用Map


  • Map 集合可以存储多个值,使用Map向 mapper 文件一次传入多个参数。
  • Map 集合使用 String的 keyObject 类型的值存储参数
  • mapper 文件使用 # { key } 引用参数值。

第一步 :在接口中创建抽象方法,使用的是Map集合,返回值是Student对象集合。

微信截图_20220608221656.png

第二步 :在mapper文件中创建SQL语句 语法格式 :#{map的key值}

微信截图_20220608221713.png

注意 :这个key值必须和测试类中创建的Map中的key值一致。

第三步 :在测试类中显示查询结果

微信截图_20220608221727.png

注意 : 在我们日常的开发中,不建议参数是Map集合,因为什么信息也表达不出来,可读性差,不建议使用。

  • 以上四种传递多个参数的方式,我们掌握前两个即可,后两个作为了解。


9. 两个占位符比较 (#和$的区别)


  • #与$所实现的效果是一样的,只是内部执行的方式不一样。


9.1 #占位符


  • #:占位符告诉 mybatis 使用实际的参数值代替。 并使用 PrepareStatement 对象执行 sql 语句,
  • #{…}代替 sql 语句的“?”。这样做更安全,更迅速,通常也是首选做法。
<!--maper 文件,使用的是 #占位符-->
<select id="selectById" resultType="com.yunbocheng.entity.Student">
 select id,name,email,age from student where id=#{studentId}
</select>
复制代码
<!--转为 MyBatis 的执行是:-->
String sql=” select id,name,email,age from student where id=?”;
PreparedStatement ps = conn.prepareStatement(sql);
ps.setInt(1,1005);
复制代码
<!--解释:-->
where id=? 就是 where id=#{studentId}
<!--此时#{studentId}会替换掉?-->
ps.setInt(1,1005) , 1005 会替换掉 #{studentId}
复制代码


9.2 $ 字符串替换


  • 字符串替换∗,告诉mybatis使用∗ 字符串替换*,告诉 mybatis 使用*mybatis使包含的“字符串”替换所在位置
  • 使用 Statement对象把 sql 语句和${}中的内容连接起来
  • :可以替换表名或者列名,你能确定数据是安全的。可以使用:可以替换表名或者列名, 你能确定数据是安全的。可以使用:使
  • 注意 :使用$符号的时候是完成字符串的拼接,此时必须满足SQL语句的格式。
    微信截图_20220608222043.png
    此时需要使用*" '李四' "*这种格式,才能保证拼接完的字符是以下格式(正确的SQL格式)
    微信截图_20220608222059.png

将两个语句放在一起比较

<!--使用 #占位符的结果-->
<!--这个原理是 :将#{studentId}代表的值替换掉SQL语句中的 ? 占位符-->
<!--替换-->
select id,name, email,age from student where id=#{studentId}
    # 的结果: select id,name, email,age from student where id=? 
<!--使用 $字符串拼接的结果-->
<!--这个原理是 :将${studentId}代表的值拼接到SQL语句最后的 id = 的后边-->
<!--拼接-->
select id,name, email,age from student where id=${studentId}
    $ 的结果:select id,name, email,age from student where id=1001
复制代码


9.3 # 与 的区别(面试题)


  • #使用 ?在sql语句中做站位的, 使用PreparedStatement执行sql,效率高
  • #能够避免sql注入,更安全。
  • $不使用占位符,是字符串连接方式,使用Statement对象执行sql,效率低
  • $有sql注入的风险,缺乏安全性。
  • $:可以替换表名或者列名


相关文章
SQL XML Java
32 0
|
25天前
|
SQL Java 数据库连接
区分iBatis与MyBatis:两个Java数据库框架的比较
总结起来:虽然从技术角度看,iBATIS已经停止更新但仍然可用;然而考虑到长期项目健康度及未来可能需求变化情况下MYBATISS无疑会是一个更佳选择因其具备良好生命周期管理机制同时也因为社区力量背书确保问题修复新特征添加速度快捷有效.
65 12
|
1月前
|
SQL XML Java
MyBatis框架如何处理字符串相等的判断条件。
总的来说,MyBatis框架提供了灵活而强大的机制来处理SQL语句中的字符串相等判断条件。无论是简单的等值判断,还是复杂的条件逻辑,MyBatis都能通过其标签和属性来实现,使得动态SQL的编写既安全又高效。
149 0
|
6月前
|
Oracle 关系型数据库 Java
|
6月前
|
SQL 缓存 Java
框架源码私享笔记(02)Mybatis核心框架原理 | 一条SQL透析核心组件功能特性
本文详细解构了MyBatis的工作机制,包括解析配置、创建连接、执行SQL、结果封装和关闭连接等步骤。文章还介绍了MyBatis的五大核心功能特性:支持动态SQL、缓存机制(一级和二级缓存)、插件扩展、延迟加载和SQL注解,帮助读者深入了解其高效灵活的设计理念。
|
6月前
|
SQL XML Java
一、MyBatis简介:MyBatis历史、MyBatis特性、和其它持久化层技术对比、Mybatis下载依赖包流程
一、MyBatis简介:MyBatis历史、MyBatis特性、和其它持久化层技术对比、Mybatis下载依赖包流程
257 69
|
8月前
|
SQL Java 数据库连接
对Spring、SpringMVC、MyBatis框架的介绍与解释
Spring 框架提供了全面的基础设施支持,Spring MVC 专注于 Web 层的开发,而 MyBatis 则是一个高效的持久层框架。这三个框架结合使用,可以显著提升 Java 企业级应用的开发效率和质量。通过理解它们的核心特性和使用方法,开发者可以更好地构建和维护复杂的应用程序。
376 29
|
10月前
|
SQL Java 数据库连接
持久层框架MyBatisPlus
持久层框架MyBatisPlus
213 1
持久层框架MyBatisPlus
|
11月前
|
缓存 Cloud Native 安全
探索阿里巴巴新型ORM框架:超越MybatisPlus?
【10月更文挑战第9天】在Java开发领域,Mybatis及其增强工具MybatisPlus长期占据着ORM(对象关系映射)技术的主导地位。然而,随着技术的发展,阿里巴巴集团推出了一种新型ORM框架,旨在提供更高效、更简洁的开发体验。本文将对这一新型ORM框架进行探索,分析其特性,并与MybatisPlus进行比较。
398 0
|
11月前
|
Java 数据库连接 mybatis
Springboot整合Mybatis,MybatisPlus源码分析,自动装配实现包扫描源码
该文档详细介绍了如何在Springboot Web项目中整合Mybatis,包括添加依赖、使用`@MapperScan`注解配置包扫描路径等步骤。若未使用`@MapperScan`,系统会自动扫描加了`@Mapper`注解的接口;若使用了`@MapperScan`,则按指定路径扫描。文档还深入分析了相关源码,解释了不同情况下的扫描逻辑与优先级,帮助理解Mybatis在Springboot项目中的自动配置机制。
619 0
Springboot整合Mybatis,MybatisPlus源码分析,自动装配实现包扫描源码