MyBatisMyBatis之ObjectFactory

有关在MyBatis中的ObjectFactory有啥用,在法定文档中有这么的描述(半数以上网上的博客都是一贯引用这一讲述):MyBatis
每一遍成立结果对象的新实例时,它都会动用一个对象工厂(ObjectFactory)实例来形成。
默许的靶子工厂急需做的仅仅是实例化目标类,要么通过默许构造方法,要么在参数映射存在的时候经过参数构造方法来实例化。
假使想覆盖对象工厂的默许行为,则足以由此创立本人的对象工厂来促成。
对于像自个儿这种程度的来说,完全就是一脸蒙逼,那终究有吗用?可以说那一个目的工厂就是用来制造实体类的,MyBatis有一个DefaultObjectFactory默许对象工厂类,就像是上边所说的默认的目标工厂要求做的只是是实例化目的类,要么通过默许构造方法,要么在参数映射存在的时候经过参数构造方法来实例化。它不做此外任何的拍卖。如若大家想在创制实例化一个目的类的时候做点吗其余的动作,可以持续DefaultObjectFactory,覆写父类方法,并在mybatis-config.xml中注册配置这些目标工厂类。

温馨已毕一个对象工厂如下所示:

 1 package day_8_mybatis.util;
 2 
 3 import java.util.Collection;
 4 import java.util.Iterator;
 5 import java.util.Properties;
 6 
 7 import org.apache.ibatis.reflection.factory.DefaultObjectFactory;
 8 
 9 import day_8_mybatis.pojo.People;
10 
11 /**
12  * @author turbo
13  *
14  * 2016年10月24日
15  */
16 public class ExampleObjectFactory extends DefaultObjectFactory {
17 
18     @Override
19     public Object create(Class type) {
20         if (type.equals(People.class)){
21             People p = (People)super.create(type);
22             p.setAge(22);
23             p.setName("keven");
24             return p;
25         }
26         return super.create(type);
27     }
28 
29     @Override
30     public void setProperties(Properties properties) {
31         Iterator iterator = properties.keySet().iterator();
32         while (iterator.hasNext()){
33             String keyValue = String.valueOf(iterator.next());
34             System.out.println(properties.getProperty(keyValue));
35         }
36         super.setProperties(properties);
37     }
38 
39     @Override
40     public <T> boolean isCollection(Class<T> type) {
41         return Collection.class.isAssignableFrom(type);
42     }
43 
44 }

咱俩可以先看下第30行那么些setProperties方法,发现有一个Properties参数传递进来,这一个参数在何处传递的吧?就是在大家的mybatis-config.xml的第18行。

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE configuration  
 3   PUBLIC "-//mybatis.org//DTD Config 3.0//EN"  
 4   "http://mybatis.org/dtd/mybatis-3-config.dtd">
 5   
 6 <configuration>
 7 <!-- 注意configuration中各个属性配置的顺序应为:properties,settings,typeAliases,typeHandlers,objectFactory,objectWrapperFactory,reflectorFactory,plugins,environments,databaseIdProvider,mappers)-->
 8     <properties>
 9         <property name="driver" value="com.mysql.jdbc.Driver"/>
10         <property name="url" value="jdbc:mysql://localhost:3306/test"/>    
11         <property name="username" value="root"/>
12         <property name="password" value="0000"/>
13     </properties>
14     <typeHandlers>
15         <typeHandler handler="day_8_mybatis.util.ExampleTypeHandler" javaType="java.util.Date" jdbcType="VARCHAR"/>
16     </typeHandlers>
17     <objectFactory type="day_8_mybatis.util.ExampleObjectFactory">
18         <property name="someProperty" value="100"/>
19     </objectFactory>
20     <environments default="development">
21         <environment id="development">
22             <transactionManager type="JDBC" />
23             <dataSource type="POOLED">
24                 <property name="driver" value="${driver}"/>
25                 <property name="url" value="${url}"/>
26                 <property name="username" value="${username}"/>
27                 <property name="password" value="${password}"/>
28             </dataSource>            
29         </environment>
30     </environments> 
31     <mappers>
32         <mapper resource="day_8_mybatis/mapper/UserMapper.xml"/>
33         <mapper resource="day_8_mybatis/mapper/NoteMapper.xml"/>
34     </mappers>    
35     
36 </configuration>
37 
38  

拔取性忽略14-16行的typeHandlers配置,这是在上一节将typeHandlers用到的配置。

我们就兑现了这么个自定义对象工厂,在客户端代码中测试一下。

 1 package day_8_mybatis;
 2 
 3 import java.io.IOException;
 4 
 5 import org.apache.ibatis.session.SqlSession;
 6 
 7 import day_8_mybatis.util.SessionFactory;
 8 
 9 /**
10  * 客户端
11  * @author turbo
12  *
13  * 2016年9月11日
14  */
15 public class Main {
16 
17     /**
18      * @param args
19      * @throws IOException 
20      */
21     public static void main(String[] args) throws Exception {
22         String resource = "day_8_mybatis/mybatis-config.xml";        //获取mybatis配置文件路径
23         SqlSession sqlSession = SessionFactory.getSqlSession(resource);    //通过SessionFactory工具类(此工具类为自己构造即util包中的SessionFactory)构造SqlSession
24 
25     }
26 
27 }

MyBatis,会发觉控制台会有一个100的输出,那正是我们传递进入的参数。但就像疑问在大家好像并没有调用任何措施啊,其实不然,mybatis的布局文件就是mybatis先导化首先要做的。大家在第22、23行做的办事就是加载configuration配置文件先导化mybatis,用于大家配备了ObjectFactory中的property当然实际上也就调用了ExampleObjectFactory中的setProperties。很多过多框架做的首先件事就是加载配置文件,依据陈设初阶化各项目种种服务,当然那也得以用代码来贯彻,不过框架的补益就是它已经为大家做了一部分事务,使得大家只有要求通过有些配备就能兑现大家想要的结果。那么关于create方法吗?大家可以上边说了目的工厂就是用来成立实例的,我们可以传递一个class类型的类,就可以经过对象工厂的create方法得到这一个类的实例。

 1 package day_8_mybatis;
 2 
 3 import java.io.IOException;
 4 
 5 import org.apache.ibatis.session.SqlSession;
 6 
 7 import day_8_mybatis.pojo.People;
 8 import day_8_mybatis.util.ExampleObjectFactory;
 9 import day_8_mybatis.util.SessionFactory;
10 
11 /**
12  * 客户端
13  * @author turbo
14  *
15  * 2016年9月11日
16  */
17 public class Main {
18 
19     /**
20      * @param args
21      * @throws IOException 
22      */
23     public static void main(String[] args) throws Exception {
24         String resource = "day_8_mybatis/mybatis-config.xml";        //获取mybatis配置文件路径
25         SqlSession sqlSession = SessionFactory.getSqlSession(resource);    //通过SessionFactory工具类(此工具类为自己构造即util包中的SessionFactory)构造SqlSession
26         ExampleObjectFactory e = new ExampleObjectFactory();
27         People p = (People) e.create(People.class);
28         System.out.println(p.getName());
29     }
30 
31 }

终极记住上面提到的MyBatis开端化进程就是分析配置文件创造Configuration对象的历程。那也会为大家在摸底MyBatis之后学习其源码所要知道的某些。

 

网站地图xml地图