设为首页 收藏本站
查看: 854|回复: 0

[经验分享] mybatis-config详细配置说明

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2016-11-23 08:46:49 | 显示全部楼层 |阅读模式
<?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>
    <!-- 属性配置元素可以将配置值具体化到一个属性文件中,并且使用配置文件的key作为占位符
        application.properties
        jdbc.driverClassName=com.mysql.jdbc.Driver
        jdbc.url=jdbc:mysql://localhost:3306/mybatisdemo
        jdbc.username=root
        jdbc.password=admin
        在mybatis-config.xml中可以使用application.properties文件中定义的占位符
        当然也可以直接使用properties来设置值
     -->
    <properties resource="application.properties">
        <property name="username" value="db_user" />
        <property name="password" value="verysecurepwd" />
    </properties>
    <!-- 全局设置settings -->
    <settings>
        <setting name="cacheEnabled" value="true" />
        <setting name="lazyLoadingEnabled" value="true" />
        <setting name="multipleResultSetsEnabled" value="true" />
        <setting name="useColumnLabel" value="true" />
        <setting name="useGeneratedKeys" value="false" />
        <setting name="autoMappingBehavior" value="PARTIAL" />
        <setting name="defaultExecutorType" value="SIMPLE" />
        <setting name="defaultStatementTimeout" value="25000" />
        <setting name="safeRowBoundsEnabled" value="false" />
        <setting name="mapUnderscoreToCamelCase" value="false" />
        <setting name="localCacheScope" value="SESSION" />
        <setting name="jdbcTypeForNull" value="OTHER" />
        <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode ,toString" />
    </settings>
    <!-- 类型别名
        主要是为了简化在mapper文件中paramerType和resultType对应的类全限定名
     -->
    <typeAliases>
        <typeAlias alias="Tutor" type="com.mybatis3.domain.Tutor" />
        <!-- 可以提供需要取别名的类所在的包,mybatis会自动扫描包内的javaBean,然后分别为每个javaBean定义一个小写字母开头的
             例如这个包下有一个Student,那么别名为:student
             除此之外:@Alias("StudentAlias")
                   public class Student{
                         ...
                   }
            @Alias 注解将会覆盖配置文件中的<typeAliases>定义
        -->
        <package name="com.mybatis3.domain" />
    </typeAliases>
    <!--
        类型句柄,类型处理器
        当mybatis执行一个INSERT操作的时候,汇创建一个PreparedStatement对象,并且执行一系列操作(操作下面详细说)
        这个过程中有一个setXXX()方式为占位符设置值的过程,xxx可以是Int,String,Date的任何一种类型,
        那么mybatis是依据什么来判断该使用setInt()还是setString()呢?其实 MyBatis 是通过使用类型处理器(type handlers)来决定这么做的。
        MyBatis 对于以下的类型使用内建的类型处理器:所有的基本数据类型、基本类型的包裹类型、byte[] 、
        java.util.Date、java.sql.Date、java,sql.Time、java.sql.Timestamp、java 枚举类型等。所以当 MyBatis 发现
        属性的类型属于上述类型,他会使用对应的类型处理器将值设置到 PreparedStatement 中,同样地,当从 SQL 结果集构
        建 JavaBean 时,也有类似的过程。
     -->
    <typeHandlers>
        <typeHandler handler="com.mybatis3.typehandlers. PhoneTypeHandler" />
        <package name="com.mybatis3.typehandlers" />
    </typeHandlers>
    <!-- 数据库连接环境配置-->
    <environments default="development">
        <!-- environment:
        mybatis可以有多个dataScource环境,如DEV(开发),TEST(测试),
        可以通过默认的设置environment值来设定想要的environment  id。
        如果一个应用需要连接多个数据库,需要将每一个数据库设置成一个单独的环境,
        并且为每一个数据库设置一个SqlSessionFactory -->
        <environment id="development">
            <!-- 事务管理器
                type1:JDBC:mybatis内部会使用JdbcTransactionFactory来创建TransectionManager。
                           例如,部署到tomcat的应用程序,需要应用程序自己来管理程序
                type2:MANAGED(托管,应用本身不去管理实务,交给所在服务器来管理):
                      mybatis内部使用ManagedTransactionFactory来创建事务管理其TransactionManager
                           例如:当一个 JavaEE的应用程序部署在类似 JBoss, WebLogic,GlassFish 应用服务器上时,
                           它们会使用 EJB 进行应用服务器的事务管理能力。在这些管理环境中,你可以使用 MANAGED 事务管理器。
             -->
            <transactionManager type="JDBC" />
            <!-- 数据源dataSource
                type1:UNPOOLED:会为每一个数据库操作创建一个新的链接,并关闭它。适合于小数据小并发的情况
                type2:POOLED:会穿件一个数据库连接池,开发和测试阶段常用模式
                type3:JNDI:从在服务器上配置好的JNDI数据源dataSource获取数据库连接,在生产环境,优先考虑
             -->
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driverClassName}" />
                <property name="url" value="${jdbc.url}" />
                <property name="username" value="${jdbc.username}" />
                <property name="password" value="${jdbc.password}" />
            </dataSource>
        </environment>
        <environment id="production">
            <transactionManager type="MANAGED" />
            <dataSource type="JNDI">
                <property name="data_source" value="java:comp/jdbc/MyBatisDemoDS" />
            </dataSource>
        </environment>
    </environments>
    <!-- mapper文件映射 -->
    <mappers>
        <mapper resource="com/mybatis3/mappers/StudentMapper.xml" />
        <mapper url="file:///D:/mybatisdemo/mappers/TutorMapper.xml" />
        <mapper class="com.mybatis3.mappers.TutorMapper" />
    </mappers>
    <!--
        附:
        1、mybatis执行一条INSERT语句的过程
            1)创建一个有占位符的 PreparedStatement 接口,如下:
            Java Code
            PreparedStatement pstmt = connection.prepareStatement
            ("INSERT INTO STUDENTS(STUD_ID,NAME,EMAIL,DOB) VALUES(?,?,?,?)");
            2)检查 Student 对象的属性 studId 的类型,然后使用合适 setXXX 方法去设置参数值。这里 studId 是 integer
            类型,所以会使用 setInt()方法:
            Java Code
            pstmt.setInt(1,student.getStudId());
            3)类似地,对于 name 和 email 属性都是 String 类型,MyBatis 使用 setString()方法设置参数。
            Java Code
            pstmt.setString(2, student.getName());
            pstmt.setString(3, student.getEmail());
            4)至于 dob 属性, MyBatis 会使用 setDate() 方法设置 dob 处占位符位置的值。
            5)MyBaits 会将 java.util.Date 类型转换为 into java.sql.Timestamp 并设值:
            pstmt.setTimestamp(4, new Timestamp((student.getDob()).
            getTime()));
        2、自定义typeHandler
            假设表 STUDENTS 有一个 PHONE 字段,类型为 VARCHAR(15),而 JavaBean  Student 有一个 PhoneNumber 类定义类型的 phoneNumber 属性。
            Java Code  
            public class PhoneNumber{
                private String countryCode;
                private String stateCode;
                private String number;
                public PhoneNumber(){
                    //...
                }
            public PhoneNumber(String countryCode, String stateCode, String number){
                this.countryCode = countryCode;
                this.stateCode = stateCode;
                this.number = number;
            }
            public PhoneNumber(String string){
                if(string != null){
                    String[] parts = string.split("-");
                    if(parts.length > 0) this.countryCode = parts[0];
                    if(parts.length > 1) this.stateCode = parts[1];
                    if(parts.length > 2) this.number = parts[2];
                }
            }
            public String getAsString(){
                return countryCode + "-" + stateCode + "-" + number;
            }
                // Setters and getters
            }
            public class Student{
                private Integer id;
                private String name;
                private String email;
                private PhoneNumber phone;
                // Setters and getters
            }
            XML Code  
            <insert id="insertStudent" parameterType="Student">
                insert into students(name,email,phone)
                values(#{name},#{email},#{phone})
            </insert>
            这里,phone 参数需要传递给#{phone};而 phone 对象是 PhoneNumber 类型。然而,MyBatis 并不知道该怎样来处理这个类型的对象。
            为了让 MyBatis 明白怎样处理这个自定义的 Java 对象类型,如 PhoneNumber,我们可以创建一个自定义的类型处理器,如下所示:
            1)MyBatis 提供了抽象类 BaseTypeHandler<T> ,我们可以继承此类创建自定义类型处理器。
            Java Code
            packagecom.mybatis3.typehandlers;
            importjava.sql.CallableStatement;
            importjava.sql.PreparedStatement;
            importjava.sql.ResultSet;
            importjava.sql.SQLException;
            importorg.apache.ibatis.type.BaseTypeHandler;
            importorg.apache.ibatis.type.JdbcType;
            importcom.mybatis3.domain.PhoneNumber;
            public class PhoneTypeHandler extends BaseTypeHandler<PhoneNumber>{
                @Override
                public void setNonNullParameter(PreparedStatement ps, int i,
                PhoneNumber parameter, JdbcType jdbcType) throwsSQLException{
                    ps.setString(i, parameter.getAsString());
                }
                @Override
                public PhoneNumber getNullableResult(ResultSet rs, String columnName)throws SQLException{
                    return new PhoneNumber(rs.getString(columnName));
                }
                @Override
                public PhoneNumber getNullableResult(ResultSet rs, int columnIndex)throws SQLException{
                    return new PhoneNumber(rs.getString(columnIndex));
                }
                @Override
                public PhoneNumber getNullableResult(CallableStatement cs, int columnIndex)throws SQLException{
                    return new PhoneNumber(cs.getString(columnIndex));
                }
            }
            2)我们使用 ps.setString()和 rs.getString()方法是因为 phone 列是 VARCHAR 类型。
            3)一旦我们实现了自定义的类型处理器,我们需要在 mybatis-config.xml 中注册它:
            XML Code
            <?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="application.properties" />
                <typeHandlers>
                    <typeHandler handler="com.mybatis3.typehandlers. PhoneTypeHandler" />
                </typeHandlers>
            </configuration>
            注册 PhoneTypeHandler 后, MyBatis 就能够将 Phone 类型的对象值存储到 VARCHAR 类型的列上。
     -->
</configuration>



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-304223-1-1.html 上篇帖子: mybatis自动生成主键 下篇帖子: mybatis
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表