框架:
- 框架是可被应用开发者定制的应用骨架
- 框架是一种规则,保证开发者遵循相同的开发方式
- 框架对基础功能进行了封装
优点:
- 提高了开发效力
- 统一编码规则,便于团队管理
- 增加了灵活的配置,更利于维护
Mybatis框架:
- Mybatis是优秀的持久层框架,简化了与数据库的交互
- Mybatis使用XML将SQL语句和程序解耦,便于维护
- Mybatis学习简单,执行高效,是JDBC的延伸
Mybatis开发流程:
- 引入Mybatis依赖
- 创建核心配置文件
- 创建实体类Entity
- 创建mapper映射文件
- 初始化SessionFactory
- 利用SqlSession对象操作数据
1 引入Mybatis依赖
在pom.xml中增加Mybatis框架依赖和mysql的JDBC依赖
<!--增加mybatis框架依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.3</version>
</dependency>
<!--增加mysql的jdbc驱动依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
2 创建核心配置文件
resources目录下创建mybatis-config.xml文件,书写数据库连接信息
<!--声明和mybatis-3-config的dtd-->
<?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>
<settings>
<!--开启驼峰命名转化 form_id -> formId-->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<!--default代表当前默认的数据库环境-->
<environments default="dev">
<!--environment环境配置标签,id为唯一值-->
<environment id="dev">
<!--采用JDBC方式管理数据库事务-->
<transactionManager type="JDBC"></transactionManager>
<!--采用连接池方式管理数据库连接-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<!--xml中出现&需要转义字符amp;-->
<property name="url" value="jdbc:mysql://localhost:3306/oa_test?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serveTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
</configuration>
3 创建实体类Entity
entity目录下创建Goods.java实体类,包含的属性名和数据库中一一对应
4 创建mapper映射文件
在resources目录下创建mappers目录保存mysql要执行的sql语句和xml文件,创建test.xml文件
<!--声明和mybatis-3-mapper的dtd-->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Maper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--
在mapper里书写CRUD语句
namespace表示命名空间,同一个命名空间下的select id必须唯一
resultType将select语句返回的结果包装成Goods实体类对象
-->
<mapper namespace="test">
<select id="selectAll" resultType="com.oa.mybatis.entity.Goods">
select 'success'
</select>
</mapper>
在mybatis核心配置文件mybatis-config.xml文件中注册声明上面的xml文件
<mappers>
<mapper resource="mappers/test.xml"></mapper>
</mappers>
5 初始化SessionFactory,读取配置文件,加载mapper映射
SqlSessionFactory是Mybatis的核心对象,用于加载配置文件初始化Mybatis,创建SqlSession对象, 要保证SqlSessionFactory对象在应用中全局唯一。
@Test
public void testSqlSessionFactory() throws IOException {
Reader reader = null;
SqlSession sqlSession = null;
try {
//利用Reader加载classPath下到核心配置文件,getResourceAsReader表示以字符流到方式读取
reader = Resources.getResourceAsReader("mybatis-config.xml");
//SqlSessionFactoryBuilder利用构造者模式初始化SqlSessionFactory对象,传入reader解析xml,返回对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
sqlSession = sqlSessionFactory.openSession();
} catch (Exception e) {
throw e;
} finally {
//如果配置dataSource type="POOLED",调用close()将连接收回到连接池中
//如果配置dataSource type="UNPOOLED",调用close()将调用Connection.close()方法关闭连接
if (sqlSession != null) sqlSession.close();
}
}
使用MybatisUtils工具类封装sessionFactory对象初始化过程:
public class MybatisUtils {
//使用static修饰属性,该属性属于类,且全局唯一
public static SqlSessionFactory sqlSessionFactory = null;
//static修饰的静态块用来初始化静态变量
static{
Reader reader = null;
try{
reader = Resources.getResourceAsReader("mybatis-config.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
} catch (IOException e) {
e.printStackTrace();
//表示是类初始化过程中出现的异常
throw new ExceptionInInitializerError(e);
}
}
//工具类中使用static修饰方法,方便通过类名直接调用方法
public static SqlSession openSession(){
return sqlSessionFactory.openSession();
}
//必须关闭连接
public static void closeSession(SqlSession session){
if(session != null) session.close();
}
}
6 利用SqlSession对象操作数据
SqlSession是Mybatis操作数据库的核心对象,提供了数据库表CRUD方法,是在JDBC的基础上进行了扩展,简化了与数据库的交互工作。
数据查询过程:
@Test
public void testSelectAll(){
SqlSession session = null;
try{
session = MybatisUtils.openSession();
//使用命名空间+select id 定位到sql语句
//返回结果被包装成Goods对象
List<Goods> list = session.selectList("test.selectAll");
}catch(Exception e){
throw e;
}finally {
MybatisUtils.closeSession(session);
}
}