2020-09-22

MyBatis入门

一、什么是MyBatis?
MyBatis是一个半ORM(对象-关系-映射)框架,它内部封装了JDBC,开发时只需要关注SQL语句本身,不用花费精力去加载MySQL驱动、创建连接等过程,我们只需要编写原生态的MySQL语句,可以控制SQL语句执行性能,灵活度较高。

MyBatis有两种方法配置和映射信息:
注:可以去MyBatis官方文档找
一种是写XML文件:
1)Mybatis-Config.xml

<configuration>
    <!-- 引入配置文件信息,这里不能加classpath:。
		resource:引入类路径下的资源,即classpath,所以不需要写classpath:
		url:引入网络路径或磁盘路径下的资源 
	-->
	<properties resource="db.properties"></properties>
	<!-- 环境们 (很多环境的意思)
		default:默认使用哪一个环境(必需对应一个环境的id)
	 -->
	<environments default="development">
		<!-- 一个环境  id:为这个环境取唯一一个id名称 -->
		<environment id="development">
			<!-- 事务管理   type:JDBC(支持事务)/MANAGED(什么都不做) -->
			<transactionManager type="JDBC" />
			<!-- 数据源, 连接池  type(POOLED):MyBatis自带的连接池 -->
			<dataSource type="POOLED">
				<!-- 连接数据库的参数:直接写死的方式 -->
                <!--
				<property name="driver" value="com.mysql.jdbc.Driver" />
				<property name="url" value="jdbc:mysql:///mydb" />
				<property name="username" value="root" />
				<property name="password" value="admin" />
                 -->
                <!-- 连接数据库的参数:使用属性文件的方式 -->
                <property name="driver" value="${db.driver}" />
				<property name="url" value="${db.url}" />
				<property name="username" value="${db.username}" />
				<property name="password" value="${db.password}" />
			</dataSource>
		</environment>
	</environments>
   <!-- 这个mappers代表的是相应的ORM映射文件 -->
	<mappers> 
		<mapper resource="cn/xxx/domain/ProductMapper.xml" /> 
	</mappers> 
</configuration> 

属性文件:db.properties

db.driver=com.mysql.jdbc.Driver
db.url=jdbc:mysql:///test0303
db.username=root
db.password=admin

2)映射文件:
我们的映射文件(也称之为mapper文件)一般情况下是和它对应的domain实体类在同一个包下:

<?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的主要功能就是写sql
	 mapper:根
	 namespace:命令空间 (用来确定唯一)以前这个是可以不加的,现在必需加
     namespace的值:接口的完全限定名
 -->
<mapper namespace="cn.xxx.dao.IProductDao">
	<!-- 
		select :这里面写查询语句
		id:用来确定这条sql语句的唯一
			   以后我们确定唯一,也就是找sql语句 : namespace + id
			 例: cn.itsource.mybatis.day1._1_hello.IProductDao.get
		parameterType : 传入的参数类型  long:大Long  _long:小long (具体的对应请参见文档)
		resultType : 结果类型(第一条数据返回的对象类型)自己的对象一定是完全限定类名
	 -->
	<select id="get" parameterType="long" resultType="cn.xxx.domain.Product">
		select * from product where id = #{id}
	</select>
</mapper> 

第二种就是使用注解

二、MyBatis三大核心对象
1)SqlSessionFactoryBuilder:
建造者模式:我们最后拿到的这个对象是非常复杂的. 用这个建造者就它先为我们把这些复杂的代码完成。这个类可以被实例化,使用和丢弃。一旦你创建了SqlSessionFactory后,这个类对象就不需要存在了。因此SqlSessionFactoryBuilder实例的最佳范围是方法范围(也就是本地方法变量)。你可以重用SqlSessionFactoryBuilder来创建多个SqlSessionFactory实例,但是最好的方式是不需要保持它一直存在来保证所有XML解析资源,因为还有更重要的事情要做;

2)SqlSessionFactory:
一旦被创建,SqlSessionFactory应该在你的应用执行期间都存在。没有理由来处理或重新创建它。使用SqlSessionFactory的最佳实践是在应用运行期间不要重复创建多次。这样的操作将被视为是非常糟糕的。因此SqlSessionFactory的最佳范围是应用范围。有很多方法可以做到,最简单的就是使用单例模式或者静态单例模式。然而这两种方法都不认为是最佳实践。这样的话,你可以考虑依赖注入容器,比如Google Guice或Spring。这样的框架允许你创建支持程序来管理单例SqlSessionFactory的生命周期;

3)SqlSession
每个线程都应该有它自己的SqlSession实例。SqlSession的实例不能被共享,也是线程不安全的。因此最佳的范围是请求或方法范围。绝对不能将SqlSession实例的引用放在一个类的静态字段甚至是实例字段中。也绝不能将SqlSession实例的引用放在任何类型的管理范围中,比如Serlvet架构中的HttpSession。如果你现在正用任意的Web框架,要考虑SqlSession放在一个和HTTP请求对象相似的范围内。换句话说,基于收到的HTTP请求,你可以打开了一个SqlSession,然后返回响应,就可以关闭它了。关闭Session很重要。
三、Mybatis 优缺点
优点
与传统的数据库访问技术相比,ORM有以下优点∶
1)基于SQL语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,SQL写在XML里,解除sl与程序代码的耦合,便于统一管理;提供XML标签,支持编写动态SQL 语句,并可重用;
2)与JDBC相比,减少了50%以上的代码量,消除了JDBC大量冗余的代码,不需要手动开关连接;
3)很好的与各种数据库兼容(因为MyBatis 使用 JDBC来连接数据库,所以只要JDBC支持的数据库 MyBatis 都支持);
4)提供映射标签,支持对象与数据库的ORM字段关系映射;提供对象关系映射标签,支持对象关系组件维护·能够与Spring很好的集成。

缺点
1)SQL语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写SQL 语句的功底有一定要求;
2)SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。

四、MyBatis编程步骤是什么样的?
• 1、创建 S qISessionFactory
• 2、通过 SqISessionFactory 创建 SqISession
• 3、通过sqlsession执行数据库操作
• 4、调用 session.commit()提交事务
• 5、调用session.closeQ关闭会话

五、MyBatis的工作原理
在学习MyBatis程序之前,需要了解一下MyBatis工作原理,以便于理解程 序。MyBatis的工作原理如下图
1、 读取MyBatis配置文件:mybatis-config.xml为MyBatis的全局配置文 件,配置了 MyBatis的运行环境等信息,例如数据库连接信息。
2、 加载映射文件。映射文件即SQL E央射文件,该文件中配置了操作数据库的 SQL语句,需要在MyBatis配置文件mybatis-config.xml中加载。
mybatis-config.xml文件可以加载多个映射文件,每个文件对应数据库中的一张 表。
3、 构造会话工厂:通过MyBatis的环境等配置信息构建会话工厂 SqISessionFactory.
4、 创建会话对象:由会话工厂创建SqISession对象,该对象中包含了执行 SQL语句的所有方法。
5、 Executor执行器:MyBatis底层定义了一个Executor接口来操作数据库, 它将根据SqISession传递的参数动态地生成需要执行的SQL语句,同时负责 查询缓存的维护。
6、 MappedStatement对象:在Executor接口的执行方法中有一个 MappedStatement类型的参数,该参数是对映射信息的封装,用于存储要映射 的SQL语句的id、参数等信息。
7、 输入参数映射:输入参数类型可以是Map、List等集合类型,也可以是基 本数据类型和POJO类型。输入参数映射过程类似于JDBC对 preparedStatement对象设置参数的过程。
8、 输出结果映射:输出结果类型可以是Map、 List等集合类型,也可以是基 本数据类型和POJO类型。输出结果映射过程类似于JDBC对结果集的解析过程。

六、SQL映射器Mapper
1)
通过Mybatis操作数据库的时候,除了写接口,还要写实现类。MyBatis基于动态代理机制,让我们无需再编写Dao的实现,但是必须要遵循一定的规范:
1.传统Dao接口,现在名称统一以Mapper结尾:例如:IUserDao --> UserMapper
2.还有我们映射器配置文件要和映射器在同一个包;
UserMapper.xml中namespace直接写UserMapper接口的的完全限定名。

2)映射器实现步骤
1.根据需求,创建模型相关的Mapper接口,例如:UserMapper;
2.在同包下编写映射文件,例如:UserMapper.xml;
(1)Mapper映射文件的命名空间,必须和接口的"完全限定名"一致;
(2)定义sql标签的id,需要和"接口的方法名"一致;
3.在Mybatis核心配置文件中配置(或注册)Mapper映射文件;
4.测试;
友情提示:最好不要在mapper接口中使用方法重载,因为sql标签的id即为方法名,写重载方法容易出问题;

补充:MyBatis中使用别名

1.别名就是为类取得小名,以后可以使用小名代替真实名称,在Mybatis中,将实体类的名称简化,方便开发,别名分为内置别名和自定义别名;
7.2.1.内置别名
在这里插入图片描述

7.2.2.自定义别名

<typeAliases>
		<!-- 单个配置:测试时使用 -->
		<typeAlias type="cn.xxx.domain.User" alias="User" />
		<!-- 包的配置:项目中使用,添加了包之后,类名或类名首字母小写就是别名 -->
		<package name="cn.xxx.domain" />
</typeAliases>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值