MyBatis简介:
MyBatis是一款优秀的持久层框架,支持自定义sql、存储过程以及高级映射。MyBatis免除了几乎所有的JDBC代码以及设置参数和获取结果集的工作。MyBatis可以通过简单的xml或注解来配置和映射原始类型、接口和Java POJO为数据库中的记录,采用ORM对象关系映射。
ORM对象关系映射:数据库中的每一张表都与一个实体类相对应,表中字段与实体中的属性是一一配置的。
MyBatis就是帮助程序员将数据存入数据库和从数据库中取数据。
传统的JDBC操作,有很多重复代码。比如:数据取出时的封装, 数据库的建立连接,通过框架可以减少重复代码,提高开发效率。
MyBatis是一个半自动化的ORM框架,半自动体现在sql可以自己手写,写在xml或者注解中都可以,一般写在xml 中,可以实现sql与核心模块的分离,可以在sql的层面上优化工程。
MyBatis特点:
- 简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件。易于学习,易于使用。通过文档和源代码,可以比较完全的掌握它的设计思路和实现。
- 灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过sql语句可以满足操作数据库的所有需求。
- 解除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。
- 提供映射标签,支持对象与数据库的orm字段关系映射。
- 提供对象关系映射标签,支持对象关系组建维护。
- 提供xml标签,支持编写动态sql。
官网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>
<!--environment标签可以有多个,即多个策略,通过default来选择策略,参数为environment的id-->
<environment id="development">
<!--开启事务-->
<transactionManager type="JDBC"/>
<!--配置数据源信息-->
<dataSource type="POOLED">
<!--源数据-->
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<!--BlogMapper.xml用来写sql-->
<mapper resource="org/mybatis/example/BlogMapper.xml"/>
</mappers>
</configuration>
项目结构:
使用mybatis时持久层不用写实现类,只需要写接口,mybatis底层会通过动态代理创建对应的实现类
mybatis-config.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>
<environments default="development">
<!--environment标签可以有多个,即多个策略,通过default来选择策略,参数为environment的id-->
<environment id="development">
<!--开启事务-->
<transactionManager type="JDBC"/>
<!--配置数据源信息-->
<dataSource type="POOLED">
<!--源数据-->
<!--<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>-->
<property name="url" value="jdbc:mysql://localhost:3306/test?serverTimezone=GMT&characterEncoding=utf-8"/>
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<!--BlogMapper.xml用来写sql-->
<mapper resource="com/jy/dao/UserDaoMapper.xml"/>
</mappers>
</configuration>
UserDaoMapper.xml: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">
<!--namespace 命名空间 其中内容为持久层接口全类名-->
<mapper namespace="com.jy.dao.UserDao">
<!--查询所有的用户数据-->
<!--id为对应方法名-->
<!--resultType:结果类型-->
<select id="getList" resultType="com.jy.pojo.User">
select * from test03
</select>
</mapper>
测试类:其中创建sqlSessionFactory对象
public class MyBatisTest {
@Test
public void test01(){
InputStream resourceAsStream =null;
SqlSession sqlSession = null;
//根据流对象来解析mybatis核心配置文件,读取相关数据
try {
resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
//创建sqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
//将sqlSession对象从工厂取出来
sqlSession = sqlSessionFactory.openSession();
//mybatis底层会通过动态代理为持久层接口创建对应的实现类
UserDao userDao = sqlSession.getMapper(UserDao.class);
//调用查询用户信息的方法
List<User> list = userDao.getList();
for (User user : list) {
System.out.println(user);
}
} catch (IOException e) {
e.printStackTrace();
}finally {
if (resourceAsStream != null){
try {
resourceAsStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (sqlSession != null){
sqlSession.close();
}
}
}
}
将测试类代码进行优化:将每新建一个test都需要写的重复代码提出,只保留核心代码
public class MyBatisTest {
InputStream resourceAsStream =null;
SqlSessionFactory sqlSessionFactory = null;
SqlSession sqlSession = null;
/**
* @Before 会在所有的测试单元执行之前执行
*/
@Before
public void mybatisBefore(){
//根据流对象来解析mybatis核心配置文件,读取相关数据
try {
resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
} catch (IOException e) {
e.printStackTrace();
}
//创建sqlSessionFactory对象
sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
//将sqlSession对象从工厂取出来
sqlSession = sqlSessionFactory.openSession();
}
/**
* @After 会在所有的测试单元执行之后执行
*/
@After
public void mybatisAfter(){
if (resourceAsStream != null){
try {
resourceAsStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (sqlSession != null){
sqlSession.close();
}
}
@Test
public void test01(){
//mybatis底层会通过动态代理为持久层接口创建对应的实现类
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//调用查询用户信息的方法
List<User> list = userMapper.getUserList();
for (User user : list) {
System.out.println(user);
}
}
}