首先来分析一下JDBC一个SQL操作的主要的步骤:
第一步:连接数据库,获取连接
第二部:使用连接,封装SQL语句,进行操作
第三部:处理查询结果
第四部:关闭连接
MyBatis对上面的步骤进行了封装,封装的方式如下:
对待第一个步骤的封装
使用的封装方式主要是使用一个XML文件进行封装,XML文件的格式如下:
<? xml version="1.0" encoding="UTF-8" ?>
<! DOCTYPE sqlMapConfig
PUBLIC "-//iBATIS.com//DTD SQL Map Config 3.0/
"[url]http://www.ibatis.com/dtd/[/url]sql-map-config-3.dtd" >
<sqlMapConfig>
<settings
cacheModelsEnabled ="true"
enhancementEnabled ="true"
lazyLoadingEnabled ="true"
errorTracingEnabled ="true"
maxRequests ="32"
maxSessions ="10"
maxTransactions ="5"
useStatementNamespaces ="false"
/>
<!-- settings 设置控制是否开启下列的机制:
缓存,字节码增强,延迟启动,错误处理机制;
最大并发请求数,最大session数
最大并发事务数,是否启用命名空间
-->
<transactionManager type ="JDBC">
<!--
ibatis定义了数据库事务管理三种类型:JDBC,JTA,EXTERNAL
-->
<dataSource type ="SIMPLE">
<!--
type指定了数据源连接类型,类型有三种:SIMPLE,DBCP,JNDI
-->
<property name ="JDBC.Driver" value ="com.p6spy.engine.spy.P6SpyDriver" />
<property name ="JDBC.ConnectionURL" value ="jdbc:mysql://localhost/sample" />
<property name ="JDBC.Username" value ="user" />
<property name ="JDBC.Password" value ="mypass" />
<!-- 配置数据库的基本信息,在jdbc情况下连接数据信息 -->
<property name ="Pool.MaximumActiveConnections" value ="10" />
<!-- 数据库连接池的最大连接数目 -->
<property name ="Pool.MaximumIdleConnections" value ="5" />
<!-- 数据库连接池挂起的最大连接数目 -->
<property name ="Pool.MaximumCheckoutTime" value ="120000" />
<!-- 连接一个任务所允许占用的虽大时间 -->
<property name ="Pool.TimeToWait" value ="500" />
<!-- 线程允许等待连接的最大时间 -->
<property name ="Pool.PingQuery" value ="select 1 from ACCOUNT" />
<property name ="Pool.PingEnabled" value ="false" />
<property name ="Pool.PingConnectionsOlderThan" value ="1" />
<property name ="Pool.PingConnectionsNotUsedFor" value ="1" />
</dataSource >
</transactionManager >
<sqlMap resource ="com/ibatis/sample/User.xml" />
<!-- sqlMap 保存了SQL操作的语句文件,详细介绍请观察这个文件。 -->
</sqlMapConfig >
这个文件就是保存基础数据库连接和事务管理的配置文件了。
但是到这里为止,这个仅仅只是一个一些配置信息,怎么去根据这些信息生成在java代码体系中的对象呢?
下面是调用代码部分:
String resource="mybatis_config.xml";
Reader reader=Resource.getResourceAsReader(resource);
SqlSessionFactory sqlMapper=new SqlSessionFactoryBuilder().build(reader);
同时还可以使用纯java代码来实现上面的配置和使用功能,代码如下所示:
DataSource dataSource = new PooledDataSource("com.mysql.jdbc.Driver",
"jdbc:mysql://localhost/mybatis?userUnicode=true&characterEncoding=utf8", "admin", "123456");
Environment environment = new Environment("test", new JdbcTransactionFactory(), dataSource);
Configuration configuration = new Configuration(environment);
configuration.addMapper(TestDao.class);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
对于第二个步骤的封装操作:
首先是定义一个对一张表操作的接口,该接口中包含有对表操作的所有方法,例如:
public interface PersonMapper
{
Person getPersonById(int id);
}
然后让这个接口与表建立一个映射关系,使得java程序与数据库建立直接的联系,映射的关系表如下:
这个映射表的名称与存放位置是根据基本配置表当中sqlMap的resource建立的。映射表的内容如下所示:
<?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="{interface name}">
<select id="{method name}" parameterType="int" resultType="{return value type}">
select * from person where personId=#{id}
</select>
<insert id="{method name}" parameterType="{Object}">
insert into person (personId,name,age) values (#{personId},#{name},#{age})
</insert>
</mapper>
映射表当中保存的是接口与表SQL的关联,namespace表示对应的接口名称,包含package name在内的接口名称。
下面的操作<select>和<insert>表示对表操作的类型,id表示接口中对应的方法名称,parameterType表示这个方法中参数的类型,resultType表示接口中方法的返回值类型。SQL语句当中,引用java程序中的实际参数时,使用#{parameter}的方式进行写入。建立一个合适的POJO对象,对应表格当中的一行数据。
当前的这一个步骤直接封装完成了JDBC操作的第二个第三个步骤
第四个步骤的操作
很简单,就是在操作完成之后关闭session就可以了。
下面是对mybatis使用是的基本步骤:首先,完成上面的这些操作,
然后获取第一步骤的sqlMapper,建立session对象
SqlSession session=sqlMapper.openSession();
然后获取数据方式有下面的两种形式:
Person person = (Person) session.selectOne(
"com.xiamen.mapper.PersonMapper.getPersonById", 1);
或者:
PersonMapper mapper = session.getMapper(PersonMapper.class);
Person person = mapper.getPersonById(1);
然后接下来是数据的转发或者处理,
然后最后关闭session,
session.close();