前一篇我们学会了使用配置缓存,使用缓存,这篇我们来看看mybatis 的主配置文件,即mybatis 中的事务和数据源的配置。
mybatis 是一个orm框架,他的使用让我们省去了一些和业务无关的代码,能提高我们的开发速度,尤其是在业务不是很多但是 链接数据库,从中查询的比较多的话你会发现很多时候你在做获取数据源链接即Connection 以及ResultSet 结果集的获取并将结果集组装成对象、释放资源 以及异常的处理等这些 工作,并且占有很大的工作量。 但当你使用mybatis的时候你会发现工作量会很小一个配置文件,一个映射文件 一个SqlSessionFactory 类就OK了其他的你什么都不用管。
上面扯了很多下面我们进入正题,那就是mybatis的配置文件,废话不说先来看看一个完整的小demo:
1、数据源配置文件
driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/user name=root password=admin driver.encode=utf-8 poolMaximumActiveConnections=15 poolMaximumIdleConnections=10 poolMaximumCheckoutTime=20000 tdriver=com.mysql.jdbc.Driver turl=jdbc:mysql://localhost:3306/user2 tname=root tpassword=admin tdriver.encode=utf-8 tpoolMaximumActiveConnections=15 tpoolMaximumIdleConnections=10 tpoolMaximumCheckoutTime=20000
<?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="db.properties"> </properties> <!-- 配置数据源相关属性和事务 --> <environments default="development"> <!-- 环境配置开始,可以配置多个环境 而使用哪一个可以在创建session时指定,默认使用default中的值 --> <environment id="development"> <!--事务配置,使用jdbc类型的事务 --> <transactionManager type="JDBC"/> <!--数据源的配置,使用库链接池类型 --> <dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${name}"/> <property name="password" value="${password}"/> <property name="poolMaximumActiveConnections" value="${poolMaximumActiveConnections}"/> <property name="poolMaximumCheckoutTime" value="${poolMaximumCheckoutTime}"/> <property name="poolMaximumIdleConnections" value="${poolMaximumIdleConnections}"/> <property name="driver.encode" value="${driver.encode}"/> </dataSource> </environment> <environment id="work"> <!--事务配置,使用jdbc类型的事务 --> <transactionManager type="JDBC"/> <!--数据源的配置,使用链接池方式 --> <dataSource type="POOLED"> <property name="driver" value="${tdriver}"/> <property name="url" value="${turl}"/> <property name="username" value="${tname}"/> <property name="password" value="${tpassword}"/> <property name="poolMaximumActiveConnections" value="${tpoolMaximumActiveConnections}"/> <property name="poolMaximumCheckoutTime" value="${tpoolMaximumCheckoutTime}"/> <property name="poolMaximumIdleConnections" value="${tpoolMaximumIdleConnections}"/> <property name="driver.encode" value="${tdriver.encode}"/> </dataSource> </environment> </environments> <mappers> <!-- 映射路径 --> <mapper resource="com/mybatis1/UserMap.xml"/> <mapper resource="com/mybatis2/UserMap.xml"/> </mappers> </configuration>
package com.mybatis2; import java.io.IOException; import java.io.InputStream; import java.util.Properties; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; /** * @author WHD data 2016年3月8日 */ public class Test1 { public static void main(String[] args) { // 配置文件 String path = "config.xml"; InputStream input = Test.class.getClassLoader().getResourceAsStream( path); SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); SqlSessionFactory factory = builder.build(input); SqlSession session = factory.openSession(); try { User user = session.selectOne("com.mybatis2.userMap.userInfo", "whd"); System.out.println(user.toString()); } finally { // 关闭session 释放资源 session.close(); } } }
package com.mybatis2; import java.io.Serializable; /** * @author WHD data 2016年2月28日 */ public class User implements Serializable { private static final long serialVersionUID = 3574211222602302068L; private String name; private String password; public User() { } public User(String name, String password) { this.name = name; this.password = password; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Override public String toString() { return "[name=" + name + ", password=" + password + "]"; } }
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.mybatis2.userMap"> <resultMap id="result" type="com.mybatis2.User"> <result property="name" column="name" /> <result property="password" column="password" /> </resultMap> <select id="userInfo" parameterType="java.lang.String" resultMap="result"> select * from usert where name =#{name} </select> <insert id="insertInfo" parameterType="com.mybatis2.User"> insert into usert(name,password) values(#{name},#{password}); </insert> </mapper>
二、SqlSessionFactory 的创建:
package com.mybatis2; import java.io.IOException; import java.io.InputStream; import java.util.Properties; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import com.mybatis2.User; /** * @author WHD data 2016年2月28日 */ public class Test { public static void main(String[] args) { // 配置文件 String path = "config.xml"; InputStream input = Test.class.getClassLoader().getResourceAsStream( path); SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); String environment = "work"; // 这里的environment指定了数据源的id也就是指定了数据源,如果没有则使用mybatis配置文件中的默认值。 // mybatis中的配置文件的datasource引用了db.properties 中的数据的配置 SqlSessionFactory factory = builder.build(input, environment); SqlSession session = factory.openSession(); try { User user = session.selectOne("com.mybatis2.userMap.userInfo", "whd"); session.clearCache(); System.out.println(user.toString()); } finally { // 关闭session 释放资源 session.close(); } } }
在创建SqlSessionFactory 是必传的参数输入流InputStream 或者Reader 就是获取配置文件并解析xml 格式从中获取这个environment中配置的事务以及数据源的信息,组装成一个configuration 对象。如果只传了InputStream或Reader的话environment 就使用默认的值而如果向上面的这个demo一样传递了environment 的id则在解析组装生成configuration 对象时使用的不是默认的而是你指定的这个id的environment,这样就改变了我们的数据源是不是也很方便啊!哈哈
现在明白了使用两个数据源配置以及两个environment 的原因了吧,这样还有一个好处就是在使用时修改测试库和正式库也挺方便的,数起正式库和测试库的修改是不是觉得直接修改db.properties 或者mybatis 的配置文件更方便,因为这样只需要修改配置文件不用修改代码,但是上面传参的方式有比没有好不是!
总结:
1、mybatis 的配置文件很灵活你可以直接在mybatis 中也数据源事务的属性也可以通过properties 文件来引入,这样写是不是觉得很整洁干净。
2、在创建SqlSessionFactory 时我们可以使用默认的值,如果有需要我们可以在这里改变数据源默认的配置是不是也很方便。
3、其实mybatis的配置文件就是设置了数据源 数据源的一些属性、事务以及事务的级别等这些东西而SqlSessionFactory 解析了这个配置文件获取了数据源以及事务的相关信息。
4、SqlSessionFactory 对象的openSession() 方法创建SqlSession时我们可以个这个会话设置事务的级别、是否自动提交以及sql执行的方式(批量执行还是简单的一个一个执行)等这些属性。
5、当调用sqlSession对象的selectOne() 或selectList() 等方法时会按照之前设置的属性获取数据库的链接去执行指定sql。获取查询结果并解析映射。
总结中很多东西我们还没学到,但这些在后面的文章都会看到详细的解释。