MyBatis学习之入门篇(一)

来源:互联网 发布:索多玛120天 知乎 编辑:程序博客网 时间:2024/06/06 03:48

MyBatis入门
1 使用MyBatis之前需要依赖 mybatis-x.x.x.jar,可以拷贝jar文件到lib文件夹,也可以使用Maven依赖。

<dependency>  <groupId>org.mybatis</groupId>  <artifactId>mybatis</artifactId>  <version>x.x.x</version></dependency>

2.获取SqlSessionFactory

每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为中心的。SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先定制的 Configuration 的实例构建出 SqlSessionFactory 的实例。

2.1 使用 xml文件创建SqlSessionFactory
从 XML 文件中构建 SqlSessionFactory 的实例非常简单,建议使用类路径下的资源文件进行配置。但是也可以使用任意的输入流(InputStream)实例,包括字符串形式的文件路径或者 file:// 的 URL 形式的文件路径来配置。MyBatis 包含一个名叫 Resources 的工具类,它包含一些实用方法,可使从 classpath 或其他位置加载资源文件更加容易。

String resource = "org/mybatis/example/mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

配置文件包含了MyBatis系统的核心设置,包括一个获取数据库连接的数据源实例,一个事务管理器(用于决定事务域范围和如何控制事务)。下面给出配置文件的简单例子。例子给出了配置文件最核心的部分了。注意xml头,它需要验证xml 文档 。主体部分的environment标签元素包含了事务管理和连接池的环境配置。mappers标签元素包含一系列的映射文件(xml文件/包含sql代码映射定义的注解的Java接口或者类)

<?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>  <environments default="development">    <environment id="development">      <transactionManager type="JDBC"/>      <dataSource type="POOLED">        <property name="driver" value="${driver}"/>        <property name="url" value="${url}"/>        <property name="username" value="${username}"/>        <property name="password" value="${password}"/>      </dataSource>    </environment>  </environments>  <mappers>    <mapper resource="org/mybatis/example/BlogMapper.xml"/>  </mappers></configuration>

2.2 不使用xml文件创建SqlSessionFactory
如果开发者更愿意直接的使用Java来构建配置而不是使用xml文件,或者创建自己的配置构造器,那么可以使用MyBatis提供的一个完整的Configuration类。Configuration类提供了和xm文件一样的配置选项。
注意在这种情况下,配置需要添加一个mapper类。mapper类是包含SQL映射注解的Java类,这样可以避免使用xml文件。但是,由于Java注解的一些局限性和MyBatis的映射的复杂性,使用xml文件来实现映射在大多数高级映射上还是必须的。因此,如果存在一个对等的 xml 配置文件的话,MyBatis 会自动查找并加载它(这种情况下, BlogMapper.xml 将会基于类路径和 BlogMapper.class 的类名被加载进来)

DataSource dataSource = BlogDataSourceFactory.getBlogDataSource();TransactionFactory transactionFactory = new JdbcTransactionFactory();Environment environment = new Environment("development", transactionFactory, dataSource);Configuration configuration = new Configuration(environment);configuration.addMapper(BlogMapper.class);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);

从SqlSessionFactory获取SqlSession
从SqlSessionFactory的名字来看,我们可以从中获取到SqlSession的实例。SqlSession包含了所有面向数据库执行SQL命令的方法。我们可以通过SqlSession来执行映射的SQL语句。如下例子:

SqlSession session = sqlSessionFactory.openSession();try {  Blog blog = (Blog) session.selectOne("org.mybatis.example.BlogMapper.selectBlog", 101);} finally {  session.close();}

其实还有比上面示例更简洁的方法,使用对于给定语句能够合理描述参数和返回值的接口(例如BlogMapper.class)。

SqlSession session = sqlSessionFactory.openSession();try {  BlogMapper mapper = session.getMapper(BlogMapper.class);  Blog blog = mapper.selectBlog(101);} finally {  session.close();}

3 探究映射的SQL语句
SqlSession或者Mapper究竟执行了什么?下面我们来举几个例子:
在上面的每一个例子中,SQL语句可以在xml文件中定义也可以由注解来实现。首先我们看一下在xml文件中是怎么回事。MyBatis提供的一系列特性可以基于映射语言来使用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="org.mybatis.example.BlogMapper">  <select id="selectBlog" resultType="Blog">    select * from Blog where id = #{id}  </select></mapper>

4 作用域和生命周期
理解我们到此为止所谈到的东西的作用域和生命周期是非常重要的,对他们的误解会引起并发问题的产生。
SqlSessionFactoryBuilder
在使用该对象获取 SqlSessionFactory后就把它丢弃掉,从而保证解析xml资源给更重要的事情。
SqlSessionFactory
一旦创建SqlSessionFactory,该对象就应该在应用的执行阶段一直存在,不应该处理它活着重新创建它。在一次应用的运行中,不应该多次创建这个对象。因此,SqlSessionFactory的作用域是整个应用。
SqlSession
每一个线程应有拥有自己的SqlSession实例。SqlSession是线程不安全的,不应该被不同的线程共享。所以,它的作用域应该是一次请求或者在方法作用域内。
不要在任何一个类型管理域中引用它,例如Servlet框架的HttpSession。如果你在使用一个web框架,要考虑吧SqlSession放在类似Http请求的作用域中。换句话说,对于接受到一个Http请求,你可以开启一个SqlSession,然后对于响应你可以关闭它。关闭session是很重要的。应该保证session在一个finally域中关闭。给出实例:

SqlSession session = sqlSessionFactory.openSession();try {  // do work} finally {  session.close();}

5 Mapper实例
Mapper是我们创建用来绑定映射语句的接口。mapper的实例接口可以通过SqlSession获取。可以看出,Mapper的作用域最大范围和获取它的SqlSession的作用域一样。但是,最好的作用域是方法域。我们可以不用显示释放它,但是如果它映射太多东西的话,我们最好还是能够显示关闭它。

SqlSession session = sqlSessionFactory.openSession();try {  BlogMapper mapper = session.getMapper(BlogMapper.class);  // do work} finally {  session.close();}
0 0
原创粉丝点击