四、MyBatis基本要素—核心配置文件

一、本课目标

  • 掌握核心配置文件结构

二、核心配置文件

image.png

分析:
1、properties:描述一些外部的、可以替代的一些属性。比如说之前的测试中的读取数据库的database.properties文件。可以配置在java属性配置文件中。
2、settings:设置一些比较重要的配置项,比如说通过settings元素设置了mybatis的log实现为log4j。通过这种设置可以修改mybatis在运行时的一些行为方式,当然也还有很多其他方面的setting,后续会学习到。
3、typeAliases:为Java类型命名一个别名(简称)
4、typeHandlers、objectFactory、plugins这几个没用到,简单了解一下就可以了。
5、environments:这个是配置文件中很重要的一个,我们要配置我们的运行环境,之所以是复数形式,是因为运行环境可以有多套。
6、environment:运行环境;如果设置一套运行环境,需要设置事务管理器transactionManager和dataSource数据源。运行环境其实就是连接数据库的一些数据源啊、事务啊等等。
7、mappers:映射器;通过映射器才可以引入sqlMapper映射文件,之后再进行一些相应的sql操作。

注:
1、这个配置文件在书写的时候一定要注意元素的顺序。

三、标签分析

3.1、配置properties元素

配置properties元素有两种方式:

  • 通过外部指定的方式(database.properties),实现动态配置
  • 直接配置为xml,实现动态配置

第一种方式就是之前一直使用的方式。

第一种方式:通过外部指定的方式(database.properties),实现动态配置

可以通过properties标签的resource属性指定外部文件,然后在配置环境的时候去指定的外部文件中拿值。


image.png

第二种方式:直接配置为xml,实现动态配置

image.png

直接将值配置为xml,然后在dataSource中拿到上面配置的值。


此处发现一个bug,已经定位到,但是不知道怎么解决,特此记录:
使用第二种方式配置如下:





    

    
        
        
        
        
    
    
    
        
    
     
    
    
    
        
            
            
                
                
                
                
            
        
    

    
    
        
        
    

单元测试如下:

package cn.smbms.dao.user;

import static org.junit.Assert.*;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.log4j.Logger;
import org.junit.Before;
import org.junit.Test;

import cn.smbms.pojo.User;
import cn.smbms.utils.MyBatisUtil;

public class UserMapperTest {
    private Logger logger = Logger.getLogger(UserMapperTest.class);
    @Before
    public void setUp() throws Exception {
    }

    @Test
    public void test() {
        int count = 0;
        SqlSession sqlSession = null;
        try {
            sqlSession = MyBatisUtil.createSqlSession();
        // 4、调用mapper文件来对数据进行操作,操作之前必须将mapper文件引入到mabatis-config.xml中
            count = sqlSession.selectOne("cn.smbms.dao.user.UserMapper.count");
            logger.debug("UserMapperTest count ---->" + count);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            MyBatisUtil.closeSqlSession(sqlSession);
        }
    }

    @Test
    public void testGetUserList() {
        List userList = null;
        SqlSession sqlSession = null;
        try {
            sqlSession = MyBatisUtil.createSqlSession();
        // 4、调用mapper文件来对数据进行操作,操作之前必须将mapper文件引入到mabatis-config.xml中
        //  userList = sqlSession.selectList("cn.smbms.dao.user.UserMapper.getUserList");
            userList = sqlSession.getMapper(UserMapper.class).getUserList();
            
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            MyBatisUtil.closeSqlSession(sqlSession);
        }
        for (User user:userList) {
            logger.debug("testGetUserList userCode:" + user.getUserCode()
                    + "and userName" + user.getUserName() + user.getModifyDate());
        }
    }
}

在以上mybatis-config.xml配置下,测试test,此时测试正常。但是测试testGetUserList会出异常:


image.png

这个异常的解决方法是:将url改变为:

String url = "jdbc:mysql://localhost:3306/test?relaxAutoCommit=true&zeroDateTimeBehavior=convertToNull";

但是如果在property标签中将值改变为:


则测试test或者testGetUserList的时候根本没有结果。

第三、如果两种方式都采用了,那么哪种方式会优先呢?

如果两种方式同时都用了,那么哪种方式优先?

  • 配置properties的resource指定
  • 配置property的name和value

示例如下:

    
        
        
        
        
    

database.properties中的数据如下:

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/smbms?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull
username=root
password=41312019

注:在xml配置中的密码是错的,是为了判断到底哪个配置起作用了。
在以上情况下,对test进行测试,单元测试代码如下:

@Test
    public void test() {
        int count = 0;
        SqlSession sqlSession = null;
        try {
            sqlSession = MyBatisUtil.createSqlSession();
        // 4、调用mapper文件来对数据进行操作,操作之前必须将mapper文件引入到mabatis-config.xml中
            count = sqlSession.selectOne("cn.smbms.dao.user.UserMapper.count");
            logger.debug("UserMapperTest count ---->" + count);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            MyBatisUtil.closeSqlSession(sqlSession);
        }
    }

运行结果:
是可以正常运行的,但是如果把database.properties中的密码写错,而把xml文件中的密码写正确的话,则会报数据库连接异常。
分析:在xml文件和外部文件中同时设置了属性的话,则xml文件中的设置是会被先读取的;读取了之后,由于又通过resource进行了外部指定,外部指定文件中也设置了这些个属性,那么resource指定文件中的同名属性则会覆盖xml文件中指定的值。即resource属性值的优先级高于property子节点配置的值

3.2settings元素

  • 用来修改MyBatis运行是的行为方式
  • 主要是MyBatis的一些全局配置属性的设置

如下代码:


    
        


    
        
    
image.png

3.3typeAliases元素

  • 类型别名
  • 仅仅只关联XML配置,简写冗长的Java类名


    image.png

应用示例:
比如之前的UserMapper.xml映射文件中,查询用户列表的时候,返回结果类型设置的是cn.smbms.pojo.User,这样写太长了,可以这么操作:
在配置文件中增加typeAliases标签(如果不知道该标签所在的顺序位置,可以在design里面右键点击configuration,选择add child)给cn.smbms.pojo.User起一个别名,这样做会简化写法。具体如下:
配置文件为:





    
    

    
    
        
    
    
    
        
    
    
    
    
        
            
            
                
                
                
                
            
        
    

    
    
        
        
    

映射文件为:







    
    
    
    
    
    
    

此时进行单元测试也没有任何问题。


如果pojo有多个,则就需要加多个:


        
        
    

同时还有一种更简化的写法:


        
    

这种写法相当于把pojo包中的所有实体类都直接起了一个别名,这个默认的别名就是实体类的名字,不区分大小写。

3.4environments元素

  • 表示配置Mybatis的多套运行环境,将SQL映射到多个不同的数据库上
  • 子元素节点:environment,但是必须指定其中一个默认运行环境(通过default属性指定)

注:每个SqlSessionFactory实例只能选择一个运行环境
具体配置如下:

image.png

分析:
1、在environments表中的default属性中指定默认的运行环境id,这个运行环境id是下面的environment标签中的某一个id。
2、运行环境id要确保唯一。
3、transactionManager标签设置事务管理器类型,MyBatis一共有两种事务管理器类型:JDBC和Managed。这里主要是使用JDBC的提交和回滚的功能,从数据源获取连接来管理事务的生命周期。
4、dataSource是数据源,数据源的类型有三种,这里使用的是POOLED。

transactionManager事务管理器

image.png

dataSource

  • dataSource元素使用基本的JDBC数据源接口来配置JDBC连接对象的资源
  • 有三种内建的数据源类型


    image.png

3.5Mapper元素

  • 映射器,定义SQL映射语句
  • 须在配置中引用mapper映射文件


    image.png

四、小结

image.png

你可能感兴趣的:(四、MyBatis基本要素—核心配置文件)