欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

关于MyBatis

程序员文章站 2022-03-10 23:07:32
初学时,感觉有点意思,最后发现,还是有一点缺点,MyBatis对数据库要求很严格,只能一个数据库,不能随便移植,对开发人员的编码能力有很高的要求。。。 框架: 1、Spring 框架 依赖注入容器 / AOP实现 声明式事务 简化Java EE应用 黏合剂,将大家组装到一起 2、Spring MVC ......

初学时,感觉有点意思,最后发现,还是有一点缺点,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>