# 内容
1.框架
2.Mybatis的概述
3.Mybatis快速入门
## 框架
1. 什么是框架?
* 概念:它是我们软件开发中的一套解决方案,不同的框架解决的是不同的问题。
* 使用框架的好处:框架封装了很多的细节,使开发者可以使用极简的方式实现功能。大大提高开发效率。
2. 三层架构:
* 表现层:是用于展示数据的。包括Controller控制器,Model模型,View视图;
* 业务层:是处理业务需求;
* 持久层:是和数据库交互的;
3. 持久层技术解决方案
1.JDBC技术:
Connection —— PreparedStatement —— ResultSet
2.Spring的JdbcTemplate:Spring中对jdbc的简单封装
3.Apache的DBUtils:它和Spring的JdbcTemplate很像,也是对Jdbc的简单封装
注:以上这些都不是框架,JDBC是规范,而Spring的JdbcTemplate和Apache的DBUtils都只是工具类
4. 分层开发下的常见的框架
* 解决数据的持久化 Mybatis、hibernate(封装程度更高,但目前在国内流行度下降太多)、Spring Data(一种趋势)
* 解决web层的MVC spring MVC、Struts(现在一般不用)、Struts2
* 解决技术整合 spring
## Mybatis的概述
1. 概念:
* mybatis是一个持久层框架,用java编写的,内部封装了JDBC,使开发者只需要关注sql语句本身而不需关注加载驱动、创建连接、创建会话、释放资源等过程。
* Mybatis通过xml或注解的方式将要执行的各种Statement配置起来,并通过java对象和statement中sql的动态参数进行映射生成最终的sql语句,最终由mybatis框架执行sql并将结果映射为java对象并返回。
* 采用ORM思想解决实体和数据库映射的问题,对jdbc进行了封装,屏蔽jdbc api底层访细节,是我们不用与jdbc api打交道就可以实现数据库的持久化操作。
2. 优点:
* 它封装了jdbc操作的很多细节,使开发者只需要关注sql语句本身,而无需关注加载驱动,创建连接、创建会话、释放资源等繁杂过程
* 它使用了ORM(Object Relational Mapping对象关系映射)思想实现了结果集的封装。
3. ORM:Object Relational Mappging 对象关系映射
即:把数据库表和实体类及实体类的属性对应起来,让我们可以操作实体类就实现操作数据库表。
user User
id userId
user_name userName
4. 传统JDBC存在的问题:
* 创建连接、创建会话、释放资源等过程造成系统资源的浪费从而影响系统性能,使用数据库连接池可以解决该问题;
* Sql语句存在硬编码,代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码;
* 使用preparedStatement向占位符传递参数存在硬编码,因为where语句存在不确定性,修改sql还要修改代码,系统不易维护;
* 对结果集解析存在硬编码(查询列名),如果将数据库结果集封装成pojo对象解析比较方便;
5. Mybatis的两个配置文件的约束:config和mapper
* 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">
* 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">
5. Mybatis的基本构成
* SqlSessionFactoryBuilder(构造器):
* 根据配置信息或者代码生成SqlSessionFactory(XML配置和代码两种方式)
* 生命周期仅在构建SqlSessionFactory的方法内
* SqlSessionFactory(工厂接口):
* 依靠工厂来生成SqlSession
* 生命周期在MyBatis应用中的整个生命周期
* 创建SqlsessionFactory是采用单例模式,使得每个数据库只对应一个SqlsessionFactory
* SqlSession(会话):
* 是一个接口,既可以发送SQL去执行并放回结果,也可以获取Mapper
* 生命周期是请求数据库处理事务的过程中
* 它是线程不安全的对象,使用时应该注意隔离级别、数据库锁等高级特性,应该及时关闭它,它长期存在就会使数据库连接池的活动资源减少。
* 可以通过finally语句保证正确关闭SqlSession
* SQL Mapper:
* 由Java接口和XML文件(或者注解)构成,需要给出对应的SQL和映射规则。负责发送SQL去执行,并返回结构
* 生命周期在SqlSession事务方法之内
## Mybatis快速入门
1. 创建maven工程
2. 添加Mybatis3.4.5的坐标(pom.xml文件中)
3. 编写实体类(User类)
4. 编写持久层接口UserDao(也可写为UserMapper)
* 在Mybatis中它把持久层的操作接口名称和映射文件都叫做:Mapper,即IUserDao 和 IUserMapper是一样的
5. 编写持久层接口映射文件UserDao.xml(内容见后面)
* 创建位置:必须和持久层接口在相同的包中
* 名称:必须以持久层接口命名文件名,拓展名为xml
* 映射配置文件的mapper标签namespace属性的取值必须是dao接口的全限定类名
* 映射配置文件的操作配置(select),id属性的取值必须是dao接口的方法名
* 映射配置文件中的select标签中resultType属性告知mybatis要封装到哪个实体类中(写入实体类的全限定类名)
* 若在持久层接口中添加注解,则不需要xml文件:
把IUserDao.xml移除,在dao接口的方法上使用@Select注解,并且指定SQL语句
同时需要在SqlMapConfig.xml中的mapper配置时,使用class属性指定dao接口的全限定类名。
6. 编写SqlMapConfig.xml配置文件(内容见后面)
* 配置环境
* 配置事务的类型
* 配置连接数据库
* 配置映射
7. 编写测试类(内容见后面)
* 第一步:读取配置文件
* 第二步:创建SqlSessionFactory工厂
* 第三步:创建SqlSession
* 第四步:创建Dao接口的代理对象
* 第五步:执行dao中的方法
* 第六步:释放资源
* UserDao.xml:
<?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="com.lyp.maven.dao.UserDao">
<!-- 配置查询所有操作 -->
<select id="findAll" resultType="com.lyp.maven.domain.User">
select * from user
</select>
</mapper>
* SqlMapConfig.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>
<!-- 配置mybatis的环境 -->
<environments default="mysql">
<!-- 配置mysql的环境 -->
<environment id="mysql">
<transactionManager type="JDBC"></transactionManager>
<!-- 配置连接数据库的信息 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test"/>
<property name="username" value="root"/>
<property name="password" value="12580"/>
</dataSource>
</environment>
</environments>
<!-- 配置映射 -->
<mappers>
<mapper resource="com/lyp/maven/dao/UserDao.xml" />
</mappers>
</configuration>
* 测试类
public class MybatisTest {
public static void main(String[] args)throws Exception {
//1.读取配置文件
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.创建SqlSessionFactory工厂
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
//3.使用工厂创建dao对象
IUserDao userDao = new UserDaoImpl(factory);
//4.使用代理对象执行方法
List<User> users = userDao.findAll();
for(User user : users){
System.out.println(user);
}
//5.释放资源
in.close();
}
}