Mybatis简介

Mybatis简介

Mybatis是一个开源的数据持久层框架;

其主要思想是将程序中的大量SQL语句剥离出来,可以在不修改程序代码的情况下,直接在配置文件中修改SQL;

本身就很小,且简单没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。

特性

​ 动态SQL、ORM、自带CaChe、Mapper映射、底层JDBC(简化了JDBC的操作)

搭建Mybatis环境

以下步骤可以实现一个简单的Hello World:

​ 1、下载相应的jar包;

​ 2、部署jar包;

​ 3、编写Mybatis核心配置文件;

​ 4、创建实体类;

​ 5、创建DAO接口;

​ 6、创建SQL映射文件;

​ 7、编写测试类;

​ (1)使用Resources.getResourceAsStream();方法读取配置文件;

​ (2)SqlSessionFactoryBuilder().build();通过这个方法生产SqlSessino;

​ (3)通过SqlSession.openSession()打开连接;

​ 注意:如果要开启事务,在openSession()方法中填入true;

​ (4)通过getMapper()方法获取到接口实例;调用方法ok了;

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">
<mapper namespace="Mapper接口全类名路径">
  
</mapper>

<!--
	目录结构:
	根节点:mapper
		属性:namespace="接口的完整限定名"
	子节点:
		select,查询sql
		  属性:
			id,名字,一个xml文件里面不能有相同的名字
			返回结果:
				resultType:当前查询的返回结果的类型
					一定是已经存在的数据类型
				resultMap:自己封装key
			  注意:同时存在的时候,优先使用resultMap
			resultMap标签:
				自己封装结果集
				id属性:名字
				type属性:引用数据(自己定义的类)
				什么时候用:实体和表字段不对应的时候
			条件:
				占位符:
					${}
					#{}
			查询条件:
				parameterType:数据类型
				parameterMap:自己封装的map
			模糊查询:
				concat()
				
		  都有一个返回值,是int类型,表示受影响行数
		insert,新增
			<insert id=名字 parameterType=""
		update,修改
		delete,删除

		<resultMap
		<select id="名字" resultMap resultType parameterType parametermap 
			resultMap:自己封装
			resultType:已经存在
-->

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">
<configuration>
	<environments default="development">
		<environment id="development">
			<transactionManager type="JDBC" />
			<dataSource type="POOLED">
				<property name="driver" value="com.mysql.jdbc.Driver" />
				<property name="url" value="jdbc:mysql://localhost:3306/mybatis" />
				<property name="username" value="root" />
				<property name="password" value="123456789" />
			</dataSource>
		</environment>
	</environments>
	
	
	<!-- 将我们写好的sql映射文件一定要注册到全局配置文件中 -->
	<mappers>
		<mapper class="" />
      	<mapper recource="" />
	</mappers>
</configuration>

<!--
     改变mybatis的行为:
            setting 
-->
<!--
全局配置文件属性解析:
<properties>:mybatis可以使用properties来引入外部properties配置文件的内容;
resource:引入类路径下的资源
url:引入网络路径或者磁盘路径下的资源
<settings>包含很多重要的设置项
<setting/>:用来设置每一个设置项
name:设置项名
value:设置项取值
<typeAliases>:别名处理器
<typeAlias/>:为某个java类型起别名
type:指定要起别名的全类名;默认别名就是类名小写
alias:指定新的别名
<package>:为某个包下的所有类批量起别名
name:指定包名(为当前包以及下面所有的后代包的每一个类都起一个默认别名)
批量起别名的情况下,如果类名重复,使用@Alias注解为类添加别名。(在类名上面添加@Alias)
注意!:别名不区分大小写
<environments>:环境们,mybatis可以配置多种环境
default指定使用某种环境。可以达到快速切换环境
<environment>:配置一个具体的环境信息;必须要有以下两个标签
id代表当前环境的唯一标识
<transactionManager>:事务管理器
type:事务管理器的类型;有两种:JDBC|MANAGED
JDBC:代表使用JDBC的方式来进行事务回滚操作
MANAGED:使用J2ee用容器的方式来进行咱们事务的控制
自定义事务管理器:实现TransactionFactory接口.type指定为全类名
<dataSource>:数据源;
type:数据源类型;
UNPOOLED:不使用连接池的技术,每一次的增删改查操作都会从数据库中拿一个新的连接
POOLED:使用连接池技术
JNDI:使用JNDI技术
自定义数据源:实现DataSourceFactory接口,type是全类名
<databaseIdProvider>:支持多数据库厂商的
type="DB_VENDOR";DB_VENDOR是一个别名(VendorDatabaseIdProvider)
作用就是得到数据库厂商的标识(驱动getDatabaseProductName()),
mybatis就能根据数据库厂商标识来执行不同的sql;
<property/>:在databseIdProvider标签内下这个标签(property)的作用:是为不同数据库厂商起别名
databaseId:<select>中的属性,作用是表示此条sql语句在那个数据库下运行 例:databaseId="Mysql"
<mappers>:将sql映射注册到全局配置中
<mapper/>:每一个mapper注册一个sql映射文件
注册配置文件
resource:引用类路径下的sql映射文件
url:引用网络路径或者磁盘下的sql映射文件
注册接口
class:引用(注册)接口,
1、有sql映射文件,映射文件名必须与接口同名,并且放在与接口同一级目录下;
2、没有sql映射文件,所有的sql都是利用注解写在接口上;
在接口方法上方写上@select("")或者其他的sql操作语句;格式为:@加操作语句
-->

实体映射关系

一对一
<association property="role">
        <id column="roleId" property="id"></id>
        <result column="rname" property="name"></result>
</association>
一对多
<collection property="List" ofType="pojo.Permission">
        <id column="permissionId" property="id"></id>
        <result column="pname" property="name"></result>
</collection>

mybatis的缓存

一级缓存:只在一个sqlsession里面有效
二级缓存:在一个mapper里面有效
	每一个mapper文件的二级缓存是被关闭的
		在mapper文件里面:<cache />
		
MyBatis包含一个非常强大的查询缓存特性,它可以非常方便地配置和定制。缓存可以极大的提升查询效率。
MyBatis系统中默认定义了两级缓存。
一级缓存和二级缓存:
1、默认情况下,只有一级缓存(SqlSession级别的缓存,也称为本地缓存)开启。
2、二级缓存需要手动开启和配置,他是基于namespace级别的缓存。
3、为了提高扩展性。MyBatis定义了缓存接口Cache.我们可以通过实现Cache接口来自定义二级缓存
一级缓存:(本地缓存):sqlSession级别的缓存。一级缓存是一直开启的;我们没法关闭;一级缓存相当于SqlSession级别的一个map
与数据库同一次会话期间查询到的数据会放在本地缓存中。
以后如果需要获取相同的数据,直接从缓存中拿,没必要再去查数据库。
一级缓存失效情况(没有使用到当前一级缓存的情况,还需要再向数据库发送sql):
1、sqlSession不同;
2、sqlSession相同,查询条件不同(当前一级缓存中还没有这个数据);
3、sqlSession相同,两次查询之间执行了增删改操作(这次增删改可能对当前数据有影响);
4、sqlSession相同,手动清除了一级缓存(缓存清空);
openSession.clearCache();
二级缓存:(全局缓存):基于namespace级别的缓存;一个namespace对应一个二级缓存;
工作机制:
1、一个会话,查询一条数据,这个数据就会被放在当前会话的一级缓存中;
2、如果会话关闭;一级缓存中的数据会被保存到二级缓存中;新的会话查询信息,就可以参照二级缓存中的内容;
3、sqlSession===EmployyeMapper==>Employee
DepartmentMapper==>Department
不同namespace查出的数据会放在自己对应的缓存中(map);
效果:数据会从二级缓存中获取
查出的数据都会默认先放在一级缓存中
只有会话提交或者关闭后,一级缓存中的数据才会转移到二级缓存中
使用:
1)开启全局二级缓存配置:<setting name="cacheEnabled" value="true">
2)去mapper.xml中配置使用二级缓存:
<cache></cache>
eviction:缓存的回收策略:
· LRU - 最近最少使用:移除最长时间不被使用的对象。
· FIFO - 先进先出:按对象进入缓存的顺序来移除它们。
· SOFT - 软引用:移除基于垃圾回收器状态和软引用规则的对象。
· WEAK - 弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。
· 默认的是LRU。
flushInterval:缓存刷新间隔
缓存多长时间清空一次,默认不清空。设置一个毫秒值,以毫秒为单位
readOnly:缓存是否只读:默认是:false
true:只读:mybatis认为所有从缓存中获取数据的操作都是只读操作,不会修改数据。
mybatis为了加快获取速度,直接就会将数据在缓存中的引用交给用户。不安全,速度快
false:非只读:mybatis觉得获取的数据可能会被修改。
mybatis会利用序列化&反序列的技术克隆一份新的数据给你。安全,速度慢
size:缓存存放多少元素;
type:指定自定义缓存的全类名;
实现Cache接口即可;
3)我们的POJO需要实现序列化接口(Serializable)
和缓存有关的一些设置\属性
1)cacheEnabled=true:打开二级缓存;false:关闭缓存(二级缓存关闭)(一级缓存可用)
2)每个select标签都有useCache属性
true:默认是true;两级缓存都开启;
false:不使用缓存(一级缓存依然使用,二级缓存不使用);
3)每个增删改标签的:flushCache:增删改执行完成后就会清除缓存(一级二级都会清除)
true:默认为true;
测试:flushCache="true":一级缓存就清空了;二级也会清除;
每个查询标签也有flushCache:也就是说查询不会清除缓存;
默认为false;
4)sqlsession.clearCache():只是清除当前session的一级缓存;跟二级缓存没关系;
5)localCacheScpe:本地缓存作用域;
session(一级缓存):默认是session:当前会话的所有数据保存在会话缓存中
statement:可以禁用一级缓存;
第三方缓存整合:
(ehcache-core.jar)、(mybatis-ehcache.jar)、(slf4j-api.jar)、(slf4j-log4j.jar)
1)导入第三方缓存包即可;
2)导入与第三方缓存整合的适配包
3)mapper.xml中使用自定义缓存
<cache-ref>标签:引用缓存
namespace:指定和哪个名称空间下的缓存一样

接口式

  • 准备:创建接口,在sql映射文件中将空间名称改成接口路径,将唯一id的值改成方法名。
  • 1)、获取SqlSessionFactory对象从全局配置文件中读取,将配置文件以流的形式写入SqlSessionFactoryBuilder().Build()方法
  • 2)、获取SqlSession对象
    • sqlSessionFactory.openSession();
  • 3)、获取接口的实现类对象,会为接口自动的创建一个代理对象,代理对象去执行增删改查方法
    • 接口类 mapper = SqlSession对象名.getMapper(接口类.class);调用接口方法

接口式编程

  • 原生: Dao ===> DaoImp

  • mybatis: Mapper ===> xxMapper.xml

  • SqlSession代表和数据库的一次会话;用完必须关闭;

  • SqlSession和connection一样都是非线程安全。每次使用都应该去获取新的对象。

  • mapper接口没有实现类,但是mybatis会为这个接口生成一个代理对象。

  • (将接口和xml进行绑定)EmployeeMapper empMapper = sqlSession.getMapper(EmployeeMapper.class)

  • 两个重要的配置文件:

    • mybatis的全局配置文件:包含数据库连接池信息,事务管理器信息等…系统运行环境信息
    • sql映射文件:保存了每一个sql语句的映射信息将sql抽取出来
  • 导入全局配置文件

    • 使用Resources的getResourceAsStream(配置文件变量名)方法进行读取全局配置文件
    • 返回SqlsessionFacotryBuilder.build(流名称);

一个小问题

mysql返回的时间总是有问题,比实际时间要早8小时。检查是jdbc链接的url中配置的时区有问题
解决:
在数据源 url中加入serverTimezone=UTC
例:url=jdbc:mysql......?serverTimezone=UTC
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值