mybatis 快速入门

554

Mybatis

简介

MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

mybatis 快速入门

流程

mybatis-002

每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为核心的。

SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。

SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先配置的 Configuration 实例来构建出 SqlSessionFactory 实例

SqlSession 实例则可以从 SqlSessionFactoryBuilder 获取

配置文件 mybatis-config.xml

XML 配置文件中包含了对 MyBatis 系统的核心设置,

包括获取数据库连接实例的数据源(DataSource)

决定事务作用域和控制方式的事务管理器(TransactionManager)

<?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 元素体中包含了事务管理和连接池的配置 -->
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://127.0.0.1:3306/test?useSSL=false"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    
    <!-- mappers 元素则包含了一组映射器(mapper),这些映射器的 XML 映射文件包含了 SQL 代码和映射定义信息。 -->
    <mappers>
		<mapper resource="UserMapper.xml"/>
    </mappers>
</configuration>

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="cn.noybzy.Mapper.UserMapper">
    <select id="selectUserOne" resultType="cn.noybzy.pojo.User">
        select * from user where id=#{id}
    </select>
</mapper>

Mapper接口

public interface UserMapper {
    User selectUserOne(int id);
    int add(User user);
}

从 XML 中构建 SqlSessionFactory

每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为核心的

SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例。

String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

从 SqlSessionFactory 中获取 SqlSession

每个线程都应该有它自己的 SqlSession 实例。SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。

<!--通过 SqlSession 实例来直接执行已映射的 SQL 语句-->
    
try (SqlSession session = sqlSessionFactory.openSession()) {
    
  User user = (User) session.selectOne("cn.noybzy.Mapper.UserMapper.selectUserOne", 101);
    
}

<!--使用和指定语句的参数和返回值相匹配的接口-->

try (SqlSession session = sqlSessionFactory.openSession()) {
    <!--它不依赖于字符串字面值-->    
  UserMapper mapper = session.getMapper(UserMapper.class);
  User user = mapper.selectUserOne(101);
    
}

属性(properties)

这些属性可以在外部进行配置,也可以在 properties 元素的子元素中设置

<properties resource="org/mybatis/example/config.properties">
  <property name="username" value="dev_user"/>
  <property name="password" value="F2Fa3!33TYyg"/>
</properties>



<dataSource type="POOLED">
  <property name="driver" value="${driver}"/>
  <property name="url" value="${url}"/>
  <property name="username" value="${username}"/>
  <property name="password" value="${password}"/>
</dataSource>

mybatis-003

//创建SqlSessionFactory 
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment, props);

如果一个属性在不只一个地方进行了配置,那么,MyBatis 将按照下面的顺序来加载:

  • 首先读取在 properties 元素体内指定的属性。
  • 然后根据 properties 元素中的 resource 属性读取类路径下属性文件,或根据 url 属性指定的路径读取属性文件,并覆盖之前读取过的同名属性。
  • 最后读取作为方法参数传递的属性,并覆盖之前读取过的同名属性。

类型别名(typeAliases)

类型别名可为 Java 类型设置一个缩写名字。 它仅用于 XML 配置,意在降低冗余的全限定类名书写。

<typeAliases>
  <typeAlias alias="Author" type="domain.blog.Author"/>
  <typeAlias alias="Blog" type="domain.blog.Blog"/>
  <typeAlias alias="Comment" type="domain.blog.Comment"/>
  <typeAlias alias="Post" type="domain.blog.Post"/>
  <typeAlias alias="Section" type="domain.blog.Section"/>
  <typeAlias alias="Tag" type="domain.blog.Tag"/>
</typeAliases>

MyBatis 包扫描 Java Bean

<typeAliases>
  <package name="domain.blog"/>
</typeAliases>

注解@Alias(“author”)

在没有注解的情况下,会使用 Bean 的首字母小写的非限定类名来作为它的别名。

@Alias("author")
public class Author {
    ...
}

环境配置(environments)

MyBatis 可以配置成适应多种环境,这种机制有助于将 SQL 映射应用于多种数据库之中, 现实情况下有多种理由需要这么做。

每个 SqlSessionFactory 实例只能选择一种环境

为了指定创建哪种环境,只要将它作为可选的参数传递给 SqlSessionFactoryBuilder 即可

SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment, properties);

本文章参考:https://mybatis.org/mybatis-3/zh/index.html