您好,登錄后才能下訂單哦!
<?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>
本文參考:Java Persistence with MyBatis 3(中文版)
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。