<?xmlversion="1.0"encoding="utf-8"?><!DOCTYPEconfigurationPUBLIC"-//mybatis.org//DTDConfig3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration><!--属性配置元素可以将配置值具体化到一个属性文件中,并且使用配置文件的key作为占位符application.propertiesjdbc.driverClassName=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql://localhost:3306/mybatisdemojdbc.username=rootjdbc.password=admin在mybatis-config.xml中可以使用application.properties文件中定义的占位符当然也可以直接使用properties来设置值--><propertiesresource="application.properties"><propertyname="username"value="db_user"/><propertyname="password"value="verysecurepwd"/></properties><!--全局设置settings--><settings><settingname="cacheEnabled"value="true"/><settingname="lazyLoadingEnabled"value="true"/><settingname="multipleResultSetsEnabled"value="true"/><settingname="useColumnLabel"value="true"/><settingname="useGeneratedKeys"value="false"/><settingname="autoMappingBehavior"value="PARTIAL"/><settingname="defaultExecutorType"value="SIMPLE"/><settingname="defaultStatementTimeout"value="25000"/><settingname="safeRowBoundsEnabled"value="false"/><settingname="mapUnderscoreToCamelCase"value="false"/><settingname="localCacheScope"value="SESSION"/><settingname="jdbcTypeForNull"value="OTHER"/><settingname="lazyLoadTriggerMethods"value="equals,clone,hashCode,toString"/></settings><!--类型别名主要是为了简化在mapper文件中paramerType和resultType对应的类全限定名--><typeAliases><typeAliasalias="Tutor"type="com.mybatis3.domain.Tutor"/><!--可以提供需要取别名的类所在的包,mybatis会自动扫描包内的javaBean,然后分别为每个javaBean定义一个小写字母开头的例如这个包下有一个Student,那么别名为:student除此之外:@Alias("StudentAlias")publicclassStudent{...}@Alias注解将会覆盖配置文件中的<typeAliases>定义--><packagename="com.mybatis3.domain"/></typeAliases><!--类型句柄,类型处理器当mybatis执行一个INSERT操作的时候,汇创建一个PreparedStatement对象,并且执行一系列操作(操作下面详细说)这个过程中有一个setXXX()方式为占位符设置值的过程,xxx可以是Int,String,Date的任何一种类型,那么mybatis是依据什么来判断该使用setInt()还是setString()呢?其实MyBatis是通过使用类型处理器(typehandlers)来决定这么做的。MyBatis对于以下的类型使用内建的类型处理器:所有的基本数据类型、基本类型的包裹类型、byte[]、java.util.Date、java.sql.Date、java,sql.Time、java.sql.Timestamp、java枚举类型等。所以当MyBatis发现属性的类型属于上述类型,他会使用对应的类型处理器将值设置到PreparedStatement中,同样地,当从SQL结果集构建JavaBean时,也有类似的过程。--><typeHandlers><typeHandlerhandler="com.mybatis3.typehandlers.PhoneTypeHandler"/><packagename="com.mybatis3.typehandlers"/></typeHandlers><!--数据库连接环境配置--><environmentsdefault="development"><!--environment:mybatis可以有多个dataScource环境,如DEV(开发),TEST(测试),可以通过默认的设置environment值来设定想要的environmentid。如果一个应用需要连接多个数据库,需要将每一个数据库设置成一个单独的环境,并且为每一个数据库设置一个SqlSessionFactory--><environmentid="development"><!--事务管理器type1:JDBC:mybatis内部会使用JdbcTransactionFactory来创建TransectionManager。例如,部署到tomcat的应用程序,需要应用程序自己来管理程序type2:MANAGED(托管,应用本身不去管理实务,交给所在服务器来管理):mybatis内部使用ManagedTransactionFactory来创建事务管理其TransactionManager例如:当一个JavaEE的应用程序部署在类似JBoss,WebLogic,GlassFish应用服务器上时,它们会使用EJB进行应用服务器的事务管理能力。在这些管理环境中,你可以使用MANAGED事务管理器。--><transactionManagertype="JDBC"/><!--数据源dataSourcetype1:UNPOOLED:会为每一个数据库操作创建一个新的链接,并关闭它。适合于小数据小并发的情况type2:POOLED:会穿件一个数据库连接池,开发和测试阶段常用模式type3:JNDI:从在服务器上配置好的JNDI数据源dataSource获取数据库连接,在生产环境,优先考虑--><dataSourcetype="POOLED"><propertyname="driver"value="${jdbc.driverClassName}"/><propertyname="url"value="${jdbc.url}"/><propertyname="username"value="${jdbc.username}"/><propertyname="password"value="${jdbc.password}"/></dataSource></environment><environmentid="production"><transactionManagertype="MANAGED"/><dataSourcetype="JNDI"><propertyname="data_source"value="java:comp/jdbc/MyBatisDemoDS"/></dataSource></environment></environments><!--mapper文件映射--><mappers><mapperresource="com/mybatis3/mappers/StudentMapper.xml"/><mapperurl="file:///D:/mybatisdemo/mappers/TutorMapper.xml"/><mapperclass="com.mybatis3.mappers.TutorMapper"/></mappers><!--附:1、mybatis执行一条INSERT语句的过程1)创建一个有占位符的PreparedStatement接口,如下:JavaCodePreparedStatementpstmt=connection.prepareStatement("INSERTINTOSTUDENTS(STUD_ID,NAME,EMAIL,DOB)VALUES(?,?,?,?)");2)检查Student对象的属性studId的类型,然后使用合适setXXX方法去设置参数值。这里studId是integer类型,所以会使用setInt()方法:JavaCodepstmt.setInt(1,student.getStudId());3)类似地,对于name和email属性都是String类型,MyBatis使用setString()方法设置参数。JavaCodepstmt.setString(2,student.getName());pstmt.setString(3,student.getEmail());4)至于dob属性,MyBatis会使用setDate()方法设置dob处占位符位置的值。5)MyBaits会将java.util.Date类型转换为intojava.sql.Timestamp并设值:pstmt.setTimestamp(4,newTimestamp((student.getDob()).getTime()));2、自定义typeHandler假设表STUDENTS有一个PHONE字段,类型为VARCHAR(15),而JavaBeanStudent有一个PhoneNumber类定义类型的phoneNumber属性。JavaCodepublicclassPhoneNumber{privateStringcountryCode;privateStringstateCode;privateStringnumber;publicPhoneNumber(){//...}publicPhoneNumber(StringcountryCode,StringstateCode,Stringnumber){this.countryCode=countryCode;this.stateCode=stateCode;this.number=number;}publicPhoneNumber(Stringstring){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];}}publicStringgetAsString(){returncountryCode+"-"+stateCode+"-"+number;}//Settersandgetters}publicclassStudent{privateIntegerid;privateStringname;privateStringemail;privatePhoneNumberphone;//Settersandgetters}XMLCode<insertid="insertStudent"parameterType="Student">insertintostudents(name,email,phone)values(#{name},#{email},#{phone})</insert>这里,phone参数需要传递给#{phone};而phone对象是PhoneNumber类型。然而,MyBatis并不知道该怎样来处理这个类型的对象。为了让MyBatis明白怎样处理这个自定义的Java对象类型,如PhoneNumber,我们可以创建一个自定义的类型处理器,如下所示:1)MyBatis提供了抽象类BaseTypeHandler<T>,我们可以继承此类创建自定义类型处理器。JavaCodepackagecom.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;publicclassPhoneTypeHandlerextendsBaseTypeHandler<PhoneNumber>{@OverridepublicvoidsetNonNullParameter(PreparedStatementps,inti,PhoneNumberparameter,JdbcTypejdbcType)throwsSQLException{ps.setString(i,parameter.getAsString());}@OverridepublicPhoneNumbergetNullableResult(ResultSetrs,StringcolumnName)throwsSQLException{returnnewPhoneNumber(rs.getString(columnName));}@OverridepublicPhoneNumbergetNullableResult(ResultSetrs,intcolumnIndex)throwsSQLException{returnnewPhoneNumber(rs.getString(columnIndex));}@OverridepublicPhoneNumbergetNullableResult(CallableStatementcs,intcolumnIndex)throwsSQLException{returnnewPhoneNumber(cs.getString(columnIndex));}}2)我们使用ps.setString()和rs.getString()方法是因为phone列是VARCHAR类型。3)一旦我们实现了自定义的类型处理器,我们需要在mybatis-config.xml中注册它:XMLCode<?xmlversion="1.0"encoding="utf-8"?><!DOCTYPEconfigurationPUBLIC"-//mybatis.org//DTDConfig3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration><propertiesresource="application.properties"/><typeHandlers><typeHandlerhandler="com.mybatis3.typehandlers.PhoneTypeHandler"/></typeHandlers></configuration>注册PhoneTypeHandler后,MyBatis就能够将Phone类型的对象值存储到VARCHAR类型的列上。--></configuration>

本文参考:Java Persistence with MyBatis 3(中文版)