zoukankan      html  css  js  c++  java
  • 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 技术原理与实战》第三章

    关注公众号【江南一点雨】,专注于 Spring Boot+微服务以及前后端分离等全栈技术,定期视频教程分享,关注后回复 Java ,领取松哥为你精心准备的 Java 干货!

  • 相关阅读:
    克如斯卡尔 P1546
    真正的spfa
    第四课 最小生成树 要点
    关于vscode中nullptr未定义
    cmake学习笔记
    python学习笔记
    (BFS 图的遍历) 2906. kotori和迷宫
    (图论基础题) leetcode 997. Find the Town Judge
    (BFS DFS 并查集) leetcode 547. Friend Circles
    (BFS DFS 图的遍历) leetcode 841. Keys and Rooms
  • 原文地址:https://www.cnblogs.com/lenve/p/7530973.html
Copyright © 2011-2022 走看看