MyBatis 一核心组件

一. 持久层概念和MyBatis的特点

持久层可以将业务数据存储到磁盘, 具备长期存储能力.如果发生断电或者其他情况, 重启系统仍然可以读取这些数据.

MyBatis主要特点:

  • 不屏蔽SQL
  • 提供强大, 灵活的映射机制
  • 提供了使用Mapper的接口编程

二. 准备MyBatis环境

下载MyBatis的包和源码: https://github.com/mybatis/mybatis-3/releases

三. MyBatis的核心组件

MyBatis的核心组件分为4个部分:

  • SqlSessionFactoryBuilder (构造器)  根据配置或者代码来生成SqlSessionFactory, 采用的是分布构建的Builder模式
  • SqlSessionFactory (工厂接口)  使用工厂模式生成SqlSession
  • SqlSession (会话)  一个可以发送SQL执行返回结果,获取Mapper的接口.
  • SQL Mapper (映射器)  由一个Java接口和XML文件(或注解)构成, 需要给出对应的SQL和映射规则. 映射器负责发送SQL去执行,并返回结果

组件之间的关系:

四. SqlSessionFactory (工厂接口)

使用MyBatis首先要生成SqlSessionFactory. 通过读取配置的XML文件来生成SqlSessionFactory, 也可以通过Java代码的形式去生成SqlSessionFactory.配置XML或提供代码后, MyBatis读取配置文件, 通过Configuration类对象构建整个MyBatis的上下文.

SqlSessionFactory是一个接口, 在MyBatis中存在它的两个实现类: SqlSessionFactory 和 DefaultSqlSessionFactory

每个基于MyBatis的应用都是以一个SqlSessionFactory的实例为中心的, 而SqlSessionFactory唯一的作用就是生成MyBatis的核心接口对象SqlSession, 所以它的责任是唯一的, 我们往往会采用单例模式处理它.

1. 使用XML构建SqlSessionFactory

MyBatis中的XMl配置文件分为两类:

  • 基础配置文件  (配置一些最基本的上下文参数和运行环境)
  • 映射文件    (配置映射关系, SQL, 参数等信息)

基础配置文件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>
    <!--环境配置,连接的数据库,这里使用的是MySQL-->
    <environments default="mysql">
        <environment id="mysql">
            <!--指定事务管理的类型,这里简单使用Java的JDBC的提交和回滚设置-->
            <transactionManager type="JDBC"></transactionManager>
            <!--dataSource 指连接源配置,POOLED是JDBC连接对象的数据源连接池的实现-->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"></property>
                <property name="url" value="jdbc:mysql://127.0.0.1:3306/mybbs"></property>
                <property name="username" value="root"></property>
                <property name="password" value="root"></property>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <!--这是告诉Mybatis区哪找持久化类的映射文件,对于在src下的文件直接写文件名,
            如果在某包下,则要写明路径,如:com/mybatistest/config/User.xml-->
        <mapper resource="User.xml"></mapper>
    </mappers>
</configuration>

通过XML构建SqlSessionFactory:

SqlSessionFactory sqlSessionFactory = null;
String resource = "mybatis-config.xml";
InputStream inputStream;
try {
    inputStream = Resources.getResourceAsStream(resource);
    SqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
    e.printStackTrace();
}

读取mybatis-confi.xml, 然后通过SqlSessionFactoryBuilder的Builder方法去创建SqlSessionFactory.

2. 使用代码创建SqlSessionFactory

//数据库连接池信息
...
//采用Mybatis的JDBC事务方式
TransactionFactory transactionFactory = new JdbcTransactionFactory();
Environment environment = new Environment("development", transactionFactory, dataSource);
//创建Configuration对象
Configuration configuration = new Configuration(environment);
//注册一个MyBatis上下文别名
configuration.getTypeAliasRegistry.registerAlias("role", Role.class);
//加入一个映射器
configuration.addMapper(RoleMapper.class);
//使用SqlSessionFactoryBuilder构建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
return SqlSessionFactory;

五. SqlSession

在MyBatis中, SqlSession是核心接口.由两个实现类:

  1. DefaultSqlSession   单线程使用
  2. SqlSessionManager  多线程使用

SqlSession作用:

  • 获取Mapper接口
  • 发送SQL给数据库
  • 控制数据库事务

创建SqlSession:

SqlSession sqlSession = SqlSessionFactory.openSession();

六. 映射器

由一个接口和对应的XML文件(或注解)组成.

需要配置:

  • 描述映射规则
  • 提供SQL语句
  • 配置缓存
  • 提供动态SQL

映射器的主要作用就是将SQL查询到的结果映射为一个POJO, 或者将POJO的数据插入到数据库中,并定义一些关于缓存等的重要作用.

1. 用XML实现映射器

用XML实现映射器分为两个部分: 接口和XML

POJO Role:

public class Role {
    private Long id;
    private String roleName;
    private String note;
/**setter and getter**/
...
}

以上吗POJO为例, 编写接口:

public interface RoleMapper {
    public Role getRole(Long id);
}

XML编写

    基础XML配置引入RoleMapper.xml

<mapper resource="com/learn/ssm/chapter3/mapper/RoleMapper.xml"/>

    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">
<mapper namespace="com.learn.ssm.chapter3.mapper.RoleMapper">
    <select id="getRole" parameterType="long" resultType="role">
        select id, role_name as roleName, note from t_role where id = #{id}
    </select>
</mapper>

2. 注解实现映射器

只需要一个接口就可以通过MyBatis的注解来注入SQL

public interface RoleMapper2 {
    @Select("select id, role_name as roleName, note from t_role where id=#{id}")
    public Role getRole(Long id);
}

3. SqlSession发送SQL

Role role = (Role)sqlSession.selectOne("com.learn.ssm.chapter3.mapper.RoleMapper.getRole", 1L};

selectOne方法表示查询并且只返回一个对象

4. 用Mapper接口发送SQL

RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);
Role role = roleMapper.getRole(1L);

5. 对比两种发送SQL方式

上面两种发送SQL方式:

  • 用SqlSession直接发送,
  • 通过SqlSession获取Mapper接口再发送.

推荐使用第二种:通过SqlSession获取Mapper接口再发送

猜你喜欢

转载自blog.csdn.net/wanderc/article/details/86538278
今日推荐