zoukankan      html  css  js  c++  java
  • mybatis3.0-[topic10-14] -全局配置文件_plugins插件简介/ typeHandlers_类型处理器简介 /enviroments_运行环境 /多数据库支持/mappers_sql映射注册

    mybatis3.0-全局配置文件_   下面为中文官网解释

    全局配置文件的标签需要按如下定义的顺序:

    <!ELEMENT configuration
    (properties?, settings?, typeAliases?, typeHandlers?, objectFactory?, objectWrapperFactory?,

    reflectorFactory?, plugins?, environments?, databaseIdProvider?, mappers?)>

    /plugins插件简介     目前了解即可

    插件(plugins) 
    MyBatis 允许你在已映射语句执行过程中的某一点进行拦截调用。默认情况下,MyBatis 允许使用插件来拦截的方法调用包括:
    
    Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
    ParameterHandler (getParameterObject, setParameters)
    ResultSetHandler (handleResultSets, handleOutputParameters)
    StatementHandler (prepare, parameterize, batch, update, query)
    这些类中方法的细节可以通过查看每个方法的签名来发现,或者直接查看 MyBatis 发行包中的源代码。

    /typeHandlers_类型处理器简介   目前了解即可

     

    无论是 MyBatis 在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时,
    都会用类型处理器将获取的值以合适的方式转换成 Java 类型。下表描述了一些默认的类型处理器。 提示 从 MyBatis
    3.4.5 (JDK1.8) 开始,MyBatis 默认支持 JSR-310(日期和时间 API) 。

    /enviroments_运行环境     <--4 -->

    MyBatis 可以配置成适应多种环境,这种机制有助于将 SQL 映射应用于多种数据库之中, 现实情况下有多种理由需要这么做。
    例如,开发、测试和生产环境需要有不同的配置;或者共享相同 Schema 的多个生产数据库, 想使用相同的 SQL 映射。许多类似的用例。
    
    不过要记住:尽管可以配置多个环境,每个 SqlSessionFactory 实例只能选择其一。
    事务管理器(transactionManager)
    数据源(dataSource)

    /多数据库支持      <--5 -->

    /mappers_sql映射注册      <--6 -->

    既然 MyBatis 的行为已经由上述元素配置完了,我们现在就要定义 SQL 映射语句了。
    但是首先我们需要告诉 MyBatis 到哪里去找到这些语句。
    Java 在自动查找这方面没有提供一个很好的方法,所以最佳的方式是告诉 MyBatis 到哪里去找映射文件。

    你可以使用相对于类路径的资源引用, 或完全限定资源定位符(包括 file:/// 的 URL),或类名和包名等。

    笔记要点


    出错分析与总结

    使用包名的批量注册, conf下的com.dao 和src下的com.dao目录一直,也更加好看,
    相当于把conf下的com.dao 的在物理位置上放到了src下的com.dao目录. 全局配置的mappers中添加:
    <package name="com.dao"/>

    推荐:比较重要的, 复杂的Dao 接口我们来写sql映射文件;
    不重要的,简单的Dao接口为了开发快速可以使用注解;

    全局配置文件 mybatis.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>
        <properties resource="dbconfig.properties"></properties>
        <settings>
            <setting name="mapUnderscoreToCamelCase" value="true"/>
        </settings>
        <!--.typeAliases : 别名处理器,可以为我们的java类的类型起别名 -->
        <typeAliases>
            <package name="com.bean"/>
        </typeAliases>
    
        <!-- 4.environments; 环境,mybatis可以配置多个环境,
            environments:配置一个具体的环境信息,必须有以下两个标签:
                transactionManager: 事务管理器;
                        在 MyBatis 中有两种类型(也就是 type=”[JDBC|MANAGED]”):
                            Spring中会自动覆盖;
    
                dataSource:数据源的type类型;
                    有三种内建的数据源类型(也就是 type=”[UNPOOLED|
                            POOLED|
                            JNDI]
                     自定义数据源:实现DatasourceFactory接口即可,
            -->
        <environments default="development">
                <!--测试环境-->
            <environment id="test">
                <transactionManager type="JDBC"></transactionManager>
                <dataSource type="POOLED">
                    <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="123456"/>
                </dataSource>
            </environment>
                <!--开发环境-->
            <environment id="development">
                <transactionManager type="JDBC"/>
                <dataSource type="POOLED">
                    <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="123456"/>
                </dataSource>
            </environment>
        </environments>
        <!--
            5.databaseIdProvider : 支持多数据库厂商;
                type="DB_VENDOR" ,
                作用就是得到数据库厂商的标识(驱动:getDatabaseProductName()).mybatis
                -->
        <databaseIdProvider type="DB_VENDOR">
            <property name="SQL Server" value="sqlserver"/>
            <property name="DB2" value="db2"/>
            <property name="MySQL" value="mysql"/>
            <property name="Oracle" value="oracle" />
        </databaseIdProvider>
            <!--6. 将我们写好的sql映射文件{EmployeeMapper.xml},
            一定要注册到本全局配置文件{mybatis-config.xml}中-->
        <mappers>
            <!--
                一个mapper; 注册一个sql映射!
                resource: 引用类路径下的sql映射文件,
                       eg: resource="EmployeeMapper.xml"/>
                或完全限定资源定位符:引用网络路径或者磁盘路径下的sql映射文件(包括 file:/// 的 URL),
                       eg:<mapper url="file:///var/conf/*********.xml"/>
                或类名(使用映射器接口实现类的完全限定类名):
                    注册接口:class,引用注册接口.
                            1.有sql映射文件
                            2,没有sql映射文件,所有的sql都是利用注解进行;
                            eg:    <mapper class="com.dao.EmployeeMapperAnnotation"/>
                批量注册: 包名(将包内的映射器接口实现全部注册为映射器):
    
                推荐:比较重要的, 复杂的Dao 接口我们来写sql映射文件;
                    不重要的,简单的Dao接口为了开发快速可以使用注解;
                -->
            <package name="com.dao"/>
    
        </mappers>
    </configuration>

    工程组织


    测试代码

    使用注解,建立EmployeeMapperAnnotation接口, 并加上注解

    @Select("select * from tbl_employee where id=#{id}")

     :

    package com.dao;
    
    import com.bean.*;
    import org.apache.ibatis.annotations.Select;
    
    public interface EmployeeMapperAnnotation {
        @Select("select * from tbl_employee where id=#{id}")
        public Employee getEmpById(Integer id);
    }

    测试类:test_tp14    测试成功

    package com.test;
    
    public class test_tp14 {
        public SqlSessionFactory getSqlSessionFactory() throws IOException {
            String resource = "mybatis-config.xml";
            InputStream inputStream=Resources.getResourceAsStream(resource);
            return new SqlSessionFactoryBuilder().build(inputStream);
        }
        @Test
        public void test02() throws IOException{
            SqlSession openSession = getSqlSessionFactory().openSession();
    
            try {
                EmployeeMapperAnnotation mapper=openSession.getMapper(EmployeeMapperAnnotation.class);
                Employee empById = mapper.getEmpById(1);
                System.out.println(empById);
            } finally {
                openSession.close();
            }
        }
    
    }

    上个博客的 测试类:test_tp04    也测试成功

    package com.test;
    import com.bean.*;
    import com.dao.*;
    import org.apache.ibatis.io.Resources;
    import org.apache.ibatis.session.SqlSession;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    import org.junit.Test;
    
    import java.io.IOException;
    import java.io.InputStream;
    
    /**接口式编程:
     * 1.  原生: Dao 接口-->Dao接口的实现类
     *   mybatis: Mapper --> 有一个与之对应的 XXMapper.xml
     * 2. SqlSession
     *      代表与数据库的一次会话,用完必须关闭资源;
     *3.SqlSession 和connection 一样都是非线程安全,不能声明为全局变量;
     *         每次使用都需要重新生命.
     * 4.mapper接口没有实现类, 但是mybatis 会为这个接口生成一个代理对象:
     *        (需要先将接口和XML文件进行绑定!)
     *        EmployeeMapper empMapper=openSession.getMapper(EmployeeMapper.class);
     *  5.两个重要的配置文件:
     *      mybatis的全局配置文件: 包含数据库连接池信息,事物管理器信息,系统文件的信息.....
     *      SQL映射文件: 保存了每一个SL语句的映射信息,
     */
    public class Test_tp04 {
        //创建一个模板,直接返回一个新建的SqlSessionFactory
        public SqlSessionFactory getSqlSessionFactory() throws IOException {
            String resource = "mybatis-config.xml";
            InputStream inputStream=Resources.getResourceAsStream(resource);
            return new SqlSessionFactoryBuilder().build(inputStream);
        }
        @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("mapper.getClass(): "+mapper.getClass());
                System.out.println(employee);
            } finally {
                openSession.close();
            }
        }
    }
    View Code


    测试结果

    DEBUG 11-27 18:20:35,719 ==>  Preparing: select * from tbl_employee where id=?   (BaseJdbcLogger.java:145) 
    DEBUG 11-27 18:20:35,736 ==> Parameters: 1(Integer)  (BaseJdbcLogger.java:145) 
    DEBUG 11-27 18:20:35,748 <==      Total: 1  (BaseJdbcLogger.java:145) 
    Employee{id=1, lastname='tom', email='598@qq.com', gender='0'}
  • 相关阅读:
    自动化运维
    rabbitmq常见问题
    常见的排序算法
    rabbitmq
    redis-其他应用
    redis之缓存穿透、雪崩、击穿
    redis-cluster(集群)
    redis -sentinel(哨兵)
    redis持久化
    redis简介
  • 原文地址:https://www.cnblogs.com/zhazhaacmer/p/10028168.html
Copyright © 2011-2022 走看看