首先来分析一下JDBC一个SQL操作的主要的步骤:
第一步:连接数据库,获取连接
第二部:使用连接,封装SQL语句,进行操作
第三部:处理查询结果
第四部:关闭连接
MyBatis对上面的步骤进行了封装,封装的方式如下:
对待第一个步骤的封装
使用的封装方式主要是使用一个XML文件进行封装,XML文件的格式如下:
xml version="1.0" encoding="UTF-8" ?>
PUBLIC "-//iBATIS.com//DTD SQL Map Config 3.0/
"[url]http://www.ibatis.com/dtd/[/url]sql-map-config-3.dtd" >
enhancementEnabled ="true"
lazyLoadingEnabled ="true"
errorTracingEnabled ="true"
maxRequests ="32"
maxSessions ="10"
maxTransactions ="5"
useStatementNamespaces ="false"
/>
这个文件就是保存基础数据库连接和事务管理的配置文件了。
但是到这里为止,这个仅仅只是一个一些配置信息,怎么去根据这些信息生成在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建立的。映射表的内容如下所示:
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
insert into person (personId,name,age) values (#{personId},#{name},#{age})
映射表当中保存的是接口与表SQL的关联,namespace表示对应的接口名称,包含package name在内的接口名称。
下面的操作
当前的这一个步骤直接封装完成了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();