MyBatis学习记录01——基础搭建

###0.前言
搭建MyBatis使用例子,主要用于熟悉MyBatis的核心组件

配置步骤:

  1. SqlSessionFactoryBuilder+Configuration创建SqlSessionFactory实例
  2. SqlSessionFactory创建SqlSession实例
  3. SqlSession发送sql或者获取Mapper,并通过Mapper发送sql

###1.创建SqlSessionFactory
创建SqlSessionFactory有两种方式:

  1. 读取xml配置后创建
  2. 代码直接创建(通过Configuration对象配置)

注意点:

  1. SqlSessionFactory占据着数据库的连接资源,最好通过单例引用。

####1.1 xml配置创建

  1. java读取配置文件

    SqlSessionFactoryUtils类
    private static SqlSessionFactory getSessionFactory() {
        synchronized (LOCK) {
            if(mSessionFactory != null) {
                return mSessionFactory;
            }
            String config = "mybatis-config.xml";
            InputStream inputStream = null;
            try {
                inputStream = Resources.getResourceAsStream(config);
                mSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                return null;
            }
            return mSessionFactory;
        }
    }
    
  2. xml配置文件

    //src/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> 
    
     <!-- 别名设置 -->
      <typeAliases>
          <typeAlias alias="role" type="com.nowy.mybatissample.pojo.Role"/>
      </typeAliases>
    
     <!-- 环境配置,默认为 "development"的环境-->
     <environments default="development">
    
     <!-- 环境1:development -->
      <environment id="development">
        <transactionManager type="JDBC"> <!-- 事务方式 -->
        </transactionManager>
        <dataSource type="POOLED"> <!-- 采用MyBatis内部提供连接池方式 -->
          <property name="driver" value="com.mysql.jdbc.Driver"/> <!-- 对应mysql-connector-java-5.1.23-bin.jar中的Driver.class -->
          <property name="url" value="jdbc:mysql://localhost:3306/ssm"/><!-- 数据库url -->
          <property name="username" value="root"/>  <!-- 数据库用户名和密码 -->
          <property name="password" value="root"/>
        </dataSource>
      </environment>
    
     <!-- 可以配置多个环境 -->
    
    </environments>
    
  <!-- 映射器注册 -->
  <mappers>
      <mapper resource="com/nowy/mybatissample/mapper/RoleMapper.xml"/>
  </mappers>
</configuration>

####1.2 代码创建
创建步骤:

  1. 配环境(环境列表)
    • 配置数据库-datasocure
    • 配置jdbc事务方式
    • 生成环境配置实例


  2. 生成配置实例
    • 导入环境配置
    • 上下文别名配置
    • 映射器配置

核心代码:

//SqlSessionFactoryUtils类
private static SqlSessionFactory getSessionFactory2() {
        synchronized (LOCK) {
            if(mSessionFactory != null) {
                return mSessionFactory;
            }

            //1.配环境
            //a.配置数据库
            PooledDataSource dataSource = new PooledDataSource();
            dataSource.setDriver("com.mysql.jdbc.Driver");
            dataSource.setUsername("root");
            dataSource.setPassword("root");
            dataSource.setUrl("jdbc:mysql://localhost:3306/ssm");
            dataSource.setDefaultAutoCommit(false);

            //b.配置jdbc事务方式
            TransactionFactory transactionFactory = new JdbcTransactionFactory();

            //c.生成环境配置实例
            Environment environment = new Environment("development", transactionFactory, dataSource);

            //2.生成配置实例

            //a.导入环境配置
            Configuration config = new Configuration(environment);

            //b.上下文别名配置
            config.getTypeAliasRegistry().registerAlias("role", Role.class);

            //c.映射器配置
            config.getMapperRegistry().addMapper(RoleMapper.class);

            mSessionFactory = new SqlSessionFactoryBuilder().build(config);

            return mSessionFactory;
        }
    }
  • 代码创建方式不便于维护和动态切换,除非有特殊的需求,否则不太建议使用

###2.SQL发送
MyBatis中通过SqlSession发送SQL。

SqlSession相当于数据库的一个连接,
事务的提交(commit),回滚(rollback)都通过它调用。

注意点:
SqlSession相当于一个数据库连接,业务处理完后需要close(关闭)

####2.1 映射器配置(Mapper接口+Xml文件)

  1. Mapper接口

    //RoleMapper类
    public interface RoleMapper {
    
        //方法名与RoleMapper.xml中的queryById对应
        Role queryById(Long id);//查询
        int insertRole(Role role);//插入
    }
    
  2. 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.nowy.mybatissample.mapper.RoleMapper"> <!-- 绑定 -->
          <select id="queryById" parameterType="Long" resultType="role"> <!-- role为配置文件中注册的别名 -->
              select id,role_name as roleName,note from t_role where id = #{id}
          </select>
    
          <insert id="insertRole" parameterType="role">
            insert into t_role(role_name, note) values(#{roleName}, #{note})
        </insert>
      </mapper>
    

####2.2 SqlSession直接发送SQL

sqlSession = SqlSessionFactoryUtils.openSqlSession();//mSessionFactory.openSession()
Role role = sqlSession.selectOne("com.nowy.mybatissample.mapper.RoleMapper.queryById",1L);

直接通过sqlSession的方法,传入预先设置好的数据库语句(RoleMapper类queryById(Long id)),
这种方式支持模糊查找,即sqlSession.selectOne("queryById",1L);,前提是queryById是唯一的。

####2.3 通过映射器发送

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

通过sqlSession.getMapper(RoleMapper.class)获得映射器,再使用映射器中定义的方法发送SQL.

###3.0 总结

  • SqlSessionFactoryBuilder -> SqlSessionFactory -> SqlSession -> Mapper (调用线路图)
  • SqlSessionFactory 最好保持单例
  • SqlSession处理完业务后需要关闭

END

– Nowy

– 2018.11.30

分享到