MyBatis在普通Java中的应用

MyBatisPlus
placeholder image
admin 发布于:2017-06-10 09:54:57
阅读:loading

接着上一篇的quartz来说,背景都一样,涉及到dao层模块,最先是把以前封装的apache-dbutils组件拿过来,后来越来越觉得在代码里写一堆sql日后肯定会很蛋疼的,在能力范围内将代码写到最好,我理解的最好是可维护性最佳,毕竟niubility的人写出来的代码渣渣水平都是能改的,而渣渣写出来的代码反而niubility的人都改不了的,不废话了。

强烈建议按着这里过一遍http://www.mybatis.org/mybatis-3/zh/index.html,基本上你就都了解了,MyBatis的介绍说SqlSessionFactory对象只能适于一个环境,换句话说,如果你想适用于两个数据库,那么需要创建两个SqlSessionFactory实例,每个数据库对应一个;如果是三个数据库则需要三个实例,以此类推。

这里有一个概念需要说明一下,普通Java程序的意义这里解释的有些不科学,其实我想表达式非框架环境,即抛离spring后的mybatis,普通类调用mybatis的方式。

由于本次软件的特殊,配置类型的文件都将存放的与src目录同级,所以在创建SqlSessionFactory的时候,它的configuration.xml配置文件是我以流的形式传递的,而配置文件中涉及到从database.properties配置文件中获取连接数据库的相关参数,所以我预先读取到此properties文件中的参数,再去构造相关的SqlSessionFactory实例(configuration.xm文件中有properties文件的读取标签,可能是由于本次配置文件存储目录的特殊性,导致它提供的配置文件路径无法被找到),参考代码如下:

configuration.xml 配置文件,包括两个数据源

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>

    

    <!--  -->

    <settings>

        <setting name="logPrefix" value=""/><!--  -->

    </settings>

    

    <!-- 

    Javabean使使

    使

     -->

    <typeAliases>

        <package name="cn.chendd.vo"/>

    </typeAliases>

    

    <!-- propertiesSqlSessionFactory -->

    <environments default="LOCALE">

        <environment id="LOCALE">

            <transactionManager type="JDBC" />

            <dataSource type="cn.chendd.mybatis.DbcpPoolFactory">

                <property name="driver" value="${driverClassName}"/>

                <property name="url" value="${url}"/>

                <property name="username" value="${username}"/>

                <property name="password" value="${password}"/>

                <property name="driver.poolMaximumActiveConnections" value="${initialSize}"/><!--  -->

                <property name="driver.poolMaximumIdleConnections" value="${maxIdle}"/><!--  -->

                <property name="driver.poolMaximumCheckoutTime" value="${maxWait}"/><!--  -->

                <property name="driver.encoding" value="UTF-8"/>

            </dataSource>

        </environment>

        <environment id="REMOVE">

            <transactionManager type="JDBC" />

            <dataSource type="cn.chendd.mybatis.DbcpPoolFactory">

                <property name="driver" value="${driverClassName}"/>

                <property name="url" value="${url}"/>

                <property name="username" value="${username}"/>

                <property name="password" value="${password}"/>

                <property name="driver.poolMaximumActiveConnections" value="${initialSize}"/><!--  -->

                <property name="driver.poolMaximumIdleConnections" value="${maxIdle}"/><!--  -->

                <property name="driver.poolMaximumCheckoutTime" value="${maxWait}"/><!--  -->

                <property name="driver.encoding" value="UTF-8"/>

            </dataSource>

        </environment>

    </environments>

    

    <!--  -->

    <mappers>

        <mapper resource="sqls/DemoDao.xml" />

    </mappers>

</configuration>

数据源实例枚举

public enum EnumDataSource {

    LOCALE(),//1

    REMOVE(),//2

    ;

    

}

SqlSessionFactory实例包装(实例数与environment环境数一样)

private static Map<EnumDataSource , SqlSessionFactory> sqlSessionFactorys = Init.instances;

    

    /**

     * 

     */

    protected static final class Init {

        

        private static Map<EnumDataSource , SqlSessionFactory> instances = new HashMap<EnumDataSource , SqlSessionFactory>();

        

        static {

            initSqlSessionFactory();

        }

        

        private static void initSqlSessionFactory() {

            String config = new PropertiesUtil("configuration.xml").getPropertiesByPath();

            EnumDataSource datas[] = EnumDataSource.values();

            Properties props = new PropertiesUtil("database.properties").getProperties();

            //InputStreambuildInputclose

            for (EnumDataSource enumDataSource : datas) {

                try {

                    InputStream input = new FileInputStream(config);

                    SqlSessionFactory instance = new SqlSessionFactoryBuilder().build(input , props);

                    instances.put(enumDataSourceinstance);

                } catch (FileNotFoundException e) {

                    e.printStackTrace();

                }

            }

        }

    }

每个BaseDao的实现基于一个数据源

/**

 * BaseDao

 */

public class LocaleDao extends SqlSessionFactoryUtil {

    @Override

    public SqlSession getSqlSession() {

        return super.getLocaleSqlSession();

    }

    

}

/**

 * BaseDao

 */

public class RemoteDao extends SqlSessionFactoryUtil {

    @Override

    public SqlSession getSqlSession() {

        return super.getRemoveSqlSession();

    }

    

}

测试类

public static void main(String[] args) {

    LocaleDao dao = new LocaleDao();

    //

    Map<String , Object> map = dao.selectOne("cn.DemoDao.queryUsers" , null);

    System.out.println(map);

}


 点赞


 发表评论

当前回复:作者

 评论列表


留言区