Mybatis快速复习--全局配置文件(一)

125 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第21天,点击查看活动详情

MyBatis-全局配置文件

配置文件很重要,下面我们来看看配置文件中的参数都是什么意思!

配置文档的顶层结构如下:

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

properties

mybatis可以使用properties来引入外部properties配置文件的内容 resource:引入类路径下的资源 url:引入网络路径或磁盘路径下资源

<properties resource="jdbc.properties"></properties>

设置好的属性可以在整个配置文件中用来替换需要动态配置的属性值。

<!--数据源-->
    <environments default="mysql">
        <environment id="mysql">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"></property>
                <property name="url" value="${jdbc.url}"></property>
                <property name="username" value="${jdbc.username}"></property>
                <property name="password" value="${jdbc.password}"></property>
            </dataSource>
        </environment>
    </environments>

前面的例子我们用的也是这种方式,写一个配置文件在外部,之后我们在全局配置文件中通过properties引入配置文件,之后通过${}来取配置文件中的值

settings

这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。 下表描述了设置中各项设置的含义、默认值等。

驼峰命名的开启很重要,因为在数据库中的字段两个字母组成的意思的时候往往通过下划线(_)分割,但在java中都是驼峰型的。为了解决这个问题,可以开启mapUnderscoreToCamelCase 来进行数据库字段和java属性的映射。下面会有演示

settings包含很多重要的设置项 setting用来设置每一个设置项 name设置项名 value设置项取值

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

第一个我们开启了驼峰映射,第二个是延迟加载后面我们会说

我们来看看是怎么映射的

@Alias("emp")
public class Employee {
    private Integer id;
    private String lastName;
}

我们的实体类Employee这个字段名是lastName

数据库中的这个字段是last_name 开启后,会自动把last_name映射为lastName所以查询的话是能查询成功的

这个是sql映射文件(接口式编程,我们要先在接口中定义getEmpById方法,参数设置为id)

<!--    id指定接口中的方法,这样不仅文件和接口绑定,select标签也和方法进行了绑定
什么意思呢?就是select这个标签是EmployeeMapper接口下getEmpById方法的实现
-->
<select id="getEmpById" resultType="emp">
    select * from tbl_employee
    where id = #{id}
</select>

测试

    //    接口式编程,方便解耦
    @Test
    public void test01() throws IOException {
//        1、获取sqlSessionFactory对象
        SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
//        2、获取sqlSession对象
        SqlSession openSession = sqlSessionFactory.openSession();

        try {
            //        3、获取接口的实现类对象
            EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
//            第二种方式是先获取接口的实现类对象,之后实现接口的方法传入参数
            Employee employee = mapper.getEmpById(1);
            System.out.println(employee);
        } finally {
            openSession.close();
        }
    }

Employee{id=1, lastName='tom', email='tom@caq.com', gender='0'}

可以看到lastName是有值的

如果关闭驼峰,lastName这列是不显示值的如下

<settings>
    <setting name="mapUnderscoreToCamelCase" value="false"/>
    <setting name="aggressiveLazyLoading" value="false"/>
</settings>

中间的步骤一样不在赘述,结果为:

Employee{id=1, lastName=NULL, email='tom@caq.com', gender='0'}

typeAliases

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

typeAliases:别名处理器,可以为我们的java类型起别名 别名不区分大小写 typeAliases为某个java类型起别名 type:指定要起别名的类型全类名;默认别名就是类名小写;employee alias:指定新的别名

package:为某个包下的所有类批量起别名 name:指定包名(为当前包以及下面所有的后代包的每一个类都起一个默认别名(类名小写))

<typeAliases>
    <typeAlias type="com.caq.mybatis.bean.Employee" alias="emp"></typeAlias>
</typeAliases>
<!--批量别名-->
<typeAliases>
    <package name="com.caq.mybatis.bean"/>
</typeAliases>

批量起别名的情况下我们不想用默认的话,可以使用@Alias注解为某个类型指定新的别名

是吧,我们在Employee实体类上面加了个@Alias给它起了个别名叫emp

@Alias("emp")
public class Employee {}

但是呢,虽然有别名,为了项目更好的维护我们一般都使用全类名。要不然谁知道你写的别名是啥意思