简介
先附上官网文档
Mybatis官方文档:https://mybatis.org/mybatis-3/zh/index.html
什么是mybatis?
- 简化JDBC操作,可以避免写jdbc的代码和手动的设置参数以及获取结果集的过程。
- 使用注解或XML来配置和映射原生信息,将接口和java的实体类映射成数据库中的记录。
- 持久层框架,实现数据持久化。
- 半自动化框架,使用SQL更灵活;hibernate是全自动,使用起来不灵活。
持久化层
数据持久化
将程序中的数据在内存中的瞬时态转换成在磁盘中的持久态。例如:JDBC、文件IO。(IO消耗资源严重,因此产生了数据库)
为什么需要Mybatis
- 简化jdbc操作,传统jdbc太复杂。可以简化的将数据存入数据库和从数据库中取数据。
- 传统的jdbc操作 , 有很多重复代码块 .比如 : 数据取出时的封装 , 数据库的建立连接等等… , 通过框架可以减少重复代码,提高开发效率
- MyBatis 是一个半自动化的ORM框架 (Object Relationship Mapping) -->对象关系映射
第一个Mybatis工程
步骤
工程目录结构
1、搭建环境
-
mybatis是一个持久层框架,因此使用mybatis的前提是要有一个数据库。
-
使用maven,注入依赖(引入相关jar包)
创建一个
普通
的maven项目,删除src目录,让这个项目充当父工程,在父工程的pom.xml文件中引入依赖之后,在项目下创建子模块,子模块中自动继承父工程中引入的依赖。需要注入的依赖:mybatis、mysql-connector-java、junit4。
2、创建mybatis的配置文件:
在configuration
标签中写配置,可以用不同的id写多套环境。
作用:配置数据库连接环境(连接数据库),加载mapper映射
<?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">
<!--mybatis的核心配置文件-->
<configuration>
<!--default:默认使用这个配置环境 -->
<environments default="development">
<!--可以配置多套环境 -->
<environment id="development">
<!--事务管理,默认是JDBC的事务管理-->
<transactionManager type="JDBC"/>
<!-- 启用连接池 -->
<dataSource type="POOLED">
<!-- 数据库连接驱动-->
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<!--数据库连接url-->
<!--&代表&符号,依次是:设置安全连接,设置unicode编码,设置编码方式,设置数据库时区-->
<property name="url" value="jdbc:mysql://localhost:3306/test?useSSL=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8"/>
<property name="username" value="root"/>
<property name="password" value="1234"/>
</dataSource>
</environment>
</environments>
<!--每一个mapper.xml需在配置文件中注册-->
<mappers>
<!-- 通过资源的方式注册 -->
<!-- 这里写resource路径,用/不能用. -->
<mapper resource="UserMapper.xml"></mapper>
</mappers>
</configuration>
3、Mybatis工具类
获取SqlSessionFactory对象
Mybatis工具类的作用:加载mybatis的配置文件,通过方法返回一个SqlSession对象。
static中的三行代码是固定的。
package top.jarvaniv.utils;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
// mybatis 的工具类,获取SqlSessionFactory对象
public class MyBatisUtils {
//提升作用域,把静态代码快中的变量作用域提升,否则,sqlSessionFactory只在静态代码块中有效。
private static SqlSessionFactory sqlSessionFactory;
static {
try {
// 加载mybatis的配置文件
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
// 获得了sqlSessionFactory,就可以获得SqlSession实例。
// SqlSession包含了面向数据库执行SQL命令的所需的所有方法。
// 静态方法,返回一个SqlSession对象。
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession();
}
}
改造工具类的getSession方法,自动提交事务
设置给的boolean类型参数,设置自动提交事务
//获取SqlSession连接
public static SqlSession getSession(){
return getSession(true); //事务自动提交
}
public static SqlSession getSession(boolean flag){
return sqlSessionFactory.openSession(flag);
}
4、创建实体类
封装数据库的每条数据。与数据库中的每列字段值对应。
package top.jarvaniv.pojo;
// 用户实体类
public class User {
private int id;
private String name;
//省略set、get、构造方法等代码
}
5、创建DAO接口
其中定义了操作数据库的各种方法
package top.jarvaniv.dao;
import top.jarvaniv.pojo.User;
import java.util.List;
public interface UserDao {
// 定义了查询数据库中用户列表的方法
List<User> getUserList();
//等待实现类重写
}
6、创建UserMapper.xml文件
由原来的接口实现类,转变为现在的xml配置文件。
创建之后,还要在mybatis配置文件中注册这个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="top.jarvaniv.dao.UserDao">
<!-- 查询语句 -->
<!-- 设置查询语句的id,id是实现的接口中的方法名,和查询的结果类型-->
<select id="查询id,通常使用实现接口中的实现的方法名" resultType="返回结果的类型,这里用User类接收"></select>
<select id="getUserList" resultType="top.jarvaniv.pojo.User">
<!-- 操作数据库的查询语句 -->
select * from test.temp
</select>
</mapper>
7、编写测试类
package top.jarvaniv.dao;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import top.jarvaniv.pojo.User;
import top.jarvaniv.utils.MyBatisUtils;
import java.util.List;
public class UserDaoTest {
@Test
public void getUserListTest(){
//首先,通过mybatis工具类得到一个sqlSession对象
SqlSession sqlSession = MyBatisUtils.getSqlSession();
// 获取mapper
UserDao userDao = sqlSession.getMapper(UserDao.class);
// 执行mapper的方法,得到结果集
List<User> userList = userDao.getUserList();
for (User user : userList) {
System.out.println(user);
}
// 最后关闭SqlSession资源
sqlSession.close();
}
}
类的作用域生命周期
SqlSessionFactoryBuilder
一旦创建了 SqlSessionFactory,就不再需要它了。所以最好把它最佳的作用域是方法作用域(局部变量)。
把它放在工具类的静态代码块中。
SqlSessionFactory
可以理解为:数据库连接池
一旦被创建就在应用的运行期间一直存在。不应该在运行期间关闭或者创建新的。
简单来说就是使用单例模式,或静态单例模式。
SqlSession
连接到连接池的一个请求。
它的实例是线程不安全的,所以不能被共享。最佳的作用域是请求或方法作用域。
每次收到一个http请求,就会打开一个SqlSession,返回一个响应,就关闭它(用完赶紧关闭,防止资源占用)。必须确保SqlSession被关闭,所以在finally中设置它的关闭。标准的使用方式。
try(创建资源){
}catch(){
}finally{
关闭资源
}