mabatis

SSM框架 :spring (S)、springMVC(S) 、mybatis(M)

mabatis:

1 概述:

​ mybatis是一个优秀的基于 java 的持久层框架,它内部封装了 jdbc,使开发者只需要关注 sql 语句本身,而不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁杂的过程。
mybatis通过 xml 或注解的方式将要执行的各种statement配置起来,并通过java对象和statement 中sql 的动态参数进行映射生成最终执行的 sql 语句,最后由 mybatis 框架执行 sql 并将结果映射为 java 对象并返回。
采用 ORM 思想解决了实体和数据库映射的问题,对 jdbc进行了封装,屏蔽了 jdbc api 底层访问细节,使我们不用与 jdbc api 打交道,就可以完成对数据库的持久化操作。

2 需要材料:在这里插入图片描述

​ 持久层业务接口、domain实体类(最好实现Serializable接口,且必须要有无参构造)、xml配置文件、Maven坐标

2.1坐标:

<dependency>
	<groupId>org.mybatis</groupId>
	<artifactId>mybatis</artifactId>
	<version>3.4.5</version>
</dependency>

2.2 xml方式:

2.2.1 约束1:config约束:

<?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">

2.2.2 约束2:Mapper约束:

<?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">

2.3 xml配置文件详解:

2.3.1 config.xml配置文件

<configuration>   <!-- 配置 mybatis 的环境 -->
    <properties resource="文件类路径名" />				<!-- 配置 属性文件, -->
    <settings name="" value=""/>					<!-- 配置 全局 -->		
    <typeAliases>	<!-- 配置 类型别名 -->
		<typeAlias alias="别名 " type="全限定类名"/>		<!-- 单个别名定义,可以多个 -->
		<!-- 批量别名定义,扫描整个包下的类,别名为类名(首字母大小写都可以),可以多个 -->
		<package name="包路径"/>
    </typeAliases>			
    <typeHandlers></typeHandlers>				<!--类型处理器,一般不会自定义 -->
    <objectFactory></objectFactory>					<!-- 配置对象工厂,一般不会自定义 -->
    <plugins></plugins>							<!-- 配置 插件 -->
    
	<environments default="mysql">					<!-- 配置 默认选用的环境-->
		<environment id="mysql">					<!-- 配置 mysql 的环境 -->
			<transactionManager type="JDBC"/> 		 <!-- 配置事务的类型 -->
			<dataSource type="POOLED">		 <!-- 配置连接数据库的信息:用的是数据源(连接池)-->
				<property name="driver" value=" />
				<property name="url" value=" />
				<property name="username" value=" />
				<property name="password" value=" />
			</dataSource>
		</environment>
	</environments>
    <!-- 告知 mybatis 映射配置的位置 -->
<mappers>
	<mapper resource=" "></mapper>  <!--resource指向的是相对于类路径下的目录-->
    <package name="包路径名"></package>	 <!--将对应包下所有的接口进行映射-->
</mappers>
关于environment的使用:
配置指定环境:
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader/in, environment);
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader,environment,properties);
配置默认环境下:
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader);
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader,properties)
Setting参数详解

在这里插入图片描述

2.3.2 mapper配置文件

<mapper namespace="com.itheima.dao.IUserDao">   <!-- 接口映射配置的位置 -->
	<resultMap type="封装对象的全限定类名" id="标识符">
		<id column="数据库的主键" property="封装对象对应的字段"/>
		<result column="数据库的列名" property="要封装的字段名"/>
        ......
        <association property="封装对象字段名" javaType="封装对象类型">
			<id column="数据库的主键" property="封装对象对应的字段"/>
			<result column="数据库的列名" property="要封装的字段名"/>
			......
		</association>
        <association property="延迟加载封装对象字段名" javaType="延迟加载封装对象类型"
			select="查询语句字表"
			column="传递的参数(数据库的列名)">
		</association>
        
        
        <!--
			collection 是用于建立一对多中集合属性的对应关系  	ofType 用于指定集合元素的数据类型
		-->
        <collection property="封装对象字段名" ofType="封装对象类型">
			<id column="数据库的主键" property="封装对象对应的字段"/>
			<result column="数据库的列名" property="要封装的字段名"/>
			......
        </collection> 
        <collection property="延迟加载封装对象字段名" ofType="延迟加载封装对象类型" 
			select="Sql查询语句" column="传递的参数(数据库的列名)">
		</collection>
		</resultMap>
    
	<select id="接口方法" resultType="返回值类型">Sql语句(查询)</select> <!--Type自动映射-->
    <select id="接口方法" resultMap="返回值类型">Sql语句(查询)</select>  <!--Map手动指定映射-->
    <insert id="接口方法" parameterType="传入参数类型">Sql语句(插入)</insert>
    <insert id="接口方法" parameterType="传入参数类型">Sql语句(插入)
    	<!--  配置保存时获取插入的 id -->
		<selectKey keyColumn="id" keyProperty="id" resultType="int">
        	select last_insert_id();
		</selectKey>	
    </insert>
    <update id="接口方法" parameterType="传入参数类型">Sql语句(更新)</update>
    <delete id="接口方法" parameterType="传入参数类型">Sql语句(删除)</delete>
</mapper>   

sql语句允许有占位符,用 #{} 代表,它用的是 ognl 表达式。

ognl 表达式:它是 apache 提供的一种表达式语言,全称是:Object Graphic Navigation Language 对象图导航语言,它是按照一定的语法格式来获取数据的。语法格式就是使用 #{对象.对象}的方式。

{}中内容的写法:

由于我们保存方法的参数是 一个 引用数据类型 对象,此处要写该对象中的属性名称。传入参数类型可以是基本数据类型/字符串,也可是引用数据类型;基本数据类型和字符串对占位符标识无影响,按顺序注入。当引用数据类型时,该对象需要有get方法,且占位符内部为对象的字段。

3 代码使用:

public void test()throws Exception {
	//1.读取配置文件
	in = Resources.getResourceAsStream("SqlMapConfig.xml");
	//2.创建构建者对象
	SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
	//3.创建 SqlSession 工厂对象
	factory = builder.build(in);
	//4.创建 SqlSession 对象
	session = factory.openSession();
	//5.创建 Dao 的代理对象
	userDao = session.getMapper(IUserDao.class);
    //6 执行方法
      //userDao.......(接口方法)
    //提交事件,释放资源
    session.commit();
    session.close();
	in.close();
}

4 Mybatis 的事务控制

​ session = factory.openSession(); 未指定,默认开启手动提交事务

​ session = factory.openSession(true); 指定自动提交事务,关闭手动提交事务()

​ sqlSession.commit() 提交事务

5 mapper 配置文件灵活引用:

5.1 编写Sql片段:

<sql id="defaultSql">
    Sql语句片段
</sql>

5.2 引用Sql片段

<select>  
    <include refid="defaultSql"/> 
    续接的Sql语句 	
</select>

5.3 动态Sql ( if 、where、foreach)

<if test="条件语句 ">
	拼接的Sql语句
</if>
<where>
	<if test="条件语句 ">
	拼接的Sql语句
	</if>
	<if test="条件语句 ">
	拼接的Sql语句
	</if>
</where>
<where>
	<if test="条件语句">
		<foreach collection="ids" open="id in ( " close=")" item="uid" separator=",">
			#{uid}
		</foreach>
	</if>
</where>
<!--
	collection:代表要遍历的集合元素,注意编写时不要写#{}
	open:代表语句的开始部分
	close:代表结束部分item:代表遍历集合的每个元素,生成的变量名
	sperator:代表分隔符
-->

6 延迟加载:

按需查找(不用不查)

主配置:开启延迟加载

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

7 缓存系统:

一级缓存: SqlSession 范围的缓存。

​ 开启:默认开启

二级缓存: mapper 映射级别的缓存

​ 多个 SqlSession 去操作同一个 Mapper 映射的 sql 语句,多个SqlSession 可以共用二级缓存,二级缓存是跨 SqlSession 的。

开启:(默认开启)

<settings>
	<!-- 开启二级缓存的支持 -->
	<setting name="cacheEnabled" value="true"/>  
    <!--为 true 代表开启二级缓存;为false 代表不开启二级缓存。-->
</settings>

<mapper namespace="全限定类名">
<!-- 开启二级缓存的支持 -->
	<cache></cache>
</mapper>

8 注解开发

8.1 常用注解

@Insert: 实现新增

参数:(“sql语句”)

@Update: 实现更新

参数:(“sql语句”)

@Delete: 实现删除

参数:(“sql语句”)

@Select: 实现查询

参数:(“sql语句”)

@Result: 实现结果集封装

参数: id、column、property、one、many

​ @Result(id=true,column=“id”,property=“userId”)

​ id 是否是主键字段
column 数据库的列名
property 需要装配的属性名
one 需要使用的@One 注解(@Result(one=@One)()))
many 需要使用的@Many 注解(@Result(many=@many)()))

@Results: 可以与@Result 一起使用,封装多个结果集

参数: id、value

​ @Results(id=“userMap”,value= {@Result( 。。。), @Result( 。。。), … })

​ id: 唯一标识符,可以供其他引用 value:@Result集合

@ResultMap: 实现引用@Results 定义的封装

参数:id

​ @ResultMap(“userMap”)

​ 引用ResultMap的ID

@One: 实现一对一结果集封装

参数:select、fetchType

​ select 指定用的 来多表查询的 sqlmapper
fetchType 会覆盖全局的配置参数 lazyLoadingEnabled。是否 开启懒加载

@Many: 实现一对多结果集封装

参数:select、fetchType

​ select 指定用的 来多表查询的 sqlmapper
fetchType 会覆盖全局的配置参数 lazyLoadingEnabled。是否 开启懒加载

@SelectProvider: 实现动态 SQL 映射

参数:type 、method

​ type = SqlProvider.class,(自定义的包含Sql语句方法的类)

​ method = “selectUser” (自定义类中的方法)

@CacheNamespace: 实现注解二级缓存的使用

参数:blocking

​ blocking=true 开启缓存

猜你喜欢

转载自blog.csdn.net/weixin_43708926/article/details/88357329
今日推荐