注:无论是映射器还是SqlSession都可以发送SQL到数据库执行。但是推荐使用映射器。
mybatis使用配置或者代码去生产SqlSessionFactory,Mybatis提供了构造器SqlSessionFactoryBuilder。它提供了一个类 org.apache.ibatis.session.Configuration 作为引导,采用的是Builder模式。具体的分布则是在Configuration类中完成的。
每个基于Mybatis的应用都是以一个SqlSessionFactory的实例为中心的,而SqlSessionFactory唯一的作用就是生产Mybatis的核心接口对象SqlSession,所以他的责任是唯一的。我们往往采用单例模式处理它。
mybatis xml配置
<?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"> <!--mybatis主配置文件--> <configuration> <!--取别名--> <typeAliases> <typeAlias type="cdu.lft.bean.User" alias="user"></typeAlias> </typeAliases> <!--配置环境--> <environments default="mysql"> <!--配置MySQL环境--> <environment id="development"> <transactionManager type="JDBC"> </transactionManager> <!--配置数据池--> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/> <property name="username" value="root"/> <property name="password" value="lft123456"/> </dataSource> </environment> </environments> <mappers> <mapper resource="cdu/lft/dao/user.xml"></mapper> </mappers> </configuration>首先读取mybatis.xml文件,通过SqlSessionFactoryBuilder的builder方法去创建SqlSessionFactory。
在Mybatis中,SqlSession是其核心接口。在Mybatis中有两个实现类,DefaultSqlSession和SqlSessionManager。DefaultSqlSession是单线程使用的,而SqlSessionManager在多线程环境下使用。SqlSession的作用类似于一个JDBC中的Connection对象,代表着一个连接资源的启用。
具体而言,它的三个作用:
获取Mapper接口发送SQL给数据库控制数据库事务使用SqlSessionFactorty创建SqlSession
SqlSession sqlSession=sqlSessionFactory.openSession();SqlSession只是一个门面接口,它还有很多方法,可以直接发送SQL。在Mybatis中真正干活的是Executor。
SqlSession事务控制伪代码
SqlSession sqlSession=null; try { //打开SqlSession会话 sqlSession=sqlSessionFactory.openSession(); //do something //do something //do something sqlSession.commit(); }catch (Exception ex){ sqlSession.rollback(); }finally { //在finally语句中确保资源被顺利关闭 if (sqlSession!=null){ sqlSession.close(); } }
映射器是Mybatis中最重要、最复杂的组件,它由一个接口和对应的xml文件(或注解)组成。它可以配置以下内容:
描述映射规则提供SQL语句,并可以配置SQL参数类型、返回类型、缓存刷新等信息配置缓存提供动态sql映射器的主要作用就是将SQL查询到的结果映射为一个POJO,或者将POJO的数据插入到数据库中,并定义一些关于缓存的重要信息。
注意,开发只是一个接口,而不是一个实现类,接口不能直接运行。Mybatis运用运用了动态代理技术使得接口能够运行起来。
用XML定义映射器分为两个部分:接口和XML。先定义一个映射器接口,如下代码:
public interface UserDao { User findById(int id); }在mybatis.xml文件中添加如下代码:
<mappers> <mapper resource="mapper/user.xml"></mapper> </mappers>它的作用是引入一个xml文件。
用xml创建映射器
<?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="cdu.lft.dao.UserDao" > <select id="findById" resultType="user" parameterType="int"> select * from user where id=#{id} </select> </mapper> <mapper>元素中的属性namespace所对应的是一个接口的权限定名,于是Mybatis上下文就可以通过它找到对应的接口。<select>元素表示这是一条查询语句,而属性id标识了这条SQL,属性paramenterType表示传入参数类型,属性resultType表示查询出的结果返回的类型。这条SQL中的#{id}表示传递进去的参数。注意:我们并没有配置SQL执行后和user的对应关系,其实这里采用的是一种被称为自动映射的功能,Mybatis在默认情况下提供自动映射,只要SQL返回的列名能与POJO对应起来即可。
此外,XML可以相
有了映射器就可以通过发送SQL了。我们以findById这条SQL为例
sqlSession=sqlSessionFactory.openSession(); User user=(User)sqlSession.selectOne("cdu.lft.dao.UserDao.findById",1);
SqlSession可以通过获去Mapper接口,通过Mapper接口发送SQL。
UserDao userDao=(UserDao) sqlSession.getMapper(UserDao.class); User user = userDao.findById(1);
SqlSessionFactoryBuilder的唯一作用是创建SqlSessionFactory,创建成功后,SqlSessionFactoryBuilder就失去了作用,所以它只能存在于创建SqlSessionFactory的方法中,不能使其长期存在。
SqlSessionFactory可以被认为是一个数据库连接池,它的作用是创建SqlSession接口对象。因为mybatis的本质就是对java数据库的操作,所以SqlSession的生命周期存在于整个Mybatis的应用中,所以一旦创建了SqlSessionFactory,就要长期保存它,所以可以认为SqlSessionFactory的生命周期就等同于Mybatis的应用周期。同时SqlSessionFactory是作为一个单例对象,让它在应用中被共享。
如果说SqlSessionFactory相当于数据库连接池,那么SqlSession就相当于一个数据库连接(connection对象),你可以在一个事务中执行多个SQL,然后通过它的commit、rollback等方法,提交或者回滚事务。所以它应该存活在一个业务请求中,处理完整个请求后,应该关闭这条连接,让它归还给SqlSessionFactory,否则数据库资源就很快被消耗完,系统就会瘫痪。
Mapper是一个接口,它由SqlSession所创建,所以它的最大生命周期最多和SqlSession保持一致,尽管它很好用,但是由于SqlSession的关闭,它的数据库连接资源也会消失,所以它的生命周期应该小于等于SqlSession的生命周期。Mapper代表的是一个请求中的业务处理,所以它应该在一个请求中,一旦处理完了相关的事务,它就应该废弃它。