java框架016——Spring整合MyBatis

一、MyBatis简介

MyBatis(前身是iBatis)是一个支持普通SQL查询、存储过程以及高级映射的持久层框架。
MyBatis框架也被称之为ORM(Object/Relation Mapping,即对象关系映射)框架。所谓的ORM就是一种为了解决面向对象与关系型数据库中数据类型不匹配的技术,它通过描述Java对象与数据库表之间的映射关系,自动将Java应用程序中的对象持久化到关系型数据库的表中。
在这里插入图片描述

1.1、MyBatis的下载和使用

在这里插入图片描述使用MyBatis框架非常简单,只需在应用程序中引入MyBatis的核心包和需要的lib目录中的依赖包即可。

注意:如果底层采用的是MySQL数据库,那么还需要将MySQL数据库的驱动JAR包添加到应用程序的类路径中;如果采用其他类型的数据库,则同样需要将对应类型的数据库驱动包添加到应用程序的类路径中。

1.2、MyBatis 环境配置

在这里插入图片描述

二、MyBatis的工作原理

在这里插入图片描述

2.1、什么是SqlSessionFactory?

SqlSessionFactory是MyBatis框架中十分重要的对象,它是单个数据库映射关系经过编译后的内存镜像,其主要作用是创建SqlSession

SqlSessionFactory对象的实例可以通过SqlSessionFactoryBuilder对象来构建,而SqlSessionFactoryBuilder则可以通过XML配置文件或一个预先定义好的Configuration实例构建出SqlSessionFactory的实例。

通过XML配置文件构建出的SqlSessionFactory实例现代码如下:

InputStream inputStream = Resources.getResourceAsStream("配置文件位置");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

SqlSessionFactory对象是线程安全的,它一旦被创建,在整个应用执行期间都会存在。如果我们多次的创建同一个数据库的SqlSessionFactory,那么此数据库的资源将很容易被耗尽。为此,通常每一个数据库都会只对应一个SqlSessionFactory,所以在构建SqlSessionFactory实例时,建议使用单列模式

SqlSession是MyBatis框架中另一个重要的对象,它是应用程序与持久层之间执行交互操作的一个单线程对象,其主要作用是执行持久化操作。
使用完SqlSession对象后要及时关闭,通常可以将其放在finally块中关闭。
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
// 此处执行持久化操作
} finally {
sqlSession.close();
}

三、MyBatis HelloWorld

提示:参照MyBatis官方文档

根据数据表创建Member类
创建MyBatis配置文件mybatis-config.xml
获取SqlSessionFactory
配置MemberMapper.xml文件
在mybatis-config.xml中加入MemberMapper.xml配置
执行查询操作
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
log4j.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
 
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
 
 <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
   <param name="Encoding" value="UTF-8" />
   <layout class="org.apache.log4j.PatternLayout">
    <param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS} %m  (%F:%L) \n" />
   </layout>
 </appender>
 <logger name="java.sql">
   <level value="debug" />
 </logger>
 <logger name="org.apache.ibatis">
   <level value="info" />
 </logger>
 <root>
   <level value="debug" />
   <appender-ref ref="STDOUT" />
 </root>
</log4j:configuration>

在这里插入图片描述
在这里插入图片描述

MyBatis全局配置文件
Mapper映射文件
SQL语句的参数传递
关联查询
动态SQL

四、基于Mapper(就是之前的dao开发)接口开发的HelloWorld

实现流程:

1、定义MemberDao接口
2、将Dao接口与MyBatis关联起来
–绑定Dao接口与Mapper映射文件
–绑定Dao接口中的方法与Sql语句
–分别通过Mapper映射文件中的namespace与sql语句所在节点的id
3、获取MyBatis生成的Dao实现的代理对象
4、调用接口的相关方法完成数据库操作

附:配置自动提示
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
基于mapper的开发,不用写dao的接口实现,而是通过Mapper.xml文件配置自动实现
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可以看出,MyBatis开发的关键
1、全局配置文件mybatis-config.xml
2、接口对应的Mapper映射文件

五、MyBatis全局配置文件

在MyBatis框架的核心配置文件中,<configuration>元素是配置文件的根元素,其他元素都要在<configuration>元素内配置。

在这里插入图片描述

5.1、<properties>元素

<properties>是一个配置属性的元素,该元素通常用来将内部的配置外在化,即通过外部的配置来动态的替换内部定义的属性。例如,数据库的连接等属性,就可以通过典型的Java属性文件中的配置来替换,具体方式如下:
1.编写db.properties

  jdbc.driver=com.mysql.cj.jdbc.Driver
  jdbc.url=jdbc:mysql://localhost:3306/mybatis
  jdbc.username=root
  jdbc.password=root

2.配置<properties... />属性

<properties resource="db.properties" />

3.修改配置文件中数据库连接的信息

<dataSource type="POOLED">
    <!-- 数据库驱动 -->
    <property name="driver" value="${jdbc.driver}" />
    <!-- 连接数据库的url -->
    <property name="url" value="${jdbc.url}" />
    <!-- 连接数据库的用户名 -->
    <property name="username" value="${jdbc.username}" />
    <!-- 连接数据库的密码 -->
    <property name="password" value="${jdbc.password}" />
</dataSource>

实例介绍:
在这里插入图片描述

5.2、<settings>元素

<settings>元素主要用于改变MyBatis运行时的行为,例如开启二级缓存、开启延迟加载等。
<settings>元素中的常见配置请参见教材表7-1,这些配置在配置文件中的使用方式如下:

<!-- 设置 -->
     <settings>
         <setting name="cacheEnabled" value="true" />
         <setting name="lazyLoadingEnabled" value="true" />
         <setting name="multipleResultSetsEnabled" value="true" />
         <setting name="useColumnLabel" value="true" />
         <setting name="useGeneratedKeys" value="false" />
         <setting name="autoMappingBehavior" value="PARTIAL" />
         ...
     </settings>

实例介绍:
在这里插入图片描述

5.3、<typeAliases>元素

<typeAliases>元素用于为配置文件中的Java类型设置一个简短的名字,即设置别名。别名的设置与XML配置相关,其使用的意义在于减少全限定类名的冗余。
1、使用<typeAliases>元素配置别名的方法如下:

<typeAliases>
    <typeAlias type="com.dgut.mybatis.bean.Member" alias="Member"/> 
</typeAliases>

2、 当POJO类过多时,可以通过自动扫描包的形式自定义别名,具体如下:

<typeAliases>
    <package name="com.dgut.mybatis.bean"/>
</typeAliases>

注意:如果在程序中使用了注解,则别名为其注解的值。

实例介绍:
在这里插入图片描述
还可以使用<package name="com.dgut.mybatis.bean"/>代替<typeAlias type="com.dgut.mybatis.bean.Member" alias="Member"/>,但这时的别名默认就是这个包下的类名

5.4、<environments>元素

<environments>元素用于对环境进行配置。MyBatis的环境配置实际上就是数据源的配置,我们可以通过<environments>元素配置多种数据源,即配置多种数据库。
使用<environments>元素进行环境配置的示例如下:

     <environments default="development">
          <environment id="development">
      <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                   <property name="driver" value="${jdbc.driver}" />
                   <property name="url" value="${jdbc.url}" />
                   <property name="username" value="${jdbc.username}" />
                   <property name="password" value="${jdbc.password}" />
         </dataSource>
          </environment>
            ...
     </environments>

注意:如果项目中使用的是Spring+ MyBatis,则没有必要在MyBatis中配置事务管理器,因为实际开发中,会使用Spring自带的管理器来实现事务管理。

5.5、<mappers>元素

<mappers>元素用于指定MyBatis映射文件的位置,一般可以使用以下4种方法引入映射器文件,具体如下。
使用类路径引入

<mappers>
    <mapper resource=“MemberMapper.xml"/>
</mappers>

使用包名引入

<mappers>
    <package name="com.dgut.mybatis.dao"/>
</mappers>

注意:如果使用package批量导入Mapper配置文件时,接口类与对应的Mapper配置文件必须同名同位置。如果使用Spring+MyBatis进行开发时,可以不同。

实例介绍:
在这里插入图片描述

六、Mapper映射文件

完成数据库操作的关键在于Mapper映射文件。在映射文件中,<mapper>元素是映射文件的根元素,其他元素都是它的子元素。
在这里插入图片描述

6.1、<select>元素

<select>元素的常用属性
在这里插入图片描述
在这里插入图片描述

6.2、<insert>元素

<insert>元素用于映射插入语句,在执行完元素中定义的SQL语句后,会返回一个表示插入记录数的整数。
<insert>元素的配置示例如下:

<insert
      id="addCustomer"
      parameterType="com.itheima.po.Customer"
      flushCache="true"
      statementType="PREPARED"
      keyProperty=""
      keyColumn=""
      useGeneratedKeys=""
      timeout="20">

<insert>元素的属性与<select>元素的属性大部分相同,但还包含了3个特有属性,这3个属性的描述如下所示。
在这里插入图片描述
执行插入操作后,很多时候需要返回插入成功的数据生成的主键值,此时就可以通过上面讲解的3个属性来实现。
1.对于支持主键自助增长的数据库(如MySQL),可以通过如下配置实现:

<insert id="addCustomer" parameterType="com. po.Customer"
            keyProperty="id" useGeneratedKeys="true" >
      insert into t_customer(username,jobs,phone)
      values(#{username},#{jobs},#{phone})
</insert>

2.对于不支持主键自助增长的数据库(如Oracle),可以通过如下配置实现:

<insert id="insertCustomer" parameterType="com. po.Customer">
      <selectKey keyProperty="id" resultType="Integer" order="BEFORE">
            select if(max(id) is null, 1, max(id) +1) as newId from t_customer
      </selectKey>	        
      insert into t_customer(id,username,jobs,phone)
      values(#{id},#{username},#{jobs},#{phone})
</insert>

在这里插入图片描述
在这里插入图片描述

6.3、<update><delete>元素

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6.4、元素

在一个映射文件中,通常需要定义多条SQL语句,这些SQL语句的组成可能有一部分是相同的(如多条select语句中都查询相同的id、username、jobs字段),如果每一个SQL语句都重写一遍相同的部分,势必会增加代码量,导致映射文件过于臃肿。那么有没有什么办法将这些SQL语句中相同的组成部分抽取出来,然后在需要的地方引用

<sql>元素的作用就是定义可重用的SQL代码片段,然后在其他语句中引用这一代码片段。
定义一个包含id、username、jobs和phone字段的代码片段如下:

 <sql id="customerColumns">id,username,jobs,phone</sql>

上述代码片段可以包含在其他语句中使用,具体如下:

<select id="findCustomerById" parameterType="Integer"
            resultType="com.po.Customer">
    select <include refid="customerColumns"/>
    from t_customer 
    where id = #{id}
</select>

6.4.1、SQL语句的5种参数传递方式

1、单个普通(基本/包装+String)参数
——这种情况MyBatis可直接使用这个参数,不需要经过任何处理。
——取值:#{随便写}
在这里插入图片描述
#{ }括号里的参数名任意
在这里插入图片描述
2、POJO
——当这些参数属于我们业务POJO时,我们直接传递POJO
——取值: #{POJO的属性名}
在这里插入图片描述
#{ }括号里的参数名要对应传进来的POJO属性名
在这里插入图片描述

在这里插入图片描述
#{ }括号里的参数名要对应传进来的POJO属性名
在这里插入图片描述
3、多个参数
——任意多个参数,都会被MyBatis重新包装成一个Map传入。Map的key是param1,param2,或者arg0,arg1…,Map的key就是参数的值
——取值: #{arg0 arg1 arg2 … / param1 param2 …}
在这里插入图片描述
在这里插入图片描述
4、命名参数
——在Mapper接口种,为参数使用@Param起一个名字,MyBatis就会将这些参数封装进map中,key就是我们自己指定的名字
——取值: #{自己指定的名字 / param1 param2 … paramN}
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5、Map
——我们也可以封装多个参数为map,直接传递
——取值: #{使用封装Map时自己指定的key}
在这里插入图片描述
在这里插入图片描述

七、关联查询

7.1、<resultMap>元素

<resultMap>元素表示结果映射集,是MyBatis中最重要也是最强大的元素。它的主要作用是定义映射规则、级联的更新以及定义类型转化器等。
<resultMap>元素中包含了一些子元素,它的元素结构如下所示:

<resultMap type="" id="">
       <constructor>    	<!-- 类在实例化时,用来注入结果到构造方法中-->
             <idArg/>      	<!-- ID参数;标记结果作为ID-->
             <arg/>         <!-- 注入到构造方法的一个普通结果-->
       </constructor>  
       <id/>                <!-- 用于表示哪个列是主键-->
       <result/>           	<!-- 注入到字段或JavaBean属性的普通结果-->
       <association property="" />      <!-- 用于一对一关联 -->
       <collection property="" />       <!-- 用于一对多关联 -->
       <discriminator javaType="">      <!-- 使用结果值来决定使用哪个映射-->
            <case value="" />           <!-- 基于某些值的结果映射 -->
       </discriminator>	
</resultMap>

7.2、一对一(对应User与IdCard数据库表)

创建log4j.xml
创建mybatis-config.xml并完成配置
创建User与IdCard
创建UserMapper接口
public User getUserById(Integer id);
创建UserMapper映射文件
关联查询
——结果在resultMap中进行级联(Cascade)封装
——结果在resultMap中使用association封装
在这里插入图片描述
mybatis-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>
		 
		 <!-- 配置数据库连接要使用的外部资源 -->
		 <properties resource="db.properties" />
		 
		 <!-- 将数据库中的字段转换成小驼峰命名方式,例如member_id,转换成memberId -->
		 <settings>
		 	<setting name="mapUnderscoreToCamelCase" value="true"/>
		 </settings>
	 	 
	 	 <!-- 配置别名 -->
	 	 <typeAliases>
	 	 	<typeAlias type="com.dgut.mybatis.association.bean.User" alias="User"/>
	 	 </typeAliases>
	 	 
		 <!-- 配置数据库连接 -->
		 <environments default="development">
			 <environment id="development">
			 	<transactionManager type="JDBC"/>
				 <dataSource type="POOLED">
					 <property name="driver" value="${jdbc.driver}"/>
					 <property name="url" value="${jdbc.url}"/>
					 <property name="username" value="${jdbc.username}"/>
					 <property name="password" value="${jdbc.password}"/>
				 </dataSource>
			 </environment>
		 </environments>
		 
		 <!-- 将mapper文件的全局配置文件mybatis-config.xml关联起来 -->
		 <mappers>
		 	 <!-- 使用package将一个包下的所有mapper文件导入,此时:接口类与对应的Mapper配置文件必须`同名同位置` -->
		 	 <package name="com/dgut/mybatis/association/dao"/>
		 </mappers> 
		 
	</configuration>

在这里插入图片描述
重点
在这里插入图片描述

在这里插入图片描述
结果
在这里插入图片描述

7.3、一对一分步查询(在7.2的基础上进行)

UserMapper接口添加方法:
public User getUserByIdStep(Integer id);
创建IdCard接口
public IdCard getIdCardByNo(String no);
创建IdCard映射文件
在UserMapper映射文件中分步查询
在association中使用select属性调用IdCardMapper的getIdCardByNo
懒加载

<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"/>

在这里插入图片描述
在这里插入图片描述
在上面的7.2的全局配置文件mybatis-config.xml的基础上添加下面两个属性和对应的值
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7.4、一对多(对应User与Order数据库表)

1、创建Order,OrderMapper接口,OrderMapper映射文件
2、User类中添加List<Order>
3、UserMapper接口中添加
public User getUserWithOrdersById(Integer id);
4、在UserMapper映射文件中进行关联查询
结果在resultMap中使用collection封装

7.5、多对多(对应Order与Product数据库表)

7.6、动态SQL语句

开发人员在使用JDBC或其他类似的框架进行数据库开发时,通常都要根据需求去手动拼装SQL,这是一个非常麻烦且痛苦的工作,而MyBatis提供的对SQL语句动态组装的功能,恰能很好的解决这一麻烦工作。

7.6.1、<if>

<if>元素是最常用的判断语句,它类似于Java中的if语句,主要用于实现某些简单的条件选择。其基本使用示例如下:
在这里插入图片描述

7.6.1、<choose><when><otherwise>

在MyBatis中,<if>元素是最常用的判断语句,它类似于Java中的if语句,主要用于实现某些简单的条件选择。其基本使用示例如下:
在这里插入图片描述

7.6.1、<where><trim>

在前面的案例中,映射文件中编写的SQL后面都加入了“where 1=1”的条件,那么到底为什么要这么写呢?如果将where后“1=1”的条件去掉,那么MyBatis所拼接出来的SQL将会如下所示:
在这里插入图片描述
可以看出上面SQL语句明显存在SQL语法错误,而加入了条件“1=1”后,既保证了where后面的条件成立,又避免了where后面第一个词是and或者or之类的关键词。不过“where 1=1”这种写法对于初学者来将不容易理解,并且也不够雅观。

针对上述情况中“where 1=1”,在MyBatis的SQL中就可以使用
在这里插入图片描述

7.6.1、<set>

在MyBatis中可以使用动态SQL中的<set>元素进行处理:
在这里插入图片描述

7.6.1、<foreach>

在这里插入图片描述

针对上述需求,理想的解决方法就是使用MyBatis中动态SQL的元素进行处理。其基本使用示例如下所示:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值