前面两篇博客我们简单介绍了mybatis的使用,但是在mybatis的配置问题上我们只是使用了最基础的配置,本文我们就来说说其他一些常用的配置。如果小伙伴对mybatis尚不了解,可以先参考这两篇博客初识mybatis/初识mybatis(二)。老司机请略过。

由于本文算是初识mybatis/初识mybatis(二)两篇博客的补充,所以强烈建议没有mybatis基础的小伙伴一定要先看这两篇博客。

OK,那就开始吧!


properties配置

在上文中,对于数据库的信息我们将之保存在一个db.properties文件中,然后在mybatis-conf.xml文件中通过properties节点将之引入,如下:

<properties resource="db.properties"/>

在需要使用的地方通过${XXX}来应用相关值,如下:

<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给我们提供的properties的配置方式不止这一种,我们也可以在properties节点中添加property,然后再引用其中的值,如下:

    <properties>
        <property name="driver" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
        <property name="username" value="root"/>
        <property name="password" value="sang"/>
    </properties>

也可以使用上面这种方式代替<properties resource="db.properties"/>,然后在需要的地方还是通过${XXX}来引用,这个是一致的。当然实际开发中第一方式更常用。

有的时候我们有另外一种需求,就是如果我们把数据库的配置文件写在db.properties中,这个文件谁都可以打开,显然,数据库用户名和密码直接放在这里并不安全,所以有的时候我们在这里放的是加密后的用户名和密码,然后在加载该文件的时候再对加密后的用户名和密码进行解密,OK,那我们来看看这个要怎么实现,举个例子,我的数据库用户名是root,密码也是root,加密后的字符假设用户名变为root-123,密码变为root-456(我这里只是举例,实际开发中按照既定规则加解密即可),这样,我的db.properties文件就是这样的:

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis
username=root-123
password=root-456

当然这样的配置是不能够成功连接数据库的,所以我们需要在加载db.properties的时候再对这里的值进行解密,解密的方式很简单,其他地方不变,只需要在构造SqlSessionFactory的地方稍作修改即可,方式如下:

    public static SqlSessionFactory initSqlSessionFactory2() {
        InputStream cfgStream = null;
        Reader cfgReader = null;
        InputStream proStream = null;
        Reader proReader = null;
        Properties properties = null;
        try {
            cfgStream = Resources.getResourceAsStream("mybatis-conf.xml");
            cfgReader = new InputStreamReader(cfgStream);
            proStream = Resources.getResourceAsStream("db.properties");
            proReader = new InputStreamReader(proStream);
            properties = new Properties();
            properties.load(proReader);
            //获取密文用户名和密码
            String username = properties.getProperty("username");
            String password = properties.getProperty("password");
            //解密
            properties.setProperty("username", ((String) username).substring(0, username.indexOf("-")));
            properties.setProperty("password", ((String) password).substring(0, password.indexOf("-")));
        } catch (IOException e) {
            e.printStackTrace();
        }
        synchronized (CLASS_LOCK) {
            if (sqlSessionFactory == null) {
                sqlSessionFactory = new SqlSessionFactoryBuilder().build(cfgReader,properties);
            }
        }
        return sqlSessionFactory;
    }

通过properties中的getProperty方法先获取原始的值,然后再进行修改,修改之后重新设置即可,然后在构造SqlSessionFactory的时候再将之作为参数传入即可。

typeAliases配置

在上篇博客中我们还配置了一种称之为别名的东西,实际上这个东西也可以不用定义,如果我们在mybatis-conf.xml中没有定义typeAliases的话,那么在userMapper.xml文件中写返回值类型就得这样来写:

<select id="getUser" resultType="org.sang.bean.User" parameterType="Long">
        select * from user where id = #{id}
    </select>

要写类的全路径,这样很明显很麻烦。所以我们需要定义别名,这样用起来方便,我们在mybatis-conf.xml中定义别名,如下:

<typeAliases>
        <typeAlias type="org.sang.bean.User" alias="user"/>
    </typeAliases>

这样我们在使用User这个对象的时候直接写user就行了,而不用从包名就开始写起。那么这里有一个需要注意的地方就是别名不区分大小写

有的时候我们的bean包下有许多实体类,一个一个的取别名显然太麻烦,有没有什么快捷方式呢?当然有!我们可以像下面这样来直接注册一个包下所有的实体类:

<typeAliases>
        <package name="org.sang.bean"/>
    </typeAliases>

这样,当系统启动的时候就会扫描bean包下所有的实体类,然后给这些实体类取别名,默认的别名即类名,只不过首字母变为小写。那有小伙伴说了,如果使用这种方式我还想自定义别名又该怎么做呢?其实很简单,在相应的实体类上使用@Alias注解就可以了,比如我想给User实体类取一个别名叫做u,我可以这么写:

@Alias("u")
public class User {
    private Long id;
    private String username;
    private String password;
    private String address;
    //省略getter/setter
}

映射器引入

在mybatis-conf.xml中我们还引入了映射器,引入方式如如下:

<mappers>
        <mapper resource="userMapper.xml"/>
    </mappers>

除了这种方式之外,我们还可以这样来引入:

<mappers>
        <package name="org.sang.db"/>
    </mappers>

这种方式直接定位到Mapper所在的包,然后系统自动自动扫描,这种适合通过@Select注解来配置SQL语句,而不是使用xml来配置Mapper,此外,我们还可以这样来引入Mapper:

<mappers>
        <mapper class="org.sang.db.UserMapper"/>
    </mappers>

这种直接定位到具体的类,也是适用于通过@Select注解来配置SQL语句。此外,也可以直接通过文件路径来定位一个Mapper:

<mappers>
        <mapper url="file:///home/sang/workspace/JavaEE/Test27-mybatis4/src/main/resources/userMapper.xml"/>
    </mappers>

方式多种多样,在实际开发中我们根据自己的需求选择合适的方法即可。

OK,以上就是我们在mybatis中的常用配置。

本文案例下载:

本文案例GitHub地址https://github.com/lenve/JavaEETest/tree/master/Test27-mybatis4

以上。

参考资料:

《深入浅出MyBatis 技术原理与实战》第三章

mybatis常用配置的更多相关文章

  1. mybatis一(常用配置信息和获取插入后id)

    <!--配置文件--><?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE conf ...

  2. MyBatis XML常用配置

    1.属性(properties) 可外部配置且可动态替换的,既可以在典型的 Java 属性文件中配置,亦可通过 properties 元素的子元素来传递. 可以外部定义好properties文件通过 ...

  3. 简单解析一下 Mybatis 常用的几个配置

    目录 核心配置文件 环境配置(environments) 属性(properties) 类型别名(typeAliases) 映射器(mappers) Mybatis 参考:https://mybati ...

  4. Mybatis XML配置

    Mybatis常用带有禁用缓存的XML配置 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE ...

  5. Spring常用配置

    ----------------------------------------------------------------------------------------------[版权申明: ...

  6. MyBatis 常用写法

    MyBatis 常用写法 1.forEach 循环   forEach 元素的属性主要有 item, idnex, collection, open, separator, close. collec ...

  7. MyBatis常用对象SqlSessionFactory和SqlSession介绍和运用

    学习框架一个比较好的路径阅读源码.本文介绍的SqlSessionFactory和SqlSession.可以通过了解SqlSessionFactory接口和SqlSession接口以及两个的实现类入手, ...

  8. MyBatis 核心配置综述之 ParameterHandler

    目录 ParameterHandler 简介 ParameterHandler 创建 ParameterHandler 中的参数从何而来 ParameterHandler 解析 MyBatis 四大核 ...

  9. Spring 常用配置、Bean

    spring模块 Spring-Core: Core包是框架的最基础部分,并提供依赖注入(Dependency Injection)管理Bean容器功能. Spring-Context:(Spring ...

随机推荐

  1. java内部类、接口、集合框架、泛型、工具类、实现类

    .t1 { background-color: #ff8080; width: 1100px; height: 40px } 一.内部类 1.成员内部类. (1)成员内部类的实例化: 外部类名.内部类 ...

  2. 【转】如何使用slave_exec_mode优雅的跳过1032 1062的复制错误

    今天线上的主从复制发生1062的错误,使用sql_slave_skip_counter跳过之后,由于后面的事务需要对刚刚的数据进行update,后续造成了新的1032的错误. 后来,无意中发现还有更好 ...

  3. 简述SharePoint designer 工作流实现用户撤回申请得解决方案,how to revoke/recall application in SharePoint designer workflow

    在工作中很容易碰到用户提出,需要可以撤回申请得需求.有这么几种实现方法. 方案一:designer中加一个parallel(平行)得anction, 然后在里面添加两个平行运行得审批 第一个是给真正得 ...

  4. Python系列之 - python循环语句

    前两篇说的是数据类型和数据运算,本篇来讲讲条件语句和循环语句. 1. 条件语句 条件语句是通过一条或多条语句的执行结果(True或者False)来决定执行的代码块. 可以通过下图来简单了解条件语句的执 ...

  5. 关于Ueditor存储在mysql"UTF-8"乱码的问题

    关于Ueditor存储在mysql"UTF-8"乱码的问题 首先小编要声明之前出乱码的原因,mysql 字段设置的BLOB类型 紧接着我们要先确认两件事: 1.首先要确认你的mys ...

  6. 基于webpack的React项目搭建(三)

    前言 搭建好前文的开发环境,已经可以进行开发.然而实际的项目中,不同环境有着不同的构建需求.这里就将开发环境和生产环境的配置单独提取出来,并做一些简单的优化. 分离不同环境公有配置 不同环境虽然有不同 ...

  7. Android ART、Dalvik在multidex上的差异、关联

    为提升应用运行性能,谷歌官方从5.0(api level:21)版本开始,将虚拟机运行环境默认为ART, 此处主要研究ART.Dalvik在multidex处理上的差异和关联,做了一个简单的手绘,如下 ...

  8. [BZOJ 4919]大根堆

    Description 题库链接 给定一棵 \(n\) 个节点的有根树,每个点有一个权值 \(val_i\) .你需要选择尽可能多的节点,使得:对于任意两个点 \(i,j\) ,如果 \(i\) 在树 ...

  9. [ZJOI 2007]Hide 捉迷藏

    Description 捉迷藏 Jiajia和Wind是一对恩爱的夫妻,并且他们有很多孩子.某天,Jiajia.Wind和孩子们决定在家里玩捉迷藏游戏.他们的家很大且构造很奇特,由N个屋子和N-1条双 ...

  10. [NOI 2007]社交网络

    Description 在社交网络(socialnetwork)的研究中,我们常常使用图论概念去解释一些社会现象.不妨看这样的一个问题.在一个社交圈子里有n个人,人与人之间有不同程度的关系.我们将这个 ...