MyBatis学习总结


小白一枚,写博客记录自己的学习历程,也希望能帮助到你。这篇文章总结一下我的MyBatis学习,希望大佬们多多指教。

MyBatis简介

首先放上官方的MyBatis学习文档 http://www.mybatis.org/mybatis-3/zh/index.html
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
最初是apache的开源项目–iBatis, 2010年由apache迁移到google,并改名为MyBatis.在2013年11月由google迁移到GitHub。
ORM(Object/Relational Mapping), 即对象/关系映射。 ORM是一类框架的总称,这类框架完成了对象数据到关系型数据的映射。使开发人员能够以面向对象的思想,操作数据库。所以Mybatis是进行JDBC操作的一个框架。

特点

1.MyBatis是一个轻量级ORM框架,只需mybatis-*. jar和数据库驱动器即可运行.
2.MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集
3.将SQL代码与程序代码分离,利于SQL重用和修改
4.MyBatis不会对应用程序或数据库的设计强加任何影响,提高应用的灵活性

一些基本的了解官方文档中都有描述。

项目搭建

第一步:创建Web项目,添加Mybatis必备jar包
第二步:编写配置文件,连接数据库
第三步:编写实体类和映射文件
第四步:测试
在这里插入图片描述

运行原理:

当执行MyBatis程序时,先加载指定的配置文件[加载映射文件],将配置文件中的数据及映射文件中数据转为输入流。
依赖配置文件和映射文件的数据流,生成1个SqlSessionFactory[类似数据库连接工厂对象]
通过SqlSessionFactory开启1个事务[获得1个数据库连接],然后执行相关的业务匿名对应的SQL。
最后,提交事务并关闭.。

配置文件

配置文件中主要 配置数据源[驱动类,URL,账号,密码],事务管理,加载指定映射文件。
注意:
1.MyBatis配置文件的名称和位置自定义.
2.MyBatis配置文件顶层结构必须参考相关说明,依次编写。

MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。 配置文档的顶层结构如下:
configuration(配置)
properties(属性)
settings(设置)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境配置)
environment(环境变量)
transactionManager(事务管理器)
dataSource(数据源)
databaseIdProvider(数据库厂商标识)
mappers(映射器)
配置文件格式
模板:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	<!-- 指定POJO类的匿名 -->
	<typeAliases>
		<package name="bean"/>
	</typeAliases>
	<!-- 数据库环境配置 -->
	<environments default="development">
		<environment id="development">
			<transactionManager type="JDBC" />
			<dataSource type="POOLED">
				<property name="driver" value="com.mysql.jdbc.Driver" />
				<property name="url" value="jdbc:mysql://localhost:3306/数据库名" />
				<property name="username" value="账号" />
				<property name="password" value="密码" />
			</dataSource>
		</environment>
	</environments>
	<!-- 加载映射文件 -->
	<mappers>
		<mapper resource="映射文件路径"/>
	</mappers>
</configuration>

environments(环境配置):
作用: 声明一组运行环境.[支持多数据库]
属性:
default: 设置默认运行环境,属性值为某个的id值

environment(环境变量):
作用: 定义1个运行环境
属性:
id: 设置当前环境的匿称,名称任意.通常为development和work.

transactionManager(事务管理器):
作用: 指定事务管理器,MyBatis含有2种事务管理器[JDBC和MANAGED]
属性:
type: JDBC[使用JDBC的提交和回滚设置],MANAGED[使用其他容器管理事务提交和回滚]

dataSource(数据源):
作用:该标签通过标准的JDBC数据源接口来配置JDBC连接对象的资源
属性:
type: 设置数据源的类型,属性值为POOLED|UNPOOLED|JNDI
POOLED: 使用连接池.从连接池中取出连接,关闭时将该连接放回连接池
UNPOOLED: 不使用连接池.每次都打开新连接,关闭时将彻底关闭该连接
JNDI: 从其他容器中获得连接

Property(属性):
作用:定义数据源的指定属性和值
属性:
name: 属性名.在中,name通常为driver/url/username/password或其他
value:属性值。

别名的定义:
在这里插入图片描述

数据源配置:
和之前学的JDBC连接数据库没什么区别,只是写在了配置文件中。
在这里插入图片描述

加载映射文件:
在这里插入图片描述

映射文件的编写:
MyBatis的映射文件主要用于定义业务操作命令,实现对象与数据表字段的映射,并控制对最终结果的封装.
注意:
1.映射文件名称和位置任意,不要求必须与POJO类在同一位置
2.MyBatis未提供源码和案例,配置和映射内容参考官网或使用指南.
3.MyBatis映射文件顶层结构,必须遵循标签相互的编写顺序.
格式:

<mapper namespace="命名空间">
	<select/insert/update/delete id="业务匿名" resultType="结果类型" parameterType="传入SQL中的数据类型">
		SQL命令
	</select/insert/update/delete>
</mapper>

说明:
1.namespace表示命名空间,作用类似于Java包的作用,区别不同位置业务.[在旧版中可以省略namespace,新版中必须编写]
2.id表示业务匿名,对应相关的SQL命令
3.resultType指定SQL命令执行结果的封装方式
4.parameterType指定传入到SQL命令中的数据的类型.[select * from t1 where name=??]
5.statementType含有: STATEMENT[静态SQL执行对象],PREPARED[默认值,支持带有占位符的SQL],CALLABLE[可执行存储过程的SQL执行对象]
6.SQL命令末尾后的分号,可选

占位符:
JDBC占位符: ?
MyBatis占位符: #{占位符名称} ${占位符名称}
说明:
1.若占位符的值来自普通对象,则占位符名称任意
2.若占位符的值来自POJO对象,则占位符名称必须为POJO的相关属性名
3.若占位符的值来自Map集合,则占位符名称必须为键名.

结果映射:
1.MyBatis自动将POJO对象的属性与查询结果集中字段名或添加/修改/删除中占位符名映射,实现对象与表的映射关系.
2.MyBatis提供了手动设置POJO对象属性与执行结果映射的方式: .
解决问题:
当查询结果集中字段名与对象属性名不同时,需要 手动映射 或 设置别名.

CURD操作:

  • 基于XML方式: CURD操作,实际使用的是SqlSession的方法{selectList(),insert(),delete()等等}
  • 基于Mapper接口: CURD操作,实际使用的Mapper接口中定义的方法[增删改查]

总结:Mapper接口方式,相对XML方式,新增了1个Mapper接口,CURD的方法来源不同.其他与之前基本 一致.[配置文件,映射文件]

Mapper接口定义:
1.mapper接口的类全名 必须与 映射文件的namespace属性值一致
2.mapper接口的方法名 必须与 映射文件的业务标签[比如,]的id值一致
3.mapper接口的方法参数类型 必须与 映射文件的业务标签的parameterType值一致
4.mapper接口的方法返回值类型 必须与 映射文件的业务标签的resultType值一致

Mapper接口作用:
MyBatis可以通过JDK动态代理,为Mapper接口生成实现类.在Java程序中,直接操作Mapper接口对象即可实现CURD操作.
[普通情况下是操作SqlSession的方法实现CURD]

MyBatis注释:
@insert @update @delete @select—>映射文件中<insert/update/delete/select>

模糊查询:
1.占位符: 占位符的值必须为整个模糊查询的条件. 比如: name like #{nameVal},nameVal必须为%张%. MyBatis会对占位符进行处理,在占位符值的外层,添加单引号包裹.
2.拼接符:
格式: ${拼接符名}
说明:
a.拼接符的值来自对象,拼接符名必须为对象的属性名
b.拼接符的值来自Map集合,拼接符名必须为Map集合的键名
c.拼接符的值来自普通数据,拼接符名必须value
MyBatis解析拼接符时,只会当做普通文件与其他内容进行拼接,不做其他处理.

动态SQL:

<if>:
作用: <if>用法类似Java中的if语句,选择性拼接指定SQL片段
格式:
<if test="条件">
//当条件为true时,将SQL片段拼接到该标签所在位置
</if>


<choose>,<when>,<otherwise>
作用: 用法类似Java的if else if 语句,用于多次判断,选择性拼接指定SQL片段.
格式:
	<choose>
		<when test="条件1">SQL片段1</when>
		<when test="条件2">SQL片段2</when>
			...
		<otherwise>默认SQL片段</otherwise>
	</choose>
说明:
	1.<choose>,<when>,<otherwise>不能单独使用,必须混合使用.
	2.<choose>中可以含有N个<when>,0或1个<otherwise>
	
	
	
<where>:
作用: <where>需要与<if>,<choose>,<when>,<otherwise>等配合使用,当至少有1个子标签的条		件为true时,<where>生成1个"where"关键字.若where后紧挨"AND/OR"时[where  and 条		件],<where>自动去除.
格式:
	<where>
		其他动态SQL标签
	</where>

	
<forEach>:
作用: <forEach>用于遍历集合,通常用于构建in语句中
格式:
	<select id="业务匿名" resultType="结果类型[类全名]" >
		select 字段列 from 表名 where 字段名 in 
		<foreach collection="集合" item="变量A" index="变量B" open="" separator="" 		close="">
		#{变量A}
		</foreach>
		</select>
说明:
1.collection属性值为集合类型的属性名. [Map键名[值为集合],list[parameterType为		  java.util.List],array[parameterType为java.util.ArrayList(数组)]]
2.item属性值为变量名,名称任意.该变量存放当前元素/键值
3.index属性值为变量名,名称任意.该变量存放当前元素索引/键名
4.open,separator,close属性值为符号,表示遍历开始/中间/结束时拼接的符号


<set>:
作用: <set>用于修改命令中,能够动态前置"set"关键字,同时可以删除多余的逗号.
格式: 
	<update id="业务匿名" resultType="int">
		update 表名
		<set>
			其他动态SQL标签或SQL片段
		</set>
	</update>

<sql>:
作用: <sql>在业务标签外,定义一个SQL片段,在其他业务标签中可以通过<include>引用该SQL片段
格式:
	<sql id="SQL片段匿名">
		SQL片段
	</sql>
说明:
	1.SQL片段内容可以是SQL语句的任何部分.
	2.<sql>标签对之间可以嵌套动态SQL标签,产生更加方便的SQL片段
	3.当需要引用SQL片段时,编写<include refid="SQL片段匿名">即可引用.

关联映射:
概念:
在以面向对象思想设计程序时,对象之间会产生关联引用.
比如学生与班级,学生对象含有班级类型的属性,此时就会引用班级对象.将对象之间的关联关系映射到数据库,称为关联映射.
如何体现关联映射:
1.对象之间发生关联关系[引用关系],定义对象时,定义为1个复合属性即可. 比如: Student{id,name,sex,age,className[ClassName className]} ClassName属于1个Java类.
2.数据库中,以表之间的关系体现 Java对象的关联关系. 表之间的关系: 外键

一对一:
一对一映射指在对象模型中,A对象与B对象相互一一对应.一对一对象关系模型在实际生活中比较常见,比如1个人对应1个身份证号,1个身份证号对应1个人
对象:
用户,身份证

方案1: 嵌套结果[关联查询]
在针对关联映射查询时,会涉及多个对象[表].通常采用合并查询,但是MyBatis只能自动将查询结果与对象的普通属性映射,无法自动映射POJO属性.因此,必须手动设置结果集中字段与属性的映射关系.

<resultMap type="user" id="one2oneMap1">
	<id column="id" property="id"/>
	<result column="name" property="name"/>
	<result column="sex" property="sex"/>
	<result column="age" property="age"/>
	<result column="address" property="address"/>
	<!-- association定义关联属性的映射 
	property: 关联属性的属性名
	-->
	<association property="idcard" javaType="IDCard">
		<id column="c_id" property="id"/>
		<result column="idcardNum" property="cardNum"/>
	</association>
</resultMap>

方案2: 嵌套查询[主查询和子查询]
在针对关联映射查询时,除了合并查询外,还可以通过嵌套查询实现关联查询.嵌套查询是指通过主查询的结果,执行其他查询得到所需数据.
映射文件配置:

多对一映射文件的配置和使用,与一对一或多对一的思路相同.
区别在于将<association> 更换为 <collection>

多对多:

1.多对多映射指在对象模型中,多个A对象引用多个B对象.多对多对象关系模型常见的有: 用户与角色,客户与商品等等.
2.多对多对象模型在操作和性能方面都不太理想,所以多对多映射较少使用.
3.实际中通过创建中间表,将1个多对多映射转为2个一对多映射.

总之,要想学好编程,需要的不仅仅是做好笔记,还得需要多练习实践。感谢阅读,祝你生活愉快。

可以加好友相互学习。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值