1、Mybatis框架概述
1.1、简介
1:MyBatis框架、是一个基于Java的[持久层](https://baike.baidu.com/item/持久层/3584971)框架,提供的持久层框架包括SQL Maps和Data Access Objects(DAOs)
2.1:MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。
2.2:MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。
2.3:MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java POJO(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。
1.1.1、JDBC存在的四个问题
1.数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。
MyBatis解决:在MyBatisConfig.xml 中配置数据链接池,使用连接池管理数据库链接。
2.Sql 语句写在代码中造成代码不易维护,实际应用 sql 变化的可能较大, sql 变动需要改变 java 代码。
MyBatis解决:将Sql 语句配置在 XXXXmapper.xml 文件中与 java 代码分离。
3.向 sql 语句传参数麻烦,因为 sql 语句的 where 条件不一定,可能多也可能少,占位符需要和参数一一对应。
MyBatis解决:Mybatis 自动将 java 对象映射至 sql 语句,通过 statement 中的 parameterType 定义输入参数的类型并自动完成参数的注入。
4.对结果集解析麻烦, sql 变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成pojo 对象解析比较方便。
MyBatis解决:Mybatis 自动将 sql 执行结果映射至 java 对象,通过 statement 中的 resultType 定义输出结果的类型并自动完成结果集的封装。
1.2、特点
1、简单易学
2、灵活
3、解除sql与程序代码的耦合
通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。
4、提供映射标签
5、提供对象关系映射标签
6、提供xml标签
支持编写动态sql。
1.3、ORM(对象关系映射)
(Object Relational Mapping,简称ORM)是通过使用描述对象和数据库之间映射的元数据
1.3.1、应用
实际应用中即在关系型数据库和业务实体对象之间作一个映射,这样,我们在具体的操作业务对象的时候,就不需要再去和复杂的SQL语句打交道,只要像平时操作对象一样操作它就可以了.ORM框架就是用于实现ORM技术的程序。
1.3.2、常见ORM框架
常见的ORM框架有:Hibernate、TopLink、Castor JDO、Apache OJB. Mybatis等
1.3.3、Java中ORM原理
ORM的实现原理,其实,要实现
JavaBean的属性到数据库表的字段的映射,
任何ORM框架不外乎是读某个配置文件把JavaBean的属性和数据库表的字段自动关联起来,当从数据库Query时,自动把字段的值塞进JavaBean的对应属性里,当做INSERT或UPDATE时,自动把 JavaBean的属性值绑定到SQL语句中。
2、搭建MyBatis的开发环境
2.1、创建Maven项目导入坐标
2.2、在pom.xml文件中添加MyBatis所需要的依赖
所需要的依赖有org.mybatis;mysql;log4j;junit;org.projectlombok
<!-- 添加依赖 -->
<dependencies>
<!-- mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.4</version>
</dependency>
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.48</version>
</dependency>
<!--log4j-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!--junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
</dependencies>
2.3、创建核心配置文件(公共的配置)和映射文件(SQL语句)
2.3.1、核心配置文件
核心配置文件需要四个字符串,driver;url(数据库地址);username(数据库用户名);password(数据库密码)
还需要在中加载映射配置文件,用文件扫描,或者包扫描映射配置文件
<?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://123.57.221.17:3306/smbms"/>
<property name="username" value="root"/>
<property name="password" value="Xzx0120."/>
</dataSource>
</environment>
</environments>
<!-- 加载映射配置文件 -->
<mappers>
<!-- 文件扫描映射配置文件 -->
<mapper resource="cn/kgc/dao/role/RoleMapper.xml"/>
<!-- 包扫描映射配置文件 扫描指定文件夹下的所有xml映射配置文件-->
<!-- <package name="cn/kgc/tangcco/mapper"/> -->
</mappers>
</configuration>
2.3.2、当映射配置文件不在resources文件夹下
当映射配置文件不在resources文件夹下,需要在pom.xml文件通过标签指定映射配置文件位置
<build>
<resources>
<resource>
<!--扫描指定目录下的文件-->
<directory>src/main/java/</directory>
<includes>
<!--映射配置文件-->
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>
2.3.3、映射配置文件(sql)
<?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">
<!--当前映射配置文件对应java中Mapper接口的路径-->
<mapper namespace="cn.kgc.dao.role.RoleDao">
<!-- 查询所有角色 -->
<!--id sql的标识,对应Mapper接口中方法,resultType接收到数据库返回的类型-->
<select id="getAllRole" resultType="cn.kgc.pojo.Role">
select * from smbms_role
</select>
</mapper>
3、测试
31、直接连接映射配置文件
测试时候直接连接映射配置文件
/**
* 直接连接映射配置文件
* @throws IOException
*/
@Test
public void getAllRole() throws IOException {
//定义核心配置文件
String config = "mybatis-config.xml";
//获取SqlSessionFactory对象
InputStream inputStream = Resources.getResourceAsStream(config);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//根据sqlSessionFactory获取SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//aa对应的是映射配置文件中mapper的namespace bb对应的是mapper标签里的sql的id
List<Role> roleList = sqlSession.selectList("aa.bb");
System.out.println(roleList);
}
3.2、调用java中接口
需要使用代理模式先把映射配置文件对应的mapper文件,再通过代理调用mapper接口中的方法,实现调用映射配置文件中sql
/**
* 使用dao层
* @throws IOException
*/
@Test
public void getAllRole1() throws IOException {
//定义核心配置文件
String config = "mybatis-config.xml";
//获取SqlSessionFactory对象
InputStream inputStream = Resources.getResourceAsStream(config);
//工厂模式
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//根据sqlSessionFactory获取SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//代理模式
RoleDao mapper = sqlSession.getMapper(RoleDao.class);
List<Role> roleList = mapper.getAllRole();
System.out.println(roleList);
}
3.2.1、使用到的设计模式
创建工厂:构建者
创建SqlSession对象:工厂
获取接口对象:代理
4、优化
4.1.因为基于SqlSession实例执行sql语句存在写死字符串,所以用基于接口的方式,但是要注意命名空间和标签的id
4.2 因为resultType写全限定名太长了,所以我们起了别名
在核心配置中添加了
4.3 因为核心配置文件中的连接数据库的四个字符串写在了配置文件中
所以把四个字符串写到database.properties文件中
然后在核心配置文件中使用标签引入,然后用
键
S
e
s
s
i
o
n
实
例
执
行
s
q
l
语
句
存
在
写
死
字
符
串
,
所
以
用
基
于
接
口
的
方
式
,
但
是
要
注
意
命
名
空
间
和
标
签
的
i
d
4.2
因
为
r
e
s
u
l
t
T
y
p
e
写
全
限
定
名
太
长
了
,
所
以
我
们
起
了
别
名
在
核
心
配
置
中
添
加
了
<
t
y
p
e
A
l
i
a
s
e
s
>
4.3
因
为
核
心
配
置
文
件
中
的
连
接
数
据
库
的
四
个
字
符
串
写
在
了
配
置
文
件
中
所
以
把
四
个
字
符
串
写
到
d
a
t
a
b
a
s
e
.
p
r
o
p
e
r
t
i
e
s
文
件
中
然
后
在
核
心
配
置
文
件
中
使
用
<
p
r
o
p
e
r
t
i
e
s
>
标
签
引
入
,
然
后
用
{键} Session实例执行sql语句存在写死字符串,所以用基于接口的方式,但是要注意命名空间和标签的id 4.2 因为resultType写全限定名太长了,所以我们起了别名 在核心配置中添加了<typeAliases> 4.3 因为核心配置文件中的连接数据库的四个字符串写在了配置文件中 所以把四个字符串写到database.properties文件中 然后在核心配置文件中使用<properties>标签引入,然后用
键Session实例执行sql语句存在写死字符串,所以用基于接口的方式,但是要注意命名空间和标签的id4.2因为resultType写全限定名太长了,所以我们起了别名在核心配置中添加了<typeAliases>4.3因为核心配置文件中的连接数据库的四个字符串写在了配置文件中所以把四个字符串写到database.properties文件中然后在核心配置文件中使用<properties>标签引入,然后用{键}
读取文件内容