[java] view plain copy
<span style="font-size:14px;"> My Batis 支持SQL查询,是一些高级映射在持久层的完美展示。他更多的使用简单的XML或注解用于配置和原始映射,<span style="color: rgb(54, 54, 54); font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; line-height: 24px; ">摒除了大量的JDBC代码、手工设置参数和结果集封装,提高了开发效率。</span></span>
MyBatis的XML設定檔包含了影響MyBatis行為甚深的設定和屬性資訊。 XML文件的高層級結構如下:
configuration配置
environment環境變數
transactionManager事務管理器
dataSource資料來源
properties屬性
settings設定
typeAliases類型命名
typeHandlers類型處理器
objectFactory物件工廠
# plugins外掛程式
objectFactory物件工廠
# plugins插件
# environments環境
映射器
這些是外部化的,可替代的屬性,這些屬性也可以配置在典型的Java屬性設定檔中,或透過properties元素的子元素來傳遞。
例如:
[html] view plain copy <properties resource="jdbc_mysql.properties" /> [html] view plain copy <dataSource type="POOLED"> [html] view plain copy <property name="driver" value="${driver}"/> [html] view plain copy <property name="url" value="${url}"/> [html] view plain copy <property name="username" value="${username}"/> [html] view plain copy <property name="password" value="${password}"/> [html] view plain copy </dataSource>此範例中設定的username和password而言會由properties元素中設定的值一起取代新範例中的username和password。 driver和url屬性將會從包含進來的jdbc_mysql.properties檔案中的值來取代。 Settings
這些是極為重要的調整,它們會修改MyBatis在運作時的行為。下面這個表格描述了設定訊息,它們的意義和預設值。
設定參數
cacheEnabled 這個配置讓全域的對應器啟用或停用為快取。
lazyLoadingEnabled 全域啟用或停用延遲載入。當停用時,所有關聯物件都會即時載入。
aggressiveLazyLoading 啟用時,有延遲載入屬性的物件會在被呼叫時完全載入任意屬性。否則,每種屬性將會依需要載入。
multipleResultSetsEnabled 允許或不允許多種結果集從一個單獨的語句中傳回(需要適合的驅動)。
useColumnLabel 使用列標籤取代列名。不同的驅動在這方便表現不同。參考驅動文件或充分測試兩種方法來決定所使用的驅動。
useGeneratedKeys 允許JDBC支援產生的鍵。需要適合的驅動。如果設定為true則這個設定強制產生的鍵被使用,儘管有些驅動拒絕相容但仍然有效(例如Derby)。
autoMappingBehavior 指定MyBatis如何自動對應列到欄位/屬性。 PARTIAL只會自動映射簡單,沒有巢狀的結果。 FULL會自動對應任意複雜的結果(嵌套的或其他情況)。
defaultExecutorType 配置預設的執行器。 SIMPLE執行器沒有什麼特別之處。 REUSE執行器重複使用預處理語句。 BATCH執行器重複使用語句和批次更新
defaultStatementTimeout 設定逾時時間,它決定驅動等待一個資料庫回應的時間。
<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="enhancementEnabled" value="false"/> <setting name="defaultExecutorType" value="SIMPLE"/> <setting name="defaultStatementTimeout" value="25000"/> </settings>typeAliases
類型別名是為Java類型命名一個短的名字。它只和XML配置有關,只用來減少類別完全限定名的多餘部分。例如:
[html] view plain copy <typeAliases> [html] view plain copy <typeAlias alias="Author" type="domain.blog.Author"/> [html] view plain copy <typeAlias alias="Blog" type="domain.blog.Blog"/> [html] view plain copy <typeAlias alias="Comment" type="domain.blog.Comment"/> [html] view plain copy <typeAlias alias="Post" type="domain.blog.Post"/> [html] view plain copy <typeAlias alias="Section" type="domain.blog.Section"/> [html] view plain copy <typeAlias alias="Tag" type="domain.blog.Tag"/> [html] view plain copy </typeAliases>使用這個配置,「Blog」可以任意用來取代「domain.blog.Blog」所使用的地方。 typeHandlers
無論是MyBatis在預處理語句中設定一個參數,或是從結果集中取出一個值時,類型處理器被用來將取得的值以適當的方式轉換成Java類型。下面這個列表描述了預設的類型處理器。 依序為 型別處理器Java型別JDBC型別
BooleanTypeHandler Boolean,boolean 任何相容的布林值
## ByteTypeHandler 任何相容的數位或位元組類型ShortTypeHandler Short ,short 任何相容的數位或短整數IntegerTypeHandler Integer,int ,long 任何相容的數位或長整數型###FloatTypeHandler Float,float 任何兼容的数字或单精度浮点型
DoubleTypeHandler Double,double 任何兼容的数字或双精度浮点型
BigDecimalTypeHandler BigDecimal 任何兼容的数字或十进制小数类型
StringTypeHandler String CHAR和VARCHAR类型
ClobTypeHandler String CLOB和LONGVARCHAR类型
NStringTypeHandler String NVARCHAR和NCHAR类型
NClobTypeHandler String NCLOB类型
ByteArrayTypeHandler byte[] 任何兼容的字节流类型
BlobTypeHandler byte[] BLOB和LONGVARBINARY类型
DateTypeHandler Date(java.util) TIMESTAMP类型
DateOnlyTypeHandler Date(java.util) DATE类型
TimeOnlyTypeHandler Date(java.util) TIME类型
SqlTimestampTypeHandler Timestamp(java.sql) TIMESTAMP类型
SqlDateTypeHandler Date(java.sql) DATE类型
SqlTimeTypeHandler Time(java.sql) TIME类型
ObjectTypeHandler Any 其他或未指定类型
EnumTypeHandler Enumeration类型 VARCHAR-任何兼容的字符串类型,作为代码存储(而不是索引)。
objectFactory
MyBatis每次创建结果对象新的实例时,它使用一个ObjectFactory实例来完成。如果参数映射存在,默认的ObjectFactory不比使用默认构造方法或带参数的构造方法实例化目标类做的工作多。
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的发行包中有。你应该理解你覆盖方法的行为,假设你所做的要比监视调用要多。如果你尝试修改或覆盖一个给定的方法,你可能会打破MyBatis的核心。这是低层次的类和方法,要谨慎使用插件。
使用插件是它们提供的非常简单的力量。简单实现拦截器接口,要确定你想拦截的指定签名。
java代码:
[javascript] view plain copy @Intercepts({@Signature(type= Executor.class,method = "update", [javascript] view plain copy args = {MappedStatement.class,Object.class})}) [javascript] view plain copy public class ExamplePlugin implements Interceptor { [javascript] view plain copy public Object intercept(Invocation invocation) throws Throwable [javascript] view plain copy { [javascript] view plain copy return invocation.proceed(); [javascript] view plain copy } [javascript] view plain copy public Object plugin(Object target) { [javascript] view plain copy return Plugin.wrap(target, this); [javascript] view plain copy } [javascript] view plain copy public void setProperties(Properties properties) { [javascript] view plain copy } [html] view plain copy MapperConfig.xml [html] view plain copy <plugins> [html] view plain copy <plugin interceptor="org.mybatis.example.ExamplePlugin"> [html] view plain copy <property name="someProperty" value="100"/> [html] view plain copy </plugin> [html] view plain copy </plugins> [html] view plain copy
上面的插件将会拦截在Executor实例中所有的“update”方法调用,它也是负责低层次映射语句执行的内部对象。
environments
[html] view plain copy <environments default="development"> <environment id="development"> <transactionManager type="JDBC" /> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}" /> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.user}" /> <property name="password" value="${jdbc.password}" /> <property name="poolPingEnabled" value="true"/> <property name="poolPingQuery" value="SELECT * FROM app_setup_setting WHERE name='allow_setup_unknown_app'" /> <property name="poolPingConnectionsNotUsedFor" value="7200000"/> </dataSource> </environment> </environments> dataSsource
dataSource元素使用基本的JDBC数据源接口来配置JDBC连接对象的资源。见上
transactionManager
在MyBatis中有两种事务管理器类型(也就是type=”[JDBC|MANAGED]”):
1.JDBC – 这个配置直接简单使用了JDBC的提交和回滚设置。它依赖于从数据源得到的连接来管理事务范围。
2.MANAGED – 这个配置几乎没做什么。它从来不提交或回滚一个连接。而它会让容器来管理事务的整个生命周期(比如Spring或JEE应用服务器的上下文)。默认情况下它会关闭连接。然而一些容器并不希望这样,因此如果你需要从连接中停止它,将closeConnection属性设置为false。例如:
[html] view plain copy <transactionManager type="MANAGED"> <property name="closeConnection" value="false"/> </transactionManager>
这两种事务管理器都不需要任何属性。然而它们都是类型别名,要替换使用它们,你需要放置将你自己的类的完全限定名或类型别名,它们引用了你对TransacFactory接口的实现类。
public interface TransactionFactory {
void setProperties(Properties props);
Transaction newTransaction(Connection conn, boolean autoCommit);
}
任何在XML中配置的属性在实例化之后将会被传递给setProperties()方法。你的实现类需要创建一个事务接口的实现,这个接口也很简单:
[html] view plain copy public interface Transaction { Connection getConnection(); void commit() throws SQLException; void rollback() throws SQLException; void close() throws SQLException; }
使用这两个接口,你可以完全自定义MyBatis对事务的处理。
mappers
既然MyBatis的行为已经由上述元素配置完了,我们现在就要定义SQL映射语句了。但是,首先我们需要告诉MyBatis到哪里去找到这些语句。Java在这方面没有提供一个很好的方法,所以最佳的方式是告诉MyBatis到哪里去找映射文件。你可以使用相对于类路径的资源引用,或者字符表示,或url引用的完全限定名(包括file:///URLs)。例如:
[html] view plain copy // Using classpath relative resources(首选) <mappers> <mapper resource="org/mybatis/builder/AuthorMapper.xml"/> <mapper resource="org/mybatis/builder/BlogMapper.xml"/> <mapper resource="org/mybatis/builder/PostMapper.xml"/> </mappers> // Using url fully qualified paths <mappers> <mapper url="file:///var/sqlmaps/AuthorMapper.xml"/> <mapper url="file:///var/sqlmaps/BlogMapper.xml"/> <mapper url="file:///var/sqlmaps/PostMapper.xml"/> </mappers>
以上是My Batis 的XML 映射設定檔的實例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!