关于MyBatis
Posted mxmeng
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于MyBatis相关的知识,希望对你有一定的参考价值。
初学时,感觉有点意思,最后发现,还是有一点缺点,MyBatis对数据库要求很严格,只能一个数据库,不能随便移植,对开发人员的编码能力有很高的要求。。。
框架:
1、Spring 框架
- 依赖注入容器 / AOP实现
- 声明式事务
- 简化Java EE应用
- 黏合剂,将大家组装到一起
2、Spring MVC框架
- 结构最清晰的MVC Model2实现
- 高度可配置,支持多种视图技术
- 定制化开发
3、Struts框架
- MVC设计模式的实现
- 拦截器
- 可变和可重用的标签
4、MyBatis 框架
- 半自动化的ORM实现
- DAO层
- 动态SQL
- 小巧灵活、简单易学
5、Hibernate 框架
- ORM,简化数据库操作
- DAO层
MyBatis框架: 优秀的数据持久层框架,在实体类/持久类与数据库表之间建立映射关系,是一种半ORM的实现。
优点:
- 相对简单
- SQL语句写在XML文件里,便于统一修改管理。
- 提供映射标签,支持对象与数据库表的映射。
缺点:
- sql工作量很大
- sql依赖于数据库,导致数据库移植性差。
- 由于xml里标签id必须唯一,导致DAO中方法不支持方法重载。
ORM 简介:ORM(Object/Relational Mapping)即对象/关系映射,是一种数据持久化技术。
特点: 基于SQL语法,简单易学 能了解底层封装过程 SQL语句封装在配置文件中,便于统一管理与维护,降低程序的耦合度 方便程序代码调试
MyBatis 环境搭建:
下载需要的jar文件
- 部署jar包
- 编写MySatis核心配置文件
- 创建实体类
- 创建DAO接口
- 创建SQL映射文件
- 编写测试类
- 读取核心配置文件mybatis-config.xml
- 创建SqlSessionFactory对象,读取配置文件
- 创建SqlSession对象 调用mapper文件进行数据操作
MyBatis依赖包中文件说明:
- asm-3.3.1.jar:操作java字节码的类库
- cglib-2.2.2.jar:用来动态集成java类或实现接口
- commons-logging-1.1.1.jar:通用日志处理
- javassist-3.17.1-GA.jar:分析、编辑和创建java字节码的类库
- log4j-1.2.17.jar:日志系统
- slf4j-api-1.7.5.jar:日志系统的封装,对外提系统统一的API接口
- slf4j-log4j12-1.7.5.jar:slf4j对log4j的相应驱动,完成slf4j绑定log4j
MyBatis-config.xml文件常用元素:
- configuration:配置文件的根元素节点
- properties:通过resource属性从外部指定properties属性文件,该属性文件描述数据库连接的相关配置(Driver,URL,用户名,密码)在resources目录下
- settings:设置MyBatis运行中的一些行为
- environments:表示配置MyBatis的多套运行环境,将SQL映射到不同的数据库上,可以配置多个,但是必须指定一个默认运行环境
- environment:配置MyBatis的一套运行环境,需指定运行环境ID,事务管理,数据源配置
- mappers:找SQL映射文件
- mapper:mappers的子元素节点,具体指定sql映射文件的路径
注意:元素节点有顺序,不按顺序报错
Mybatis三大核心对象:
- SqlSessionFactoryBuilder可被JVM虚拟机所实例化,使用与销毁,但SqlSessionFactoryBuilder在创建SqlSessionFactory后便不需要存在了,既不需要时刻保持该对象的状态,所以可以在方法内部声明SqlSessionFactoryBuilder对象创建SqlSessionFactory.
- SqlSessionFactory作为由SqlSessionFactory创建的对象,其实例在运行期间应当一直存在,不需要每次调用数据库时进行创建,故使用的它的最佳方式是使用单例模式。
- SqlSession对象由SqlSessionFactory对象创建。每个线程都应该由一个自己的SqlSession实例,该实例不可共享且线程是不安全的,所以千万不要在Servlet中声明对象的实例变量。又因为Servlet是单例的,声明成实例变量会造成线程的不安全,也绝对不能将SqlSession放在一个类的静态字段甚至实例字段中,还不可以将SqlSession实例对象放在任何类型的管理中,如Servlet的HttpSession会话中。最后务必在finally语句中对SqlSession进行关闭。
SqlSessionFactoryBuilder的作用:
- SqlSessionFactoryBuilder负责构建SqlSessionFactory,并且提供多个build()方法的重载
特点: 用过即丢,最佳范围存在于方法体内,局部变量
SqlSessionFactory:
- SqlSessionFactory是每个MyBatis应用的核心
- 作用:创建SqlSession实例(用openSession()方法获取)
- 生命周期: 一直存在,不建议多次创建,最佳作用域(Application)
SqlSession:(sqlSession.selectList()、sqlSession.getMapper(Mapper.class)调用接口方法)
- 用于执行持久化操作对象,类似于JDBC中的Connection 包含了执行SQL所需的所有方法 对应一次数据库会话,会话结束必须关闭 线程级别,不能共享
注意:(在SqlSession里可以执行多次SQL语句,但一旦关闭了SqlSession就需要重新创建)
SQL映射文件(顶级元素):
- mapper:映射文件的根元素节点,只有一个属性(namespace命名空间)
- 用于区分不同的mapper,全局唯一
- 绑定DAO接口,面向接口编程(namespace命名必须跟接口同名)
- cache:配置给定命名空间的缓存
- cache-ref:从其他命名空间引用缓存配置
- resultMap:用来描述数据库结果集和对象的对应关系
- sql:可以重用的SQL块,也可以被其他语句引用
- insert:映射插入语句
- update:映射更新语句
- delete:映射删除语句
- select:映射查询语句
parameterType:
- 基础数据类型 int、String、Date等
- 只能传入一个,通过#{参数名}即可获取传入的值
- 复杂数据类型 Java实体类、Map等
- 通过#{属性名}或者#{map的keyName}即可获取传入值
resultType :直接表示返回类型(手动映射)
- 基本数据类型
- 复杂数据类型
resultMap :对外部resultMap的引用(自动映射)
- 应用场景: 数据库字段信息与对象属性不一致 复杂的联合查询,自由控制映射结果
注意:(二者不能同时存在,本质上都是Map数据结构)
resultMap的基本配置:
- id:resultMap的唯一标识
- type:表示该resultMap的映射结果类型
association:一对多
- javaType:完整java类名或者别名
- property:映射到一个HashMap,应该指定javaType,确保所需行为
- peoperty:映射到数据库列的实体对象的属性
association的子元素:
- id
- result:
- property:映射数据库列的实体对象的属性
- column:数据库列名或别名
collection:(集合)
- ofType:完整java类名或者别名,即集合所包含的类型
- property:映射数据库的实体对象的属性
相关代码:
<resultMap id=“userMap” type=“User”>
<id property=“id” column=“id”/>
<result property=“usercode” column=“usercode”/>
<!-- 一对多,多对多的关系 -->
<!-- property: 指的是集合属性的值, ofType:指的是集合中元素的类型 -->
<collection ofType=“Role” property=“role”>
<id property=“id” column=“id”/>
<resut property=“rolecode” column=“rolecode”/>
</collection>
<resultMap>
resultMap自动映射级别:
- NONE:禁止自动匹配
- PARTIAL(默认):自动匹配所有属性,有内部嵌套(association、collection)的除外
- FULL:自动匹配所有
MyBatis缓存:
- 一级缓存
- 二级缓存
<settings>
<setting name = “cacheEnabled” value=”true”/>
</settings>
<cache eviction="FIFO" flushInterval="60000"
size="512" readOnly="true"/>
<select id="selectAll" resultType="Emp" useCache="true">
动态SQL元素:
if:利用if实现简单的条件选择
<select id="listProduct" resultType="Product">
select * from product
<if test="name!=null">
where name like concat(‘%‘,#{name},‘%‘)
</if>
</select>
如果if里的test 表达式不成立 那么就不会追加if里的代码
choose(when,otherwise):相当于java中switch语句,通常与when和otherwise搭配
提供了任何条件,就进行条件查询,否则就使用id>1这个条件。 依次判断 when 如果 其中一个when成立 就结束。 如果when没有一个成立 就执行otherwise
where:简化SQL语句中where的条件判断
<select id="listProduct" resultType="Product">
select * from product
<where>
<if test="name!=null">
and name like concat(‘%‘,#{name},‘%‘)
</if>
<if test="price!=null and price!=0">
and price > #{price}
</if>
</where>
</select>
where标签会进行自动判断如果任何条件都不成立,那么就在sql语句里就不会出现where关键字如果有任何条件成立,会自动去掉多出来的 and 或者 or。
set:解决动态更新语句
trim:可以灵活地去掉多余的关键字
foreach:迭代一个集合,通常用于in条件
trim属性
- prefix:前缀,如where
- suffix:后缀
- prefixOverrides:对于trim包含内容的首部进行指定内容的忽略
- suffixOverrides:对于trim包含内容的首尾进行指定内容的忽略
foreach基本属性:
- item:表示集合中每一个元素进行迭代时的别名
- index:指定一个名称,用于表示迭代过程中,每次迭代到的位置
- open:表示该语句以什么开始
- separator:表示在每次进行迭代之间以什么符号作为分隔符(即in条件语句,必须以“,”作分隔符)
- close:表示语句以什么结束;
collection:最关键并最容易出错的属性,
属性值:
- 若入参为单参数类型是List,collection属性值为List;
- 若入参为单参数且参数类型是数组,collection属性值为array
- 若入参参数为多参数:封装为Map
choose(when、otherwise):
相当于(switch)代码:
<choose>
<when test ="条件1"> …</when>
<when test ="条件2"> …</when>
<when test ="条件3"> …</when>
…
<otherwise>…</otherwise>
</choose>
分页: 起始位置下标=(页码-1)*页面容量
增删改查关键代码:
添加:insert into 表名(列名) values()
删:delete from 表名 where id=。。。。
改:update 表名 set 列名=#{},列名=#{} where id=。。。。
查:select * from 表名 inner join 表名 on x=x where group by order by limit 起始行,行数
Mybatis-config.xml 关键代码:
<configuration>
<properties resource=“database.properties”/>
<settings>
<setting name=“logImpl” value=“LOG4J”/>
</settings>
<environments default=“a”>
<environment id=“a”>
<property name==“driver” value”${driver}”/>
<property name==“url” value”${url}”/>
<property name==“username” value”root”/>
<property name==“password” value”ok”/>
</environment>
</environments>
<mappers>
<mapper resource=“cn/dao/UserMapper.xml”/></mappers>
</configuration>
以上是关于关于MyBatis的主要内容,如果未能解决你的问题,请参考以下文章