总结
Mybatis是一款优秀的持久层框架,利用OPM思想实现了数据库持久化操作
也有人吧mybatis称之为半自动化的ORM映射框架
目录
1.ORM思想
对象关系映射,是一种程序设计技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换
。从效果上说,它其实是创建了一个可在编程语言里使用的“虚拟对象数据库”。
关系映射:
1.对象映射--映射表
2.对象中有属性--表中有字段
总结:以对象的方式操作数据库
1. JDBC 方式完成入库操作
insert into xxxx(字段名称) values (字段的值…)
select * from xxxxx 结果集需要自己手动封装为对象 (繁琐)
2. ORM方式实现入库
userDao.insert(对象)
3. ORM方式的查询
List userList = userDao.selectList(对象);
2.简化sql语句
mybatis.xml配置别名包
<typeAliases> <package name="包名"/> </typeAliases><!--说明:
1.如果配置了别名包: 则映射时会自动的拼接包路径
2. include refid="引用SqlID"
-->
<select id="findUser" resultType="User">
select <include refid="user_cloumn"/> from demo_user
</select>
<!--2.简化Sql-->
<sql id="user_cloumn">
id,name,age,sex
</sql>
3.mybatis的集合操作
知识点: 如果遇到集合参数传递,需要将集合遍历
标签: foreach 循环遍历集合
标签属性说明:
1.collection 表示遍历的集合类型
1.1 数组 关键字 array
1.2 List集合 关键字 list
1.3 Map集合 关键字 Map中的key
2. open 循环开始标签
close 循环结束标签 包裹循环体
3. separator 分割符
4. item 当前循环遍历的数据的变量
4.动态Sql语句
核心思想: 自动判断是否为null,
如果为null,该字段不参与sql
动态Sql规则:
1. <if test="写判断条件,可以直接获取属性值"></if>
true: 会拼接 字段条件
false: 不会拼接字段条件
2. 多余的关键字
由于动态sql拼接必然会导致多余的and 或者 or
3. where-if where标签说明 可以去除 where后边多余的and 或者 or,
set-if set标签去除多余逗号
5.动态sql分支
<choose>
<when test="name !=null">
name = #{name}
</when>
<when test="age !=null">
age = #{age}
</when>
<otherwise>
sex = #{sex}
</otherwise>
</choose>
6.mybatis映射文件
xxxmapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace是mybaits映射文件的唯一标识,与接口对应-->
<mapper namespace="mapper接口路径">
sql...
</mapper>
7.mybatis配置文件
mybatis.xml
<?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>
<settings>
<!--开启驼峰映射规则-->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<typeAliases>
<package name="别名包路径"/>
</typeAliases>
<!--环境配置标签
mybatis支持多个数据源的配置,default="默认连接数据源"
-->
<environments default="development">
<!--编辑开发环境-->
<environment id="development">
<!--mybatis 采用jdbc的方式控制数据库事务. -->
<transactionManager type="JDBC"/>
<!--
type="POOLED" 创建一个数据源链接池,每次从池中获取链接.
-->
<dataSource type="POOLED">
<!--版本信息:
如果数据源采用5.x的版本 value:com.mysql.jdbc.Driver
如果数据源采用8.x的版本 value:com.mysql.cj.jdbc.Driver
-->
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/jt?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true"/>
<property name="username" value="用户名"/>
<property name="password" value="密码"/>
</dataSource>
</environment>
</environments>
<!--Mybatis加载Mapper映射文件-->
<mappers>
<mapper resource="mybatis映射文件路径"/>
<!-- 使用注解时 mybatis需要管理mapper的接口
注解开发只适用于单表CRUD操作,涉及到复杂标签where set foreach等标签不适用 -->
<mapper class="xxx.xxx.Mapper"></mapper>
</mappers>
</configuration>
8.resultType 和resultMap
resultType:要求对象的属性名称与表中的字段一一对应,适合单表映射,属性名一致
resultMap:表中字段与属性名称不一致
<select id="findAll" resultMap="dogRM">
select * from dog
</select>
<!--
id: rm的唯一标识 type:封装之后的POJO对象
-->
<resultMap id="dogRM" type="com.jt.pojo.Dog">
<!--1.标识主键-->
<id column="dog_id" property="dogId"/>
<!--2.映射其它属性-->
<result column="dog_name" property="dogName"/>
</resultMap>
</mapper>
9.Mybatis中有2级缓存
一级缓存 SqlSession 在同一个sqlSession内部 执行多次查询 缓存有效. 一级缓存默认开启状态.
二级缓存 SqlSessionFactory级别. 利用同一个工厂,创建的不同的SqlSession 可以实现数据的共享(缓存机制). 二级缓存默认也是开启的.
如果需要使用一级/二级缓存,则POJO对象必须实现序列化接口. 否则数据不可以被缓存.