【MyBatis】第一章:MyBatis的简介和入门使用
2016-05-01 00:38
344 查看
前言:本人所写的文章仅作为自己的自学记录,并不是教程,我也是自己摸索,自己学习,所以写的文章可能会存在问题,有些文章也参考别人的或者是官方文档的,用来加深自己的理解,还望前辈指教,谢谢!
第三步、编写sql映射文件 首先,先编写一个简单的sql映射文件,以后还要对sql映射文件进行详细的学习使用。
在一个sql语句的xml映射文件中,是想定义多少个映射语句都是可以的。在上面的sql语句的xml映射文件中,在命名空间"org.mybatis.example.BlogMapper"中定义了一个id为selectBlog的映射语句,这样就可以使用完全限定名"org.mybatis.example.BlogMapper.selectBlog"来调用映射语句,即通过 命名空间+id 来调用sql映射语句。
第四步、从SqlSessionFactory中获取SqlSession并执行sql语句
命名空间在早期的版本是可选的,但是现在的命名空间是必须的,目的是希望能比只是简单的使用更长的完全限定名来区分sql语句更进一步。
为了减少输入量,mybatis对所有的命名配置元素(包括语句,结果映射,缓存等)使用了如下的命名解析规则。
完全限定名(比如"com.mypackage.MyMapper.selectAllThings")将被直接查找并找到即用
短名称(比如"selectAllThings")如果全局唯一,也可以作为一个单独的引用。如果不唯一,有两个或者两个以上的相同名称(比如"com.foo.selectAllThings"和"com.bar.selectAllThings"),那么使用时就会收到错误报告说短名称是不唯一的,这种情况下就必须使用完全限定名。
2.范围和生命周期
依赖注入框架可以创建线程安全的、基于事务的SqlSession和映射器(mapper)并直接将它们注入到bean中,交给容器来管理,因此可以直接忽略它们的生命周期。比如spring框架。
SqlSessionFactoryBuilder
这个类可以被实例化、使用和丢弃,一旦创建了SqlSessionFactory,就不再需要它了。因此SqlSessionFactoryBuilder实例的最佳范围是方法范围(也就是局部范围变量)。可以重用SqlSessionFactoryBuilder来创建多个SqlSessionFactory实例,但是最好还是不要让其一直存在以足以保证所有的xml解析资源开放给跟重要的事情。
SqlSessionFactory
SqlSessionFactory一旦被创建就应该在应用的运行期间一直存在,没有任何理由对它们进行清除或者重建。使用SqlSessionFactory的最佳实践是在应用的运行期间不要重复创建多次,多次重复创建SqlSessionFactory被视为代码“坏味道(bad smell)”。因此 SqlSessionFactory的最佳范围是应用范围。有很多方法可以做到,最简单的方法就是使用单例模式或者静态单例模式。
SqlSession
每个线程都应该有它自己的SqlSession实例。SqlSession的实例不是线程安全的,因此是不能被共享的,所以它最佳的范围是请求或者方法范围。绝对不能将SqlSession实例的引用放在一个类的静态域,甚至一个类的实例变量也不行。也绝不能将SqlSession实例的引用放在任何类型的管理范围中,比如Servlet架构中的HttpSession。如果正在使用一种web框架(比如SpringMVC),要考虑SqlSession放在一个和HTTP请求对象相似的范围中。换句话说,每次收到HTTP请求,就可以打开一个SqlSession,返回一个响应,就关闭它。这个关闭操作是很重要的,应该把这个关闭操作放在finally块中以确保每次都能执行关闭。下面的示例就是一个确保SqlSession关闭的标准模式
映射器实例(即 Mapper Interfaces)是创建用来绑定映射sql语句的接口。映射器接口的实例是从SqlSession中获得的。因此从技术层面讲,映射器实例的最大范围是和SqlSession相同的,,因此它们都是从SqlSession里被请求的。映射器的最佳范围是方法范围,也就是说,映射器实例应该在调用它们的方法中被请求,用过之后即可废弃。并不需要显示地关闭映射器实例,尽管在整个请求范围(request scope)保持映射器实例也不会有什么问题,但是很快就会发现,像SqlSession一样,在这个范围上管理太多的资源的话会难于控制。所以要保持简单,最好把映射器放在方法范围(method
scope)内。示例如下:
一、简介
MyBatis是支持定制化sql、存储过程以及高级映射的优秀的优秀的持久层框架。MyBatis几乎避免了所有的jdbc代码和手动设置参数以及获取结果集。MyBatis可以对配置和原生Map使用简单的XML或者注解,将接口和Java的POJOs(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。
二、入门使用
使用的时候,主要包括以下几个步骤
导入mybatis的jar包(有两种方式,直接添加到classpath或者使用maven添加) 编写mybatis的xml配置文件(也可以不编写xml配置文件,直接通过Java代码使用,但是比较麻烦) 编写mybatis的xml映射文件(用来映射Java对象,即编写sql语句的xml文件)1.导入mybatis的jar包的两种方式
1) 直接导入到classpath
把mybatis的jar包下载到本地(https://github.com/mybatis/mybatis-3),我下载的是mybatis-3.2.7.zip 当然也可以下载更新的版本的mybatis-3.3.1.zip,解压后,将lib目录下的jar包添加到项目中。2) maven项目导入mybatis的jar包
通过maven搭建项目好处很多,它可以自动帮我们下载所需要的依赖包。 只需要在maven项目中的pom.xml文件中加入如下dependency代码即可<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>x.x.x</version> <!-- 这里可以指定mybatis的版本 --> </dependency></span>2.编辑mybatis的配置文件
[code] 每个基于mybatis的应用都是以一个SqlSessionFactory的实例为中心的。SqlSessionFactory的实例可以通过SqlSessionFactoryBuilder获得。而SqlSessionFactoryBuilder则可以从mybatis的xml配置文件中或者一个预先定制的Configuration的实例构建出SqlSessionFactory的实例。即可以通过xml配置文件的方式或者Java代码直接构建的方式来获取SqlSessionFactory实例。
从xml文件中构建SqlSessionFactory的实例非常简单,建议使用类路径下的资源文件进行配置,也可以使用任意的输入流(InputStream)实例,包括字符串形式的文件路径或者file://的URL形式的文件路径来配置。mybatis包含一个名叫Resources的工具类,它包含一些实用的方法,可使从classpath或者其他位置加载资源文件更加容易。
xml配置文件(configuration xml)中包含了对mybatis系统的核心设置,包含获取数据库连接实例的数据源(DataSource)和决定事务范围和控制方式的事务管理器(TransactionManager)。xml配置文件的详细内容后面再探讨。
第一步、编辑xml配置文件。 下面的示例指出的是最关键的部分。要注意xml的头部声明,用来验证xml文档的正确性。environment元素体中包含了事务管理和连接池的配置。mapper元素则是包含一组mapper映射器(这些mapper的xml映射文件包含了sql代码和映射定义信息)
<?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}"/> <span style="font-family: Arial, Helvetica, sans-serif;"><!-- 连接数据库的URL --> <property name="username" value="${username}"/> <span style="font-family: Arial, Helvetica, sans-serif;"><!-- 连接数据库的用户名--> <property name="password" value="${password}"/> <span style="font-family: Arial, Helvetica, sans-serif;"><!-- 连接数据库的密码 --> </dataSource> </environment> </environments> <mappers> <mapper resource="org/mybatis/example/BlogMapper.xml"/> <span style="font-family: Arial, Helvetica, sans-serif;"><!-- 加载mybatis的映射文件 --> </mappers> </configuration>第二步、加载xml配置文件
String resource = "org/mybatis/example/mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);还有一种办法是直接通过Java代码来构建SqlSessionFactory,不建议使用,若想试一下,可以查看官方API
第三步、编写sql映射文件 首先,先编写一个简单的sql映射文件,以后还要对sql映射文件进行详细的学习使用。
<?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>
在一个sql语句的xml映射文件中,是想定义多少个映射语句都是可以的。在上面的sql语句的xml映射文件中,在命名空间"org.mybatis.example.BlogMapper"中定义了一个id为selectBlog的映射语句,这样就可以使用完全限定名"org.mybatis.example.BlogMapper.selectBlog"来调用映射语句,即通过 命名空间+id 来调用sql映射语句。
第四步、从SqlSessionFactory中获取SqlSession并执行sql语句
在第二步中已经获取到了sqlSessionFactory,顾名思义,就可以从sqlSessionFactory中获取SqlSession实例了。SqlSession完全包含了面向数据库执行sql命令所需的所有方法。
调用并执行sql语句有两种办法,一种是直接通过SqlSession调用,一种是通过开发的mapper接口来调用。
1)直接通过SqlSession调用
SqlSession session = sqlSessionFactory.openSession(); <!-- 通过<span style="font-family: Arial, Helvetica, sans-serif;">sqlSessionFactory获取</span><span style="font-family: Arial, Helvetica, sans-serif;">SqlSession对象 </span><span style="font-family: Arial, Helvetica, sans-serif;"> --></span><span style="font-family: Arial, Helvetica, sans-serif;"> </span>try { Blog blog = (Blog) session.selectOne("org.mybatis.example.BlogMapper.selectBlog", 101); <span style="font-family: Arial, Helvetica, sans-serif;"><!-- 执行sql语句,参数为101,返回结果数量为1个,类型为</span><span style="font-family: Arial, Helvetica, sans-serif;">Blog </span><span style="font-family: Arial, Helvetica, sans-serif;"> --></span><span style="font-family: Arial, Helvetica, sans-serif;"> </span>} finally { session.close(); <!-- 最后记得关闭SqlSession --> }[code] 2)通过开发的mapper接口调用
SqlSession session = sqlSessionFactory.openSession(); <span style="font-family: Arial, Helvetica, sans-serif;"><!-- 通过</span><span style="font-family: Arial, Helvetica, sans-serif;">sqlSessionFactory获取</span><span style="font-family: Arial, Helvetica, sans-serif;">SqlSession对象 </span><span style="font-family: Arial, Helvetica, sans-serif;"> --></span> try { BlogMapper mapper = session.getMapper(BlogMapper.class); <!-- <span style="font-family: Arial, Helvetica, sans-serif;">BlogMapper为程序员开发的mapper接口,接口里面定义了名为selectBlog的方法 </span><span style="font-family: Arial, Helvetica, sans-serif;"> --></span> Blog blog = mapper.selectBlog(101); } finally { session.close(); }
mapper接口开发的方式有很多优势,首先它不是基于字符串常量的,就会更安全;其次,如果你的IDE有代码补全的功能,那么可以在有了已映射sql语句的基础之上利用这个功能。
对于BlogMapper这样的映射类(Mapper.class)来说,还有一招,就是它们的sql映射语句不需要用xml来做,取而代之的是直接使用Java的注解。比如上面xml示例通过mapper接口开发时,原本的mapper接口为:
package org.mybatis.example; public interface BlogMapper { Blog selectBlog(int id); }
当不需要xml来做的时候,直接使用Java注解的时,mapper接口就如下,不需要再编写xml映射文件
package org.mybatis.example; public interface BlogMapper { @Select("SELECT * FROM blog WHERE id = #{id}") Blog selectBlog(int id); }
可以发现在接口 Blog selectBlog(int id); 上面多了@Select("SELECT * FROM blog WHERE id = #{id}") 这个注解,对于简单的sql语句来说,使用注解可以使代码显得更加简洁,但是Java注解对于稍微复杂的sql语句就会显得力不从心并且更加混乱。因此当需要做复杂的事情时,最好还是xml映射文件的方式。
三、命名解释、范围和生命周期
1.命名空间命名空间在早期的版本是可选的,但是现在的命名空间是必须的,目的是希望能比只是简单的使用更长的完全限定名来区分sql语句更进一步。
为了减少输入量,mybatis对所有的命名配置元素(包括语句,结果映射,缓存等)使用了如下的命名解析规则。
完全限定名(比如"com.mypackage.MyMapper.selectAllThings")将被直接查找并找到即用
短名称(比如"selectAllThings")如果全局唯一,也可以作为一个单独的引用。如果不唯一,有两个或者两个以上的相同名称(比如"com.foo.selectAllThings"和"com.bar.selectAllThings"),那么使用时就会收到错误报告说短名称是不唯一的,这种情况下就必须使用完全限定名。
2.范围和生命周期
依赖注入框架可以创建线程安全的、基于事务的SqlSession和映射器(mapper)并直接将它们注入到bean中,交给容器来管理,因此可以直接忽略它们的生命周期。比如spring框架。
SqlSessionFactoryBuilder
这个类可以被实例化、使用和丢弃,一旦创建了SqlSessionFactory,就不再需要它了。因此SqlSessionFactoryBuilder实例的最佳范围是方法范围(也就是局部范围变量)。可以重用SqlSessionFactoryBuilder来创建多个SqlSessionFactory实例,但是最好还是不要让其一直存在以足以保证所有的xml解析资源开放给跟重要的事情。
SqlSessionFactory
SqlSessionFactory一旦被创建就应该在应用的运行期间一直存在,没有任何理由对它们进行清除或者重建。使用SqlSessionFactory的最佳实践是在应用的运行期间不要重复创建多次,多次重复创建SqlSessionFactory被视为代码“坏味道(bad smell)”。因此 SqlSessionFactory的最佳范围是应用范围。有很多方法可以做到,最简单的方法就是使用单例模式或者静态单例模式。
SqlSession
每个线程都应该有它自己的SqlSession实例。SqlSession的实例不是线程安全的,因此是不能被共享的,所以它最佳的范围是请求或者方法范围。绝对不能将SqlSession实例的引用放在一个类的静态域,甚至一个类的实例变量也不行。也绝不能将SqlSession实例的引用放在任何类型的管理范围中,比如Servlet架构中的HttpSession。如果正在使用一种web框架(比如SpringMVC),要考虑SqlSession放在一个和HTTP请求对象相似的范围中。换句话说,每次收到HTTP请求,就可以打开一个SqlSession,返回一个响应,就关闭它。这个关闭操作是很重要的,应该把这个关闭操作放在finally块中以确保每次都能执行关闭。下面的示例就是一个确保SqlSession关闭的标准模式
SqlSession session = sqlSessionFactory.openSession(); try { // do work } finally { session.close(); }映射器实例(Mapper Interfaces)
映射器实例(即 Mapper Interfaces)是创建用来绑定映射sql语句的接口。映射器接口的实例是从SqlSession中获得的。因此从技术层面讲,映射器实例的最大范围是和SqlSession相同的,,因此它们都是从SqlSession里被请求的。映射器的最佳范围是方法范围,也就是说,映射器实例应该在调用它们的方法中被请求,用过之后即可废弃。并不需要显示地关闭映射器实例,尽管在整个请求范围(request scope)保持映射器实例也不会有什么问题,但是很快就会发现,像SqlSession一样,在这个范围上管理太多的资源的话会难于控制。所以要保持简单,最好把映射器放在方法范围(method
scope)内。示例如下:
SqlSession session = sqlSessionFactory.openSession(); try { BlogMapper mapper = session.getMapper(BlogMapper.class); // do work } finally { session.close(); }
相关文章推荐
- 20145122《Android开发基础》实验四实验报告
- Android Studio Rest Client工具详解
- eclipse安装和maven的配置(windows)
- Spring2.5 BeanPropertyRowMapper ResultSet和实体类的字段进行实现自动映射
- IntelliJ IDEA Tomcat配置 详解
- POJ_3074_Sudoku(DancingLinksX精确覆盖)
- web.xml 配置中classpath: 与classpath*:的区别
- android源码解析(十八)-->Activity布局绘制流程
- JAVA 泛型
- laravel的安装
- java.io.FileNotFoundException: class path resource [bean/test/User.hbm.xml] cannot be opened because it does not exist
- 做一个自己想要的网络请求框架
- STL算法之回调函数和函数对象的理解及设计
- 解决ajax不能访问本地文件(利用js跨域原理)
- 尾递归(Tail Recursion)和Continuation
- HDU 5675 ztr loves math
- 英语试卷建库的win程序发布
- Android自定义View(一)实现文字验证码
- 作业——在线学习Android课程之第九周(进程与服务)
- Java练习题