• mybatis常用配置


    前面两篇博客我们简单介绍了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 技术原理与实战》第三章

  • 相关阅读:
    try-catch 回滚事务,避免回滚失效的操作
    Java 7中的Try-with-resources
    Linux开发环境之配置静态IP地址
    Windows和Linux系统如何退出python命令行
    Python基础(一)
    Linux开发环境之nginx
    Linux开发环境之安装自带jdk
    Linux删除命令的几种方式
    MySQL之新建索引原则
    webapp环境搭建(一)
  • 原文地址:https://www.cnblogs.com/qitian1/p/6461629.html
Copyright © 2020-2023  润新知