MyBatis总结+心得

1、MyBatis框架描述:
     MyBatis是支持普通SQL查询,存储过程和高 级映射的优秀持久层框架。
     MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。
    MyBatis使用简单的XML或注解用于配置 和原始映射,将接口和Java的POJOs(Plan Old Java Objects,普通的Java对象)映射成数据库中的记录.
    MyBatis和ibatis的区别:     
      Mybatis是ibatis的升级,Mybatis不需要写dao的实现类,只需要接口和xml配置文件,接口中声明的方法和xml中的操作id名称相同
     

2、ORM框架结构分析:
1)框架的总体配置文件:指定驱动、连接、事务、其他属性配置等;
2)从配置文件中获取sesssionFactory
3)从sessionfactory中获取session
4)从session中完成对数据的增删改查和事务控制等
5)用完之后关闭session
6)bean和数据表之间的一个映射关系文件
 

3、MyBatis 的配置文件包含了影响 MyBatis 行为甚深的设置(settings)和属性(properties)信息。文档的顶层结构如下:  

---------------------------xml配置:  

configuration 配置  

properties 属性  

settings 设置  

environments 环境  

environment 环境变量 

mappers 映射器 

 

4、 MyBatis框架的优点:

1. 与JDBC相比,减少了50%以上的代码量。

2. MyBatis是最简单的持久化框架,小巧并且简单易学。

3. MyBatis相当灵活,不会对应用程序或者数据库的现有设计强加任何影响,SQL写在XML里,从程序代码中彻底分离,降低耦合度,便于统一管理和优化,并可重用。

4. 提供XML标签,支持编写动态SQL语句。

5. 提供映射标签,支持对象与数据库的ORM字段关系映射。

5、MyBatis框架的缺点:

1. SQL语句的编写工作量较大,尤其是字段多、关联表多时,更是如此,对开发人员编写SQL语句的功底有一定要求。

2. SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。

6、MyBatis框架适用场合:

MyBatis专注于SQL本身,是一个足够灵活的DAO层解决方案。

对性能的要求很高,或者需求变化较多的项目,如互联网项目,MyBatis将是不错的选择。

7、增删改查操作总结:

SQL映射文件的几个顶级元素
mapper - namespace

cache - 配置给定命名空间的缓存

cache-ref – 从其他命名空间引用缓存配置

resultMap –用来描述数据库结果集和对象的对应关系

sql – 可以重用的SQL块,也可以被其他语句引用

insert – 映射插入语句

update – 映射更新语句

delete – 映射删除语句

select – 映射查询语句

注意:按照定义的顺序

mapper
namespace:命名空间.(dtd)

namespace和子元素的id联合保证唯一,区别不同的mapper

注意:
namespace的命名必须跟某个接口同名

接口中的方法与映射文件中SQL语句id一一对应

select
a.查询语句的标签

b.常用属性

id

命名空间中唯一的标识符

接口中的方法与映射文件中的SQL语句id一一对应

parameterType

传入SQL语句的参数类型

resultType

SQL语句返回值类型的完整类名或别名

c. parameterType

基础数据类型

int、String、Date等

只能传入一个,通过#{参数名}即可获取传入的值

复杂数据类型

Java实体类、Map等

通过#{属性名}或者#{map的keyName}即可获取传入值

注意:#{}和${}的区别

${}是原样输出.(可以导致sql注入)

#{}是会给值加入一对双引号.'value'.(建议适用这个)

d. resultMap

<resultMap type="数据类型" id="id">

<result property="d性名" column="数据库列名"/>

<result property="userCode" column="userCode"/>

</resultMap>

注意:resultType和resultMap的区别

resultType :直接表示返回类型

基本数据类型

复杂数据类型

resultMap :对外部resultMap的引用

应用场景:

数据库字段信息与对象属性不一致

复杂的联合查询,自由控制映射结果

resultType和resultMap的关联

当使用resultType的时候,直接在后台就能接收到其相应的对象属性值。

二者不能同时存在,本质上都是Map数据结构

e.resultMap的自动映射

前提:字段名与属性名一致

设置级别autoMappingBehavior:

NONE : 禁止映射

PARTIAL:自动匹配所有(没有嵌套association,collection)

FULL: 自动匹配所有.

例:<setting name="autoMappingBehavior" value="FULL"/>

f.属性

id 在命名空间中唯一的标识符,可以被用来引用这条语句

parameterType 将会传入这条语句的参数类的完全限定名或别名

resultType 从这条语句中返回的期望类型的类的完全限定名或别名。注意集合情形,那应该是集合可以包含的类型,而不能是集合本身。使用resultType或resultMap,但不能同时使用

resultMap 命名引用外部的resultMap

flushCache 将其设置为true,不论语句什么时候被调用,都会导致缓存被清空。默认值:false

useCache 将其设置为true,将会导致本条语句的结果被缓存。默认值:true

timeout 这个设置驱动程序等待数据库返回请求结果,并抛出异常时间的最大等待值。默认不设置(驱动自行处理)

fetchSize 这是暗示驱动程序每次批量返回的结果行数

statementType STATEMENT,PREPARED或CALLABLE的一种。让MyBatis选择使用Statement,PreparedStatement或CallableStatement。默认值:PREPARED

resultSetType FORWARD_ONLY|SCROLL_SENSITIVE|SCROLL_INSENSITIVE中的一种。默认是不设置(驱动自行处理)

insert(增加)
id

parameterType

例:

<insert id="add" parameterType="User" >

insert into smbms_user (userCode,userName,userPassword)

values ( #{userCode},#{userName},#{userPassword})

</insert>

注意:insert、update、delete元素均没有resultType属性

默认返回int类型.

update
例:

<update id ="modify" parameterType="User">

update smbms_user

set userCode = #{userCode},

userName = #{userName},

userPassword = #{userPassword}

where id = #{id}

</update>

delete
例:

<delete id ="deleteUserById" parameterType="int">

delete from smbms_user where id = #{id}

</delete>

DAO层接口方法常见的返回类型
Java对象、Map、List等复杂数据类型
int
(增删改)更新操作时,影响的数据行数
MyBatis参数入参
@Param注解参数
封装成对象入参

resultMap属性
id:
resultMap的唯一标识
type:
Java实体类
resultMap子元素
id
一般对应数据库中该行的主键id,设置此项可提高MyBatis性能
result
映射到JavaBean的某个“简单类型”属性
association
映射到JavaBean的某个“复杂类型”属性,比如JavaBean类
collection

映射到JavaBean的某个“复杂类型”属性,比如集合

association
复杂的类型关联,一对一
内部嵌套
映射一个嵌套JavaBean属性
属性
property:映射数据库列的实体对象的属性
javaType:完整Java类名或者别名
resultMap:引用外部resultMap
子元素
id
result
property:映射数据库列的实体对象的属性
column:数据库列名或者别名
在association和collection两个演示示例的基础上进行测试
在控制台输出没有在resultMap中进行匹配的属性,并观察输出结果


resultMap自动映射(autoMappingBehavior)的三个匹配级别
NONE
禁止自动匹配
PARTIAL(默认)
自动匹配所有属性,内部嵌套除外
FULL
自动匹配所有

8、动态SQL总结:

  动态SQL是MyBatis的一个强大的特性

  动态SQL的元素如下:

  if:利用if实现简单的条件选择

  choose:相当于java中的switch,

  where:简化SQL语句中的条件判断,

  set:解决动态更新语句,

  trim:可以领过的去除多余的关键字,

  foreach:迭代一个集和,通常用于in条件

原文地址:https://www.cnblogs.com/lx3306/p/9198731.html