MyBatis

本文详细介绍了MyBatis的事务管理,包括如何关闭自动提交以及事务的ACID特性。同时,讲解了动态SQL的使用,如if、where、choose等标签,以及如何通过@Param注解解决多参数传递问题。此外,还探讨了MyBatis的缓存机制及其分类。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

学习主题: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(登录时间). 完成以下功能:

  1. 实现学生的注册功能, 记录注册时间;
  2. 完成登录功能, 登录时要求能修改登录时间;

5.MyBatis接口绑定方案

(1)什么是接口绑定?
答: MyBatis中,提供了一套接口绑定方案。程序员可以提供一个接口,然后 提供对应接口的一个mapper.xml文件。MyBatis会自动将接口和xml文件进 行绑 定。实际上就是MyBatis会根据接口对应的xml文件创建接口的实现 类。换言之, 就是可以得到接口类型的对象,方便方法的调用。

(2)接口绑定的实现需要满足那些条件?
答: 1、xml文件名要和接口名一致
2、namespace属性必须为接口的全限定路径
3、id属性必须和接口对应的方法名一致

6.接口绑定解决多参数传递问题_@Param注解的使用

(1)MyBatis中#{}和${}的区别是什么?*

答:

  1. #{}可以通过 索引#{0}(mybatis下标是从0开始),#{param1}获取第一个参数;若是只传入一个参数,可以通过#{}直接获取
  2. 如果传入参数类型是对象,需要在#{}中写入对象属性名;如果传入参数类型是Map集合名,需要在#{}中写入键名;来获取对应的参数

主要区别:

  1. 使用#{}时,mybatis中的sql语句会被预编译处理(此时低层应该使用的是PreparedStatement对象?),即会先将sql中的#{}用占位符?替代,并编译。
    然后该sql语句在获取参数时,会调用PreparedStatement的set方法来赋值。即#{}是预编译处理。

  2. 使用时,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 中配置).

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值