1.Mybatis快速入门
(1)MyBatis介绍
MyBatis本是apache的一个开源项目,原来称为IBatis 2010年这个项目由Apache software foundation 迁移到 google code 应且改名 MyBatis。MyBatis是支持普通的SQL查询、存储过程和高级映射的优秀持久层框架。是一个SQL映射框架。消除了几乎所有JDBC代码,使用简单的XML或注解用于配置和映射,将接口和JAVA的POJOs(Plan Old Java Objects ,普通的JAVA对象)映射成数据库的记录。
简单来说,MyBatis将SQL语句从程序中剥离出来,放到配置文件,并将查询结果和持久化类的属性通过配置文件做了映射,相当于Hibernate ORM框架
它属于一种半自动化的ORM实现。
(2)MyBatis和Hibernate比较
MyBatis和Hibernate都属于ORM框架,为数据持久化提供操作的支持。相当于Hibernate的ORM,MyBatis属于“SQL-Mapping”的ORM实现。
1.相对MyBatis,Hibernate的内容较多,学习难度高于MyBatis,MyBatis更接近于JDBC的开发,简单易学,容易掌握。
2.Hibernate开发者不需要关注SQL的生成与结果的映射,而MyBatis需要手写SQL语句。
3.Hibernate与具体数据库的关联只需要在XML中配置即可,所有的HQL语句与具体使用的数据库无关,移植性好,而MyBatis直接使用SQL语句,不同数据库可能有差异,可移植性差。
4.由于直接使用SQL,所有MyBatis灵活性更高,而且MyBatis的执行效率比Hibernate略高一些。
(3)MyBatis的优缺点以及使用场合
优点:
MyBatis小巧,简单易学,通过文档和源代码可以比较轻松的掌握它的设计思想和实现。
1.简单且功能强大。通过SQL映射文件和SqlSession能够实现数据持久化层的功能,与JDBC相比减少了很多的代码量
2.开发人员能够完全控制所执行的SQL语句,尤其使用于多表复杂查询
3.容易维护和修改,SQL语句写在配置文件里,只要修改配置文件即可。
缺点:
MyBatis属于半自动的ORM,需要开发人员掌握SQL语句的编写,由于要写SQL语句,不同的数据库需要重新修改SQL,因此MyBatis的数据库移植性不好。
适用场合:
如果不需要太复杂的功能,而需要一个足够灵活的DAO层解决方案,或者对性能的要求很高,MyBatis是不错的选择。
不适合使用MyBatis的场合:
1.当希望对象的持久化对应用程序完全透明时,可以使用对象映射,如Hibernate。
2.当数据库有移植性需求,或者需要支持多种数据库时。
3.当应用程序需要完全动态的SQL时,如查询的字段都需要动态生成时。
4.当没有使用关系数据库时,或者使用的不是真正的关系数据库时。
(4)使用MyEclipse实现数据表的查询
1.下载需要的MyBatis jar包
2.部署MyBatis jar包
3.编写MyBatis配置文件
(1)environments元素:用于配置多个数据环境,可以映射多个数据库信息。 默认Default
在MyBatis中有两种事务管理器类型(type=“[JDBC|MANAGED]”)
> JDBC :直接使用JDBC控制事务,它依赖于从数据源得到的连接来管理事务范围
> MANAGED:MyBatis自己不负责控制事务,它会让容器来管理事务的整个生命周期(如Spring 或者JavaEE 应用服务器)
数据类型有三种:
> UNPOOLED:简单打开和关闭连接,有一点慢,简单应用程序的选择,不需要及时的可用连接。
> POOLED:采用连接池以避免创建新的连接实例时必要的初始连接和认证时间。当前Web应用程序快速响应请求的流行方法。
> JNDI:MyBatis通过JNDI获取数据源
(2)mappers:包含所有Mapper的列表,告诉MyBatis去哪里找SQL语句,主要定义SQL的映射文件。
4.创建持久化类和数据库接口
5.创建SQL映射文件
6.创建数据库接口的实现类。
7.编写测试类进行测试
搭建MyBatis开发环境,实现用户表记录数的查询
在MyEclipse中创建工程,导入MyBatis jar包,并设置MyBatis源码
创建MyBatis配置文件mybatis-config.xml,配置数据库信息
借用之前的实体类User和IUserDao
配置映射文件UserDaoMapper.xml
实现UserDaoImpl
2.使用Mybatis实现持久化操作
(1)使用MyBatis实现持久化查询
与查询对应的Select 元素是使用MyBatis时最常用的元素。
Select元素有如下属性可以设置
其中最常用的属性有 :
id :命名空间唯一的标识符可以用来引用这条语句。
parameterType:表示查询语句传入参数的类型的完全限制名或别名。
parameterMap:存在与低版本中,在MyBatis中已经废弃
ResultType :查询语句返回结果类型的完全限定名或别名。
ResultMap :结果类型的映射 resultMap和resultType,不能同时使用
flushCache :true 执行语句调用后都会导致缓存被情况。默认false
useCache :true 本条语句被缓存,默认true
timeout :设置驱动程序等待服务器返回的超时时间,超过设置时间会抛出异常。默认不设置。(驱动自行处理)
fetchSize :设置驱动程序每次批量返回的结果次数。默认不设置。
statementType :Statement prepared或callAble 的一种 MyBatis选择使用Statement:PrepareStatement和 callAbleStatement 默认prepared
resultSetType:默认不设置
1.selectOne():
2.Session.getMapper()
MyBatis面向接口编程中,第二种方式 IEmpDao empdao =Session.getMapper(IEmpDao .Class)得到一个IEmpDao 的代理类,代理类是通过JDK的动态代理实现的,只要定义接口及接口的方法,MyBatis就会动态生成实现IEmpDao 接口的代理,由代理解析XML 调用SQL,并返回结果。
使用接口编程需要注意:namespace需要定义接口的全限定名,映射语句的ID配置需要与接口中的方法名相同。
3.使用ResultMap实现结果映射。
Property:数据库列所映射的字段或属性的名称。
Column:从数据库中得到的列名
javaType:一个JAVA类的完全限定名,或一个类型别名。
jdbcType:设置JDBC类型
4.使用MyBatis实现数据表增删改操作。
Id:命名空间唯一的标识符可以用来引用这条语句
parameterType:表示查询语句传入参数的类型的完全限制名或别名
flushCache: true 执行语句调用后都会导致缓存被情况。增删改默认true
Timeout:设置驱动程序等待服务器返回的超时时间,超过设置时间会抛出异常。默认不设置。(驱动自行处理)
statementType:Statement prepared或callAble 的一种 默认为Prepared
useGeneratedKeys:取出数据库内部的主键,默认false
keyProperty:设置如何获得主键,默认不设置
(1)数据库支持自动生成主键的字段
(2)数据库不自动生成,而是采用序列生成。
主键采用Oracle的序列生成的代码:
各属性含义:
keyProperty:应该被设置的目标属性
resultType:结果类型
Order:before:首先选择主键设置keyProperty后执行插入语句。after 先执行插入语句后设置主角再设置keyProperty
(2)
3.使用动态SQL完成复杂操作
(1)动态SQL是MyBatis的一个强大的特性。动态SQL基于OGNL的表达式。
实现动态SQL的元素如下:
If:利用if实现条件选择,用于定义where子句的条件
Choose(when otherwise):相当于JAVA中的switch
Where:简化SQL语句中的where的条件判断。
Set:解决动态更新语句
(2)MyBatis核心类生命周期和管理
a) SqlSessionFactoryBuilder:可以被实例化、使用和丢弃。创建SqlSessionFactory后这个类就不需要了,最佳作用域:方法范围
b) SqlSessionFactory:获取SqlSession的工厂,类似于JDBC中加载数据库驱动。作用域:应用范围。
c) SqlSession:类似于JDBC的Collection对象,每个线程都应该有自己的SqlSession实例。SqlSession实例不能共享,因为它的线程是不安全的。最佳作用域:方法范围。
4.使用MyBatis实现员工信息管理
配置缓存:
(1)MyBatis的全局cache配置
全局的开关在MyBatis的配置文件中,默认是true。 False:在Mapper XML中 再配置支持cache也没有用。
(2)在Mapper XML文件中开启二级缓存
默认不开启缓存
开启
MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架
在MyBatis的配置文件中配置全局的参数、数据连接和SQL映射文件的位置,并可以为结果类型映射别名
在SQL映射文件中为提供了select、insert、update、delete等元素实现SQL语句的映射,结果类型的映射可以使用resultMap和resultType,但不能同时使用
在SQL映射文件中使用if、choose、where、set实现动态SQL的映射
使用SqlSession提供的selectOne() selectList() insert() update() delete() , getMapper()方法更加简洁和方便,而且不容易出错。