Mybatis-三大框架整合
Mybatis Day01
一、 Mybatis介绍:
Mybatis属于一款优秀的数据持久层框架
回顾JDBC缺点:
1. 需要频繁的开关数据库连接
2. 查询数据的结果集需要人为进行封装
3. Jdbc没有缓存
4. Sql语句写在Java文件中
Mybatis:
1. 内置数据库连接池
2. 会自动进行结果集的封装
3. 有缓存
4. Sql语句写在配置文件中
导入DTD约束文件:
1. 复制配置文件中 约束的网址:
2. 添加约束文件
Mybatis入门案例:
1. 导入jar
2. 添加配置文件2个+1个log4j的配置文件
修改sqlMapConfig(Mybatis的核心配置文件)
里面目前只有两部分信息:1.数据源2.mapper位置
a.数据源:要保证本地数据库打开包含所连接的数据库
b.mapper:指定mapper配置文件的位置,注意:用/进行分割
3. Mapper配置文件:
包含sql语句 和一个命名空间(表示配置文件的唯一标示)
4. 测试代码:
步骤:输入流-》会话工厂-》会话对象-》执行sql语句
二、 增删改查练习
1.查询单个对象
Mapper配置:
代码:
3. 新增数据
Mapper配置:
代码:
4. 删除数据
Mapper配置文件:
代码:
5. 修改操作:
配置文件
代码:
三、 取值符号
1.#{变量名称}:会加引号,并且有预编译效果,能用#取值就用#号 实在不行的场景才用${}
2.${变量名称}:不会加引号直接拼接到sql语句中,当传递过来的变量值为字段名称时或者为sql语句的一部分时(如:升序 降序)必须使用此方式。
如果使用$取值 需要把值放到Map中配合使用
四、 Mybatis的单值传递和多值传递
Mybatis中只支持传一个参数的方法 , 传递多个参数的时候可以把参数放到对象中或放到map中,单值传递的时候,取值的地方参数名可以任意
多值传递练习
代码调用:
五、 sql语句的复用
声明复用的sql
引入复用sql
六、 别名标签
当resultType赋值写错会报以下错误
如果包名+类名比较长的话,出错概率会很大 所以可以使用别名。
在核心配置文件声明别名:
注意:需要添加 config的约束文件,并且书写时只有写完<type时才会有提示
如何使用:
七、 动态更新
当进行数据库数据修改的时候,有时只需要修改表中的某几个字段,其它字段保持原有值不变,这时就需要用到动态更新,不然会出现其它值为null的问题
配置文件:
代码调用:
八、 动态查询
当查询数据需要多个查询条件,但是不一定每个条件都有值的时候,需要用到动态查询,不然会出现要满足其余条件为null的 判断
配置文件:
Where可以去掉前面多余的and
代码:
九、 动态插入
配置文件:
代码调用:
十、 批量删除
2种情况
1. 数组里面装id
代码:
2. List集合里面添加User对象
配置:
调用代码:
==============================================================
===============================================================
Day08Mybatis
课程回顾:
一、 MyBatis的接口形式:
注意两点:
1. 在UserMapper.xml中的nameSpace需要和创建的UserMapper类对应好
2. UserMapper接口中的方法名要和UserMapper配置文件中的一致、
Spring和Mybatis整合
1. jar包 Spring第五天的jar包和Mybatis的jar包放到一起 加 mybatis-spring-1.2.0.jar(Mybatisday02 的课前资料中) 即可
2. 配置文件 Spring中 在原有基础上(day05配置文件基础上)加2个bean(会话工厂和接口扫描器) 会话工厂中(注入:1.数据源2.核心配置文件3.映射配置文件) 扫描器中(注入:mapper接口类所在的包名)
3. Mybatis配置文件中删除所有
二、 MyBatis的缓存:
分为一级缓存和二级缓存:
1. 一级缓存 是 共享同一session内部的数据
2. 二级缓存 是 共享同一个sqlSesstionFactory内部的数据
注意:默认的二级缓存是关闭的 需要要在配置文件中进行配置打开
a. 在核心配置文件中开启二级缓存的总开关
b. 在指定mapper.xml中进行配置
c. 必须让缓存的对象实现序列化接口
补充说明:缓存的数据 当数据库被修改之后 会被清楚,下次查询会再次查询数据库
2级缓存补充:二级缓存的数据只有当session会话 关闭的时候才把查询的数据缓存起来
三、 手动封装结果集
如果实体中的属性名称和数据库表中的字段名称不一致时则自动注入失败
自动注入的字段值要和set方法去掉set后剩下的内容一致 (如字段名是userName则set方法名为 setUserName 就可以注入成功,不管属性名是什么)
四、 多表关系
1. 一对一 :一夫一妻制
2. 一堆多:皇帝 一对 后宫佳丽3000
3. 多对多:动物世界
五、 一对一
Sql语句:
ResultMap配置:
注意:一对一查询中 ,主表可以讲非主键的进行自动注入(要保证表字段和属性名称一致),主键必须手动注入数据,从表 不能自动注入
六、 一对多
多表查询时 结果集中不能有重名的字段 不然没有办法进行结果集的封装
1对多 2张表联查
Sql语句:
Java代码:
Mapper映射文件:
1对多 三张表联查
七、 多对多
1. 查询老师下面所有的学生
2. 查询学生下面所有的老师
如果添加一个新的Teacher实体 针对这个实体进行数据查询的时候需要做的事儿:
1.创建TeacherMapper接口
2.创建TeacherMapper.xml映射文件 在映射文件里 把nameSpace改成 cn.tedu.mapper.TeacherMapper
3.在TeacherMapper.xml映射文件中写sql语句 在接口类中创建和sql语句id一致的方法名
4.在核心配置文件中 添加teacherMapper.xml的引入
注意:需要有三张表
Sql语句和mapper配置:
<resultMap type="cn.tedu.pojo.Student" id="studentRM">
<id column="sid" property="id"/>
<result column="sname" property="name"/>
<collection property="teachers" ofType="cn.tedu.pojo.Teacher">
<id column="tid" property="id"/>
<result column="tname" property="name"/>
</collection>
</resultMap>
<select id="findAllStudents" resultMap="studentRM">
SELECT s.id sid,s.name sname,t.`id` tid,t.`name` tname FROM
(SELECT * FROM
student s
LEFT JOIN
t_s ts
ON
s.`id`=ts.`sid`) s
LEFT JOIN
teacher t
ON
s.tid=t.`id`
</select>
八、 三大框架整合
1. web.xml改动:不仅仅引入SpringMVC的核心配置 也引入Spring的核心配置文件
2. Mybatis核心配置 删除所有的 但是文件留着 以后会用到
3. 在Spring核心中添加sql会话工厂的配置
<!-- 配置sql会话工厂 -->
<bean class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 配置数据源 -->
<property name="dataSource" ref="dataSource"></property>
<!-- 引入Mybatis的核心配置文件 -->
<property name="configLocation"
value="classpath:/sqlMapConfig.xml"></property>
<!-- 引入所有的Mapper配置文件 -->
<property name="mapperLocations"
value="classpath:/cn/tedu/pojo/*.xml"></property>
</bean>
4. 在Spring核心中配置Mapper接口的扫描器
<!-- 配置mapper接口扫描器 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="cn.tedu.mapper"></property>
</bean>
补充:在web工程中如果访问src路径下面的内容 需要在文件名称前面加上classpath:/ 如:classpath:/jdbc.properties