关于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的实现。

优点:

  1. 相对简单
  2. SQL语句写在XML文件里,便于统一修改管理。
  3. 提供映射标签,支持对象与数据库表的映射。

缺点:

  1. sql工作量很大 
  2. sql依赖于数据库,导致数据库移植性差。 
  3. 由于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三大核心对象:

  1. SqlSessionFactoryBuilder可被JVM虚拟机所实例化,使用与销毁,但SqlSessionFactoryBuilder在创建SqlSessionFactory后便不需要存在了,既不需要时刻保持该对象的状态,所以可以在方法内部声明SqlSessionFactoryBuilder对象创建SqlSessionFactory.
  2. SqlSessionFactory作为由SqlSessionFactory创建的对象,其实例在运行期间应当一直存在,不需要每次调用数据库时进行创建,故使用的它的最佳方式是使用单例模式。
  3. 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命名空间)
  1. 用于区分不同的mapper,全局唯一
  2. 绑定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的主要内容,如果未能解决你的问题,请参考以下文章

MybatisMyBatis 注解方式的基本 用法

MybatisMyBatis之缓存

MyBatisMyBatis的增删改查

Mybatismybatis登录实例

MybatisMybatis基础(中)

MybatisMybatis缓存