MyBatis核心技术

2021年6月6日 1251点热度 0人点赞 0条评论

一、HelloWorld简单版

– 创建一张测试表employee
– 创建对应的javaBean
– 创建mybatis配置文件,sql映射文件
– 测试

1.创建一个employee表

CREATE TABLE employee (
id INTEGER(11) PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(255),
gender CHAR(1),
email VARCHAR(255)
)

2.创建对应的javaBean
3.创建mybatis配置文件,sql映射文件
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>
    <properties resource="jdbc.properties"></properties>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.user}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="EmployeeMapper.xml"/>
    </mappers>
</configuration>

sql映射文件:EmployeeMapper.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.shelwlay.mybatis.EmployeeMapper">
        <select id="com.shelwlay.mybatis.EmployeeMapper.selectEmployee" resultType="com.shellway.mybatis.bean.Employee">
            select id,last_name lastName,gender,email from Employee where id = #{id}
        </select>
</mapper>

4、编写代码

    //1.根据全局配置文件,利用SqlSessionFactoryBuilder创建SqlSessionFactory
      String resource ="mybatis-config.xml";

      InputStream inputStream = Resources.getResourceAsStream(resource)
;
      SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);

   //2.使用SqlSessionFactory获取sqlSession对象。一个SqlSession对象代表和数据库的一次会话。
      SqlSession openSession = factory.openSession();

   //3.使用SqlSession根据方法id进行操作
      SqISession openSession = factory.openSession(); 
   try{
      
Object one=openSession.selectone("com.shell.dao.EmployeeMapper.getEmpById",1) 
      System.out.println(one);
   }finally{

      openSession.close();
   }

5.HelloWorld-接口式编程
– 创建一个Dao接口
– 修改Mapper文件
– 测试

    //使用SqlSession获取映射器进行操作
      SqlSession sqlSession = factory.openSession(); 
      try{

          EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class) 
          Employee employee = mapper.getEmpById(1); 
          System.out.println(employee); 
      }finally{
          
sqlSession.close( );
      }

二、MyBatis-全局配置文件
MyBatis 的配置文件包含了影响 MyBatis 行为甚深的设置(settings)和属性(properties)信息。
1、文档的顶层结构如下:

• configuration 配置
• properties 属性
• settings 设置
• typeAliases 类型命名
• typeHandlers 类型处理器
• objectFactory 对象工厂
• plugins 插件
• environments 环境
   • environment 环境变量
      • transactionManager 事务管理器
      • dataSource 数据源
• databaseIdProvider 数据库厂商标识
• mappers 映射器

另外,在Eclipse中引入XML的dtd约束文件,方便编写XML的时候有提示
MyBatis核心技术插图

2、properties属性

driver=com. mysql.jdbc.Driver

url=jdbc:mysql://localhost:3306/mybatis?useUnicode=true&amp;characterEncoding=utf8 
username=root 
password=123456
<properties resource="dbconfig.properties"></properties>

注意:如果属性在不只一个地方进行了配置,那么 MyBatis 将按照下面的顺序来加载:
– 在 properties 元素体内指定的属性首先被读取。
– 然后根据properties元素中的resource属性读取类路径下属性文件或根据url属性指定的路径读取属性文件,并覆盖已读取的同名属性。
– 最后读取作为方法参数传递的属性,并覆盖已读取的同名属性。

3、settings设置
这是 MyBatis 中极为重要的调整设置,它们会改变MyBatis 的运行时行为。
MyBatis核心技术插图1

<settings>
<setting name="mapUnderscoreToCamelCase"value="true"/></settings>

4、typeAliases别名处理器
• 类型别名是为 Java 类型设置一个短的名字,可以方便我们引用某个类。

<typeAliases>

    <typeAlias type="com.shell.bean.Employee"alias="employee"/>
    <typeAlias type="com.shell.bean.Department"alias="department"/>
</typeAliases>

• 类很多的情况下,可以批量设置别名。为这个包下的每一个类创建一个默认的别名,就是简单类名小写。

<typeAliases>
    
<package name="com.shell.bean"/>
</typeAliases>


• 也可以使用@Alias注解为其指定一个别名

@Alias("emp")

public class Employee {

这里值得注意的是,MyBatis已经为许多常见的 Java 类型内建了相应的类型别名。它们都是大小写不敏感的,我们在起别名的时候千万不要占用已有的别名。
MyBatis核心技术插图2

5、typeHandlers类型处理器
无论是 MyBatis 在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时, 都会用类型处理器将获取的值以合适的方式转换成 Java 类型。
MyBatis核心技术插图3

6、日期类型的处理
日期和时间的处理,JDK1.8以前一直是个头疼的问题。我们通常使用JSR310规范领导者Stephen Colebourne创建的Joda-Time来操作。1.8已经实现全部的JSR310规范了。• 日期时间处理上,我们可以使用MyBatis基于JSR310(Date and Time API)编写的各种日期时间类型处理器。 • MyBatis3.4以前的版本需要我们手动注册这些处理器,以后的版本都是自动注册的。
MyBatis核心技术插图4

7、自定义类型处理器
我们可以重写类型处理器或创建自己的类型处理器来处理不支持的或非标准的类型。

• 步骤:
    • 1)、实现org.apache.ibatis.type.TypeHandler接口或者继承org.apache.ibatis.type.BaseTypeHandler
    • 2)、指定其映射某个JDBC类型(可选操作)
    • 3)、在mybatis全局配置文件中注册

8、plugins插件
插件是MyBatis提供的一个非常强大的机制,我们可以通过插件来修改MyBatis的一些核心行为。插件通过动态代理机制,可以介入四大对象的任何一个方法的执行。后面会有专门的章节我们来介绍mybatis运行原理以及插件。

• Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
• ParameterHandler (getParameterObject, setParameters) 
• ResultSetHandler (handleResultSets, handleOutputParameters) 
• StatementHandler (prepare, parameterize, batch, update, query)

9、environments环境
• MyBatis可以配置多种环境,比如开发、测试和生产环境需要有不同的配置。
• 每种环境使用一个environment标签进行配置并指定唯一标识符
• 可以通过environments标签中的default属性指定一个环境的标识符来快速的切换环境
environment-指定具体环境
• id:指定当前环境的唯一标识
• transactionManager、和dataSource都必须有

<environments default="development">

    <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>

10、transactionManager

• type: JDBC | MANAGED | 自定义
    – JDBC:使用了 JDBC 的提交和回滚设置,依赖于从数据源得到的连接来管理事务范围。
      JdbcTransactionFactory
    – MANAGED:不提交或回滚一个连接、让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。 
      ManagedTransactionFactory
    – 自定义:实现TransactionFactory接口,type=全类名/别名

11、dataSource

• type: UNPOOLED | POOLED | JNDI | 自定义
    – UNPOOLED:不使用连接池,UnpooledDataSourceFactory
    – POOLED:使用连接池, PooledDataSourceFactory
    – JNDI: 在EJB 或应用服务器这类容器中查找指定的数据源
    – 自定义:实现DataSourceFactory接口,定义数据源的获取方式。

注意:实际开发中我们使用Spring管理数据源,并进行事务控制的配置来覆盖上述配置。

12、databaseIdProvider环境
• MyBatis 可以根据不同的数据库厂商执行不同的语句。

<databaseIdProvider type="DB VENDOR">

    <property name="MySQL"value="mysql"/>
    <property name="Oracle" value="oracle"/>
    <property name="SQL Server"value="sqlserver"/>
</databaseIdProvider>

• Type: DB_VENDOR
– 使用MyBatis提供的VendorDatabaseIdProvider解析数据库厂商标识。也可以实现DatabaseIdProvider接口来自定义。 • Property-name:数据库厂商标识
• Property-value:为标识起一个别名,方便SQL语句使用databaseId属性引用。

<select id="getEmpsByDeptId" resultType="Emp"
 parameterType="Integer" databaseId="mysql">
    SELECT * FROM tbl_emp WHERE deptId=#{id}
</select>

• DB_VENDOR
– 会通过 DatabaseMetaData#getDatabaseProductName() 返回的字符串进行设置。由于通常情况下这个字符串都非常长而且相同产品的不同版本会返回不同的值,所以最好通过设置属性别名来使其变短
• MyBatis匹配规则如下:
– 1、如果没有配置databaseIdProvider标签,那么databaseId=null
– 2、如果配置了databaseIdProvider标签,使用标签配置的name去匹配数据库信息,匹配上设置databaseId=配置指定的值,否则依旧为null
– 3、如果databaseId不为null,他只会找到配置databaseId的sql语句
– 4、MyBatis 会加载不带 databaseId 属性和带有匹配当前数据库databaseId 属性的所有语句。如果同时找到带有 databaseId 和不带databaseId 的相同语句,则后者会被舍弃。

13、mapper映射
• mapper逐个注册SQL映射文件


<mappers>

   <mapper resource="mybatis/mapper/PersonDao.xml"/>
   <mapper url="file:///D:/UserDao.xmL"/>
   
<mapper class="com.shell.dao.PersonDaoAnnotation"/>

<mappers>

• 或者使用批量注册:
• 这种方式要求SQL映射文件名必须和接口名相同并且在同一目录下

<mappers>

   <package name="com.shell.dao"/>

</mappers>

小小调酒师

此刻打盹,你将做梦; 此刻学习,你将圆梦。 个人邮箱:shellways@foxmail.com

文章评论