小白一枚,写博客记录自己的学习历程,也希望能帮助到你。这篇文章总结一下我的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个一对多映射.
总之,要想学好编程,需要的不仅仅是做好笔记,还得需要多练习实践。感谢阅读,祝你生活愉快。
可以加好友相互学习。