学习主题:mybatis
学习目标:
1 掌握typeAliases的作用
2 掌握mybatis如何传递参数
3 掌握mybatis对事务的管理
4 掌握mybatis的crud
5 掌握接口绑定
6 掌握接口绑定多参数的使用
7 掌握mybatis动态sql
8 掌握mybatis缓存
1.typeAliases标签配置别名
(1)typeAliases标签有什么作用? 如何使用?
答: 用于给java类型定义别名,方便在配置文件中使用。
<typeAliases>
<!-- typeAliases alias给User 起名为u -->
<!-- <typeAlias type="com.bjsxt.pojo.User" alias="u"/> -->
<!-- <typeAlias type="com.bjsxt.pojo.User"/> --> <!-- 不加alias代表别名默认为类名User -->
<package name="com.bjsxt.pojo"/> <!--只要在pojo包下,别名都默认为各自的类名 -->
</typeAliases>
(2)如何在MyBatis中为类型定义别名?
2.配置parameterType属性进行参数的传递
(1)配置parameterType属性进行参数的传递
答:
封装成对象:
<select id="sel" resultType="user" parameterType="user">
<!-- 如果参数是对象, 可以通过#{属性名}来获取 -->
select * from t_user where username=#{username} and password=#{password}
</select>
@Test
public void sel() throws IOException {
InputStream is = Resources.getResourceAsStream("mybatis-t.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
SqlSession session = factory.openSession();
User u = new User();
u.setUsername("zhangsan");
u.setPassword("123");
User user =session.selectOne("com.bjsxt.mapper.UserMapper.sel", u);
System.out.println(user);
session.close();
}
封装成Map
<!-- 封装成Map -->
<select id="selMap" resultType="user" parameterType="user">
<!-- 如果参数类型是map,则通过#{key}获取 -->
select * from t_User where username= #{uname} and password =#{pasd}
</select>
@Test
public void selMap() throws IOException {
InputStream is = Resources.getResourceAsStream("mybatis-t.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
SqlSession session = factory.openSession();
Map<String,String> map = new HashMap<>();
map.put("uname", "lisi");
map.put("pasd", "123");
User user =session.selectOne("com.bjsxt.mapper.UserMapper.sel",map);
System.out.println(user);
session.close();
}
(2)通过parameterType属性实现参数传递是有哪些注意事项?
答:
1、如果执行的是条件查询,需要在调用方法时传参数进来,此时,可以在select 标签中通过parameterType属性指定参数的类型,而在SQL语句中,可以通过#{} 的方式获取参数
2、一个参数的查询根据id查询用户信息,当只有一个参数时,#{}中可以任意填写
3、多个参数的查询,多个参数床底时,由于sqlSession中提供的查询方法只允许传入一个参数,因此可以对多个参数进行封装,可以使用对象或Map集合
3.MyBatis事务管理_工具类提取_实现新增操作****
(1)MyBatis中如何管理事务?
答:
1、事务是数据库操作的最小单元, 有 ACID 的特性. 应该保
证一个事务的的 SQL 语句要么同时成功, 要么都不成功.
2、MyBatis 中配置了事务管理器, type 属性设置为 JDBC.
表示 MyBatis 采用和原生 JDBC 相同的事务管理机制.
3、在 MyBatis 执行的开始时,将自动提交功能关闭了.所以,
在执行 DML 操作时, 需要手动提交事务.
(2)为什么增删改标签没有resultType属性?
答: 由于DML 操作的返回值都是 int 类型, 所以, 不需要定义resultType属性。
4.MyBatis执行更新操作和删除操作
(1)创建学生表, 字段有id, name, age, birthday, regTime(注册时间), loginTime(登录时间). 完成以下功能:
- 实现学生的注册功能, 记录注册时间;
- 完成登录功能, 登录时要求能修改登录时间;
5.MyBatis接口绑定方案
(1)什么是接口绑定?
答: MyBatis中,提供了一套接口绑定方案。程序员可以提供一个接口,然后 提供对应接口的一个mapper.xml文件。MyBatis会自动将接口和xml文件进 行绑 定。实际上就是MyBatis会根据接口对应的xml文件创建接口的实现 类。换言之, 就是可以得到接口类型的对象,方便方法的调用。
(2)接口绑定的实现需要满足那些条件?
答: 1、xml文件名要和接口名一致
2、namespace属性必须为接口的全限定路径
3、id属性必须和接口对应的方法名一致
6.接口绑定解决多参数传递问题_@Param注解的使用
(1)MyBatis中#{}和${}的区别是什么?*
答:
- #{}可以通过 索引#{0}(mybatis下标是从0开始),#{param1}获取第一个参数;若是只传入一个参数,可以通过#{}直接获取
- 如果传入参数类型是对象,需要在#{}中写入对象属性名;如果传入参数类型是Map集合名,需要在#{}中写入键名;来获取对应的参数
主要区别:
-
使用#{}时,mybatis中的sql语句会被预编译处理(此时低层应该使用的是PreparedStatement对象?),即会先将sql中的#{}用占位符?替代,并编译。
然后该sql语句在获取参数时,会调用PreparedStatement的set方法来赋值。即#{}是预编译处理。 -
使用时,mybatis会直接将{}时,mybatis会直接将时,mybatis会直接将{}获得的参数值和替换,就是把{}替换,就是把替换,就是把{}替换成变量的值(在编译阶段就已经替换了)。即${}是字符串替换
当想直接在SQL语句中插入一个不改变的字符串。比如,像ORDER BY,你可以这样来使用:ORDER BY KaTeX parse error: Expected 'EOF', got '#' at position 20: …umnName}一般来说能使用#̲{}尽量使用#{} #{}…{}无法防止SQL注入
(2)@Param注解有什么作用?*
答: 参数中使用@Param 注解设定参数名用于在 SQL 语句中使用
7.MyBatis的动态SQL概述
(1)什么是动态SQL? 有什么作用?
答: 根据条件的不同,SQL语句也会随之动态的改变。
可以解决条件串联SQL字符串在一起的复杂情况,减少代码量
(2)动态SQL常用的标签有哪些?
1、<if>
2、<where>
3、<choose> <when> <otherwise>
4、<set>
5、<trim>
6、<bind>
8.动态SQL_if_where
(1)if标签的作用是什么? 怎么使用?
答: 用于进行条件判断, test 属性用于指定判断条件. 为了拼接
条件, 在 SQL 语句后强行添加 1=1 的恒成立条件.
<select id="sel" resultType="user">
select * from t_user where 1=1
<if test="username != null and username != ''">
and username=#{username}
</if>
<if test="password != null and password != ''">
and password=#{password}
</if>
</select>
(2)where标签的作用是什么? 怎么使用?
答: 用于管理 where 子句. 有如下功能:
a)如果没有条件, 不会生成 where 关键字
b)如果有条件, 会自动添加 where 关键字
c)如果第一个条件中有 and, 去除之
<select id="sel" resultType="user">
select * from t_user
<where>
<if test="username != null and username != ''">
and username=#{username}
</if>
<if test="password != null and password != ''">
and password=#{password}
</if>
</where>
</select>
9.动态SQL_choose_when_otherwise_set
(1)choose/when/otherwise什么时候使用?
答:
<select id="sel" resultType="user">
select * from t_user
<where>
<choose>
<when test="username != null and username != ''">
and username = #{username}
</when>
<when test="password != null and password != ''">
and password = #{password}
</when>
<otherwise>
and 1=1
</otherwise>
</choose>
</where>
</select>
(2)set标签有什么作用?
答: 用于维护 update 语句中的 set 子句. 功能如下:
a)满足条件时, 会自动添加 set 关键字
b)会去除 set 子句中多余的逗号
c)不满足条件时, 不会生成 set 关键字
10.动态SQL_trim_bind
(1)trim标签的作用是什么? 如何使用?
答: 用于在前后添加或删除一些内容
a)prefix, 在前面添加内容
b)prefixOverrides, 从前面去除内容
c)suffix, 向后面添加内容
d)suffixOverrides, 从后面去除内容
(2)bind标签怎么使用? 有什么作用?
答:用于对数据进行再加工, 用于模糊查询
<select id="sel" resultType="user">
select * from t_user
<where>
<if test="username!=null and username!=''">
<bind name="username" value="'%' + username + '%'"/>
and username like #{username}
</if>
</where>
</select>
11.动态SQL_foreach_sql_include
(1)foreach标签的作用是什么? 如何使用?
答: 用于在 SQL 语句中遍历集合参数, 在 in 查询中使用
a)collection: 待遍历的集合
b)open: 设置开始符号
c)item: 迭代变量
d)separator: 项目分隔符
e)close: 设置结束符号
<select id="selIn" parameterType="list" resultType="user">
select * from t_user where id in
<foreach collection="list" open="(" separator="," close=")"item="item">
#{item}
</foreach>
</select>
List<User> selIn(@Param("list") List<Integer> list);
(2)sql/include标签的作用是什么?
答: 用于提取 SQL 语句, 用于引用 SQL 语句
<sql id="mySql">
id, username, password
</sql>
<select id="selIn" parameterType="list" resultType="user">
select
<include refid="mySql"/>
from t_user where id in
<foreach collection="list" open="(" separator="," close=")"item="item">
#{item}
</foreach>
</select>
12.MyBatis的缓存机制
(1)什么是缓存? 有什么好处?
答: a)缓存用于提高查询的效率.
b)MyBatis的缓存是使用SQL标签的ID作为缓存的唯一标识
的. 执行相同的标签可以使用缓存. 不同的标签不能使用缓存.
c) MyBatis 中有两种缓存机制.
(2)MyBatis的缓存有哪些分类? 分别怎么实现?
答:
1、 一级缓存
a)默认开启. 线程级别的缓存, SqlSession 的缓存
b)在一个 SqlSession 生命周期中有效. SqlSession 关闭,缓存清空.
2、二级缓存
a)进程级别的缓存, SqlSessionFactory 的缓存
b)在一个 SqlSessionFactory 生命周期中有效.可以在多个SqlSession 生命中期中共享.
c)默认关闭, 需要使用的时候, 要为某个命名空间开启二级
缓存(在 mapper.xml 中配置).