首页 > 代码库 > 笔记:MyBatis 使用 Java API配置
笔记:MyBatis 使用 Java API配置
我们已经讨论了各种MyBatis配置元素,如envronments、typeAlias和typeHandlers,以及如何使用XML配置它们。即使你想使用基于JavaAPI的MyBatis配置,MyBatis的SqlSessionFactory接口除了使用基于XML的配置创建外也可以通过Java API 编程式地被创建。每个在XML中配置的元素,都可以编程式的创建。使用Java API创建SqlSessionFactory,代码如下:
??
????public?static?SqlSessionFactory?getSqlSessionFactory()??
????{??
????????SqlSessionFactory?sqlSessionFactory?=?null;??
????????try??
????????{??
????????????DataSource?dataSource?=?DataSourceFactory.getDataSource();??
????????????TransactionFactory?transactionFactory?=?new??xJdbcTransactionFactory();??
????????????Environment?environment?=?new?Environment("development",??transactionFactory,?dataSource);??
????????????Configuration?configuration?=?new?Configuration(environment);??
????????????configuration.getTypeAliasRegistry().registerAlias("student",??Student.class);??
????????????configuration.getTypeHandlerRegistry().register(PhoneNumber.?class,?PhoneTypeHandler.class);??
????????????configuration.addMapper(StudentMapper.class);??
????????????sqlSessionFactory?=?new?SqlSessionFactoryBuilder().??build(configuration);??
????????}??
????????catch?(Exception?e)??
????????{??
????????????throw?new?RuntimeException(e);??
????????}??
?????????
- 环境配置 environment
我们需要为想使用MaBatis连接的每一个数据库创建一个 Enviroment对象。为了使用每一个环境,我们需要为每一个环境environment创建一个SqlSessionFactory对象。而创建Environment对象,我们需要java.sql.DataSource和TransactionFactory实例。下面让我们看看如何创建DataSource 和 TransactionFactory 对象。
- 数据源DataSource
MyBatis支持三种内建的DataSource类型: UNPOOLED, POOLED, 和JNDI.
- UNPOOLED类型的数据源dataSource为每一个用户请求创建一个数据库连接。在多用户并发应用中,不建议使用。
- POOLED类型的数据源dataSource创建了一个数据库连接池,对用户的每一个请求,会使用缓冲池中的一个可用的Connection对象,这样可以提高应用的性能。MyBatis提供了org.apache.ibatis.datasource.pooled.PooledDataSource 实现javax.sql.DataSource来创建连接池。
- JNDI类型的数据源dataSource使用了应用服务器的数据库连接池,并且使用JNDI查找来获取数据库连接。
让我们看一下怎样通过MyBatis的PooledDataSource获得DataSource对象,如下:
????????public?class?DataSourceFactory??
????????{??
????????????public?static?DataSource?getDataSource()??
????????????{??
????????????????String?driver?=?"com.mysql.jdbc.Driver";??
????????????????String?url?=?"jdbc:mysql://localhost:3306/mybatisdemo";??
????????????????String?username?=?"root";??
????????????????String?password?=?"admin";??
????????????????PooledDataSource?dataSource?=?new?PooledDataSource(driver,?url,??
????????????????????????username,?password);??
????????????????return?dataSource;??
????????????}??
一般在生产环境中,DataSource会被应用服务器配置,并通过JNDI获取DataSource对象,如下所示:
????????public?class?DataSourceFactory??
????????{??
????????????public?static?DataSource?getDataSource()??
????????????{??
????????????????String?jndiName?=?"java:comp/env/jdbc/MyBatisDemoDS";??
????????????????try??
????????????????{??
????????????????????InitialContext?ctx?=?new?InitialContext();??
????????????????????DataSource?dataSource?=?(DataSource)?ctx.lookup(jndiName);??
????????????????????return?dataSource;??
????????????????}??
????????????????catch?(NamingException?e)??
????????????????{??
????????????????????throw?new?RuntimeException(e);??
????????????????}??
????????????}
}
当前有一些流行的第三方类库,如commons-dbcp和c3p0实现了java.sql.DataSource,你可以使用它们来创建dataSource。
- 事务工厂TransactionFactory
MyBatis支持一下两种TransactionFactory实现:
- JdbcTransactionFactory
- ManagedTransactionFactory
如果你的应用程序运行在未托管(non-managed)的环境中,你应该使用JdbcTransactionFactory。
????????DataSource?dataSource?=?DataSourceFactory.getDataSource();??
????????TransactionFactory?txnFactory?=?new?JdbcTransactionFactory();??
????????Environment?environment?=?new?Environment("development",?txnFactory,?dataSource);??
如果你的应用程序运行在未托管(non-managed)的环境中,并且使用容器支持的事务管理服务,你应该使用ManagedTransactionFactory。
????????DataSource?dataSource?=?DataSourceFactory.getDataSource();??
????????TransactionFactory?txnFactory?=?new?ManagedTransactionFactory();??
Environment?environment?=?new?Environment("development",?txnFactory,?dataSource);?
- 类型别名typeAliases
MyBatis 提供以下几种通过Configuration对象注册类型别名的方法:
- 根据默认的别名规则,使用一个类的首字母小写、非完全限定的类名作为别名注册,可使用以下代码:
configuration.getTypeAliasRegistry().registerAlias(Student.class);??
- 指定指定别名注册,可使用以下代码:
configuration.getTypeAliasRegistry().registerAlias("Student",Student.class);??
- 通过类的完全限定名注册相应类别名,可使用一下代码:
configuration.getTypeAliasRegistry().registerAlias("Student",?"com.mybatis3.domain.Student");
- 为某一个包中的所有类注册别名,可使用以下代码:
configuration.getTypeAliasRegistry().registerAliases("com.?mybatis3.domain");?
- 为在com.mybatis3.domain package包中所有的继承自Identifiable类型的类注册别名,可使用以下代码:
configuration.getTypeAliasRegistry().registerAliases("com.?mybatis3.domain",?Identifiable.class);??
- 类型处理器typeHandlers
MyBatis提供了一系列使用Configuration对象注册类型处理器(type handler)的方法。我们可以通过以下方式注册自定义的类处理器:
- 为某个特定的类注册类处理器:
configuration.getTypeHandlerRegistry().register(PhoneNumber.class,?PhoneTypeHandler.class);
- 注册一个类处理器:
configuration.getTypeHandlerRegistry().register(PhoneTypeHandler.class);
- 注册com.mybatis3.typehandlers包中的所有类型处理器:
configuration.getTypeHandlerRegistry().register("com.mybatis3.typehandlers");
- 全局参数设置Settings
MyBatis提供了一组默认的,能够很好地适用大部分的应用的全局参数设置。然而,你可以稍微调整这些参数,让它更好地满足你应用的需要。你可以使用下列方法将全局参数设置成想要的值。
????????configuration.setCacheEnabled(true);??
????????configuration.setLazyLoadingEnabled(false);??
????????configuration.setMultipleResultSetsEnabled(true);??
????????configuration.setUseColumnLabel(true);??
????????configuration.setUseGeneratedKeys(false);??
????????configuration.setAutoMappingBehavior(AutoMappingBehavior.PARTIAL);??
????????configuration.setDefaultExecutorType(ExecutorType.SIMPLE);??
????????configuration.setDefaultStatementTimeout(25);??
????????configuration.setSafeRowBoundsEnabled(false);??
????????configuration.setMapUnderscoreToCamelCase(false);??
????????configuration.setLocalCacheScope(LocalCacheScope.SESSION);??
????????configuration.setAggressiveLazyLoading(true);??
????????configuration.setJdbcTypeForNull(JdbcType.OTHER);??
????????Set<String>?lazyLoadTriggerMethods?=?new?HashSet<String>();??
????????lazyLoadTriggerMethods.add("equals");??
????????lazyLoadTriggerMethods.add("clone");??
????????lazyLoadTriggerMethods.add("hashCode");??
????????lazyLoadTriggerMethods.add("toString");??
????????configuration.setLazyLoadTriggerMethods(lazyLoadTriggerMethods?);
- Mappers
MyBatis提供了一些使用Configuration对象注册Mapper XML文件和Mappe接口的方法。
- 添加一个Mapper接口,可使用以下代码:
configuration.addMapper(StudentMapper.class);??
- 添加 com.mybatis3.mappers包中的所有Mapper XML文件或者Mapper接口,可使用以下代码:
configuration.addMappers("com.mybatis3.mappers");??
- 添加所有com.mybatis3.mappers包中的拓展了特定Mapper接口的Maper接口,如 aseMapper,可使用如下代码:
configuration.addMappers("com.mybatis3.mappers",?BaseMapper.class);??
笔记:MyBatis 使用 Java API配置