在前面的章节中,我们已经探讨了多样的MyBatis配置的参数,像environments,typeAliases,和typeHandler,和如何去运用XML的文件 来配置它们。尽管你想运用基于JavaAPI来配置MyBatis,最好就是你已经理解了前面笔者介绍过的关于MyBatis的配置文件各个参数的意思。在这一节中,我们将会涉及到类的注解使用前面的配置。
MyBatis的SqlSessionFactory的接口可以基于java API的方式来创建。在前面的章节中,我们使用过年的基于XML的配置文件的参数,都可以转换为注解的方法,或编程的方式。
我们可以使用以下的java API来创建SqlSessionFactory.
public static SqlSessionFactory getSqlSessionFactory() { SqlSessionFactory sqlSessionFactory = null; try{ DataSource dataSource = DataSourceFactory.getDataSource(); TransactionFactory transactionFactory = new JdbcTransactionFactory(); 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); } return sqlSessionFactory; }
我们运用MyBatis的连接数据库时,我们需要为每个数据库创建Environment对象。为了作用在多套的数据库上,我们需要创建一个SqlSessionFactory对象给每个environment.为了创建 Enviroment的参数,我们需要javax.sql.DataSource和TransactionFactory这两个类的实例。让我们来看一下如何去创建DataSource和TransactionFactory的对象。
MyBatis提供了DataSource类型有:UNPOOLED,POOLED,JBDI。
1) UNPOOLED的dataSource创建一个新的数据库连接,在每次使用时,都会重新连接。
2) POOLEDdataSource创建一个连接池。只要连接一次,其它时候使用时,将会用连接池中的数据。MyBatis提供org.apache.ibatis.datasource.PooledDataSorce,这个继承了javax.sql.DataSource去创建连接池。
3) 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); } } }
MyBatis提供了下面的两种接口来实现TransactionFactory:
1) JdbcTransactionFactory
2) ManageTransactionFactory
如果应用程序应用在没的事务管理的环境中,那么我们将使用JdbcTransactionFactory.
DataSource dataSource = DataSourceFactory.getDataSource(); TransactionFactory txnFactory = new JdbcTransactionFactory(); Environment environment = new Environment("development", txnFactory, dataSource);
如果应用的程序是应用在有事务管理的环境中,应用容器提供的事务管事服务,你需要使用ManagedTransactionFactory。
DataSource dataSource = DataSourceFactory.getDataSource(); TransactionFactory txnFactory = new ManagedTransactionFactory(); Environment environment = new Environment("development", txnFactory, dataSource);
MyBatis提供了多种的方式来注册类型的别名,使用Configuration对象:
1) 使用一个单独的小写字母开头的来注册别名,不合格的类将使用默认的别名规则,使用代码如下:
configuration.getTypeAliasRegistry().registerAlias(Student.class);
2) 给出单独类的别名来注册,使用代码如下:
configuration.getTypeAliasRegistry().registerAlias("Student", Student.class);
3) 使用完整的限定名来注册类的别名,使用代码如下:
configuration.getTypeAliasRegistry().registerAlias("Student", "com.owen.mybatis.domain.Student");
4) 直接使用com.owen.mybatis.domain的包名来注册别名。使用代码如下:
configuration.getTypeAliasRegistry().registerAliases("com. mybatis3.domain");
5) 使用包名并且继承Identifiable的类型来注册。使用代码如下:
configuration.getTypeAliasRegistry().registerAliases("com. mybatis3.domain", Identifiable.class);
MyBatis使用Configuration对象来实现多种方式注册typeHandlers.
1) 特殊的Java类注册到typeHandlers。
configuration.getTypeHandlerRegistry().register(PhoneNumber. class,PhoneTypeHandler.class);
2) 注册一个typeHandler:
configuration.getTypeHandlerRegistry().register(PhoneTypeHandler. class);
3) 注册所有的typeHandler,使用包名来注册。
configuration.getTypeHandlerRegistry().register("com.owen.mybatis. typehandlers");
你可以使用下面的代码来设置Settings:
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 );
MyBatis提供了多种方式来注册MapperXML的文件和使用Mapper的接口Configuration对象。
1) 添加单一的映射接口:
configuration.addMapper(StudentMapper.class);
2) 添加所有的映射的XML文件或接口的包名,使用下面的代码:
configuration.addMapper(StudentMapper.class);
3) 使用所有的映射接口和扩展接口,我们使用BaseMapper的类。
configuration.addMappers("com.owen.mybatis.mappers", BaseMapper. class);