MyBatis3(动态SQL 常用的动态SQL 元素 映射器注解 基本注解 结果映射注解)

目录

一、动态SQL

常用的动态SQL 元素 

二、if元素

三、choose 、when 、otherwise 元素

四、trim 、where 、set 元素

trim(不常用)

where

 set

五、foreach 元素

六、bind 元素 

#{} ${} 区别

示例完整代码

七、映射器注解

八、基本注解

@Insert 新增

主键回填 

主键自增 

@Delete 删除

@Update 更新

@Selete 查询 

传递多个参数的方式: 

九、结果映射注解

@Results 结果映射

一对一映射 

一对多映射

示例完整代码 


一、动态SQL

  • 定义:根据不同条件拼接SQL 语句,实现对数据库更准确的操作;
  • 实现:映射器配置文件或者注解。

常用的动态SQL 元素 

  • if 元素:判断语句,单条件分 支判断.
  • choose 元素 (when,otherwise): 多条件分支判断,等 同于java 的 switch.
  • trim (where,set): 辅助元素,用于处理一些 SQL 拼接的问题.
  • foreach 元素 :循环语句,在in 语 句等列举条件常用
  • bind 元素 :自定义上下文变量, 传递参数.

二、if元素

语法: 

语法
< if  test =”条件”> 满足条件的语句 </ if>

注意:拼接SQL 语句的时候注意AND 和逗号。

实现:

Student.java 下面所需要的bean同这个一样

public class Student {
 
	//属性 对应 数据库中的字段 ---名字一致 类型一致
	//长像相似就行
	private int sid;
	private String sname;
	private Date birthday;
	private String ssex;
	private int classid;
	
	//1:1外部属性
	private Banji bj;
 
     get/set 方法 
     构造方法省略。。。
}

StudentMapper.java

// 查询
	public List<Student> findStudent(Student s);

StudentMapper.xml

<!-- OGNL 对象图导航语言 属性 运算符 逻辑 字符串增强 == -->

	<!-- test中的表达式成立 就把if标签里面的字串拼接 -->
	<select id="findStudent" resultType="student" parameterType="student">
		select * from student where 1=1
		<if test="ssex != null">
			and ssex=#{ssex}
		</if>
		<if test="classid != 0">
			and classid=#{classid}
		</if>
	</select>

测试:

    SqlSession sqlSession = DaoUtil.getSqlSession();

	StudentMapper stuMapper = sqlSession.getMapper(StudentMapper.class);
    Student s = new Student();
		s.setClassid(1);
//		s.setSsex("男");
//		s.setSname("zkt");
//		s.setSid(1);

		List<Student> slist = stuMapper.findStudent(s);
		slist.forEach(System.out::println);
		DaoUtil.closeResource(sqlSession);

三、choose 、when 、otherwise 元素

为什么用choose 元素 

  • 01.场景1 当新闻编号不为空,则只用新闻编号作为查询条件;
  • 02.场景2 当新闻编号为空,而新闻标题不为空,则用新闻 标题作为条件进行模糊查询
  • 03.场景3 当新闻编号和新闻标题都为空,则要求新闻作者 不能为空

语法:

语法:
<choose>  
<when test=“条件”>满足条件的语句</ when>
 <otherwise> 满足其他条件的语句<otherwise>
 </choose>

choose 类似于switch 只要满足条件只走一个

注意:拼接SQL 语句的时候注意AND 和逗号。 

实现:

StudentMapper.java

public List<Student> findStudentChoose(Student s);

StudentMapper.xml

<select id="findStudentChoose" resultType="student" parameterType="student">
		select * from student 
		<where>
			<choose>
				<when test="sname != null">
					and sname = #{sname}
				</when>
				<when test="ssex != null">
					and ssex = #{ssex}
				</when>
				<otherwise>and sid > 10 </otherwise>
			</choose>
		</where>
	</select>

测试:

SqlSession sqlSession = DaoUtil.getSqlSession();

		StudentMapper stuMapper = sqlSession.getMapper(StudentMapper.class);

		Student s = new Student();
		s.setClassid(1);
//		s.setSsex("男");
//		s.setSname("zkt");
//		s.setSid(1);

		List<Student> slist = stuMapper.findStudentChoose(s);

		slist.forEach(System.out::println);

		DaoUtil.closeResource(sqlSession);

四、trim 、where 、set 元素

trim(不常用)

语法:

语法:
<trim   prefix = “”suffixOverrides = “” prefixOverrides=“”suffix=“”></trim>

 prefix 需要拼接的子句,可以是where,or 或者set;
 suffixOvrrides 忽略通过管道分隔的文本序列后缀。一般不与prefixOvrrides 同时使用
 prefixOvrrides 忽略通过管道分隔的文本序列前缀。一般不与suffixOvrrides 同时使用



实现:

StudentMapper.java

public List<Student> findStudentTrim(Student s);

StudentMapper.xml

<!-- trim 万能标签
		prefix 开始添加一个什么
		prefixOverrides 开始去掉一个什么
		suffix 结束添加一个什么
		suffixOverrides 结束去掉一个什么
	 -->
	 <select id="findStudentTrim" parameterType="student" resultType="student">
	 	select * from student 
	 	<trim prefix=" where " prefixOverrides="and" >
	 		<if test="ssex != null"> and ssex= #{ssex}</if>
			<if test="classid != 0"> and classid = #{classid}</if>
	 	</trim>
	 </select>

测试:

SqlSession sqlSession = DaoUtil.getSqlSession();

		StudentMapper stuMapper = sqlSession.getMapper(StudentMapper.class);

		Student s = new Student();
		s.setClassid(1);
		s.setSsex("男");
//		s.setSname("zkt");
//		s.setSid(1);

		List<Student> slist = stuMapper.findStudentTrim(s);

		slist.forEach(System.out::println);

		DaoUtil.closeResource(sqlSession);


实现:

StudentMapper.java

public int addStudent(Student s);

StudentMapper.xml

 <insert id="addStudent" parameterType="student">
	 	insert into  student 
	 	<trim prefix="(" suffix=")" suffixOverrides=",">
	 		<if test="sid != 0"> sid,</if>
	 		<if test="sname != null"> sname,</if>
	 		<if test="birthday != null"> birthday,</if>
	 		<if test="ssex != null"> ssex,</if>
	 		<if test="classid != 0"> classid,</if>
	 	</trim>
	 	values
	 	<trim prefix="(" suffix=")" suffixOverrides=",">
	 		<if test="sid != 0"> #{sid},</if>
	 		<if test="sname != null"> #{sname},</if>
	 		<if test="birthday != null"> #{birthday},</if>
	 		<if test="ssex != null"> #{ssex},</if>
	 		<if test="classid != 0"> #{classid},</if>
	 	</trim>
	 </insert>

<update id="updateStudentTrim" parameterType="student">
			update student
			<trim prefix="set " suffixOverrides=",">
				<if test="sname != null">sname = #{sname},</if>
				<if test="birthday != null">birthday = #{birthday},</if>
				<if test="ssex != null">ssex = #{ssex},</if>
				<if test="classid != 0">classid = #{classid},</if>
			</trim>
			where sid = #{sid}
	</update>

测试:

SqlSession sqlSession = DaoUtil.getSqlSession();

		StudentMapper stuMapper = sqlSession.getMapper(StudentMapper.class);

		Student s = new Student();
		s.setClassid(1);
		s.setSsex("男");
		s.setSname("zkt");
		s.setSid(1);

//		int ret = stuMapper.updateStudentSet(s);
		int ret = stuMapper.addStudent(s);

		if (ret > 0) {
			sqlSession.commit();
			System.out.println("成了");
		} else {
			sqlSession.rollback();
			System.out.println("凉了");
		}

		DaoUtil.closeResource(sqlSession);

where

语法:

语法:
<where>
 <if  test =”条件”> 满足条件的语句 </if>
 </where>

说明:where 元素只会在至少有一个子元素的 条件返回SQL 子句的情况下才去插入 “WHERE”子句。而且,若语句的开头为 “AND”或“OR”,where 元素也会将它们去除。

实现:

StudentMapper.java

	public List<Student> findStudentWhere(Student s);

StudentMapper.xml

<!-- where标签 
		1.添加一个where关键词 
		2. 去掉where后的第一个and 
		3.当没where标签中没有任何成立的字串时 什么也不添加 -->
	<select id="findStudentWhere" resultType="student" parameterType="student">
		select * from student
		<where>
			<if test="ssex != null">
				and ssex=#{ssex}
			</if>
			<if test="classid != 0">
				and classid=#{classid}
			</if>
		</where>
	</select>

测试:

SqlSession sqlSession = DaoUtil.getSqlSession();

		StudentMapper stuMapper = sqlSession.getMapper(StudentMapper.class);

		Student s = new Student();
		s.setClassid(1);
		s.setSsex("男");
//		s.setSname("zkt");
//		s.setSid(1);

		List<Student> slist = stuMapper.findStudentWhere(s);

		slist.forEach(System.out::println);

		DaoUtil.closeResource(sqlSession);

 set

语法:

语法:
<set>
 <if  test =”条件”> 满足条件的语句 </if>
 </set>

说明:set 标签元素主要是用在更新操作的时候, 它的主要功能和where 标签元素其实是差不 多的,主要是在包含的语句前输出一个set, 然后如果包含的语句是以逗号结束的话将会 把该逗号忽略,如果set 包含的内容为空的 话则会出错。有了set 元素就可以动态的更 新那些修改了的字段。 

实现:

StudentMapper.java

public int updateStudentSet(Student s);

StudentMapper.xml

	<update id="updateStudentSet" parameterType="student">
			update student
			<set>
				<if test="sname != null">sname = #{sname},</if>
				<if test="birthday != null">birthday = #{birthday},</if>
				<if test="ssex != null">ssex = #{ssex},</if>
				<if test="classid != 0">classid = #{classid}</if>
			</set>
			where sid = #{sid}
	</update>

测试:

SqlSession sqlSession = DaoUtil.getSqlSession();
		StudentMapper stuMapper = sqlSession.getMapper(StudentMapper.class);
		
		Student s = new Student();
//		s.setSsex("男");
		s.setClassid(2);
		s.setSid(19);
		s.setSname("zkthah");
		
		int ret = stuMapper.updateStudentSet(s);
		if (ret > 0) {
			System.out.println("成功");
			sqlSession.commit();
		} else {
			System.out.println("失败");
			sqlSession.rollback();
		}
		DaoUtil.closeResource(sqlSession);

五、foreach 元素

语法:

语法:
<foreach   item = “”index=“” collection=“” open=“” separator=“” close=“”>
 </foreach>

 item 循环中的当前元素;
index 当前循环元素的位置下标;
collection 方法传递的参数,一个数组或者集合;
close 以什么符号结束将这些集合元素包装起来;
open 以什么符号开始将这些集合元素包装起来;
separator 各个元素的间隔符号。

参数是数组

实现:

StudentMapper.java

public List<Student> findStudentArray(int[] arr);

StudentMapper.xml

 <select id="findStudentArray" resultType="student" >
	 	select * from student
	 	<where>
	 		<foreach collection="array" item="x" open=" sid in(" close=")" index="i" separator=",">
	 			#{x}
	 		</foreach> 
	 	</where>
	 </select>

测试:

SqlSession sqlSession = DaoUtil.getSqlSession();

		StudentMapper stuMapper = sqlSession.getMapper(StudentMapper.class);

		int[] arr = { 1, 2, 3, 4, 5, 6, 7 };
		List<Student> slist = stuMapper.findStudentArray(arr);

		slist.forEach(System.out::println);

		DaoUtil.closeResource(sqlSession);


参数是ArrayList

实现:

StudentMapper.java

	public List<Student> findStudentList(List<Integer> sidList);

StudentMapper.xml

<select id="findStudentList" resultType="student" >
	 	select * from student
	 	<where>
	 		<foreach collection="list" item="x" open=" sid in(" close=")" index="i" separator=",">
	 			#{x}
	 		</foreach> 
	 	</where>
	 </select>

测试:


SqlSession sqlSession = DaoUtil.getSqlSession();

		StudentMapper stuMapper = sqlSession.getMapper(StudentMapper.class);

        List<Integer> sidlist = new ArrayList<Integer>();
		sidlist.add(1);
		sidlist.add(2);
		sidlist.add(3);
		sidlist.add(4);
		sidlist.add(5);
		List<Student> slist = stuMapper.findStudentList(sidlist);

		slist.forEach(System.out::println);

		DaoUtil.closeResource(sqlSession);


批量增加

实现:

StudentMapper.java

// 批量增加
	public int addStudentList(List<Student> stuList);

StudentMapper.xml

<insert id="addStudentList" >
		insert into student (sname,birthday,ssex,classid)
		values
		<foreach collection="list" item="stu" separator=",">
			(#{stu.sname},#{stu.birthday},#{stu.ssex},#{stu.classid})
		</foreach>
	</insert>

测试:

SqlSession sqlSession = DaoUtil.getSqlSession();

		StudentMapper stuMapper = sqlSession.getMapper(StudentMapper.class);

		Student s1 = new Student();
		s1.setBirthday(new Date());
		s1.setClassid(1);
		s1.setSname("刘备");
		s1.setSsex("男");

		Student s2 = new Student();
		s2.setBirthday(new Date());
		s2.setClassid(2);
		s2.setSname("小乔");
		s2.setSsex("女");

		Student s3 = new Student();
		s3.setBirthday(new Date());
		s3.setClassid(2);
		s3.setSname("曹操");
		s3.setSsex("男");

		List<Student> stulist = new ArrayList<Student>();
		stulist.add(s1);
		stulist.add(s2);
		stulist.add(s3);

		int ret = stuMapper.addStudentList(stulist);

		if (ret == stulist.size()) {
			sqlSession.commit();
			System.out.println("成了");
		} else {
			sqlSession.rollback();
			System.out.println("凉了");
		}

		DaoUtil.closeResource(sqlSession);

六、bind 元素 

定义一个变量

语法:

语法:
<bind   name=“”value=“_parameter”>
 </bind>

name 自定义变量的变量名
value 自定义变量的变量值
_parameter 传递进来的参数

实现:

StudentMapper.java

	// 模糊查询
	public List<Student> findStudentLikeSname(String keyname);

StudentMapper.xml

<select id="findStudentLikeSname" parameterType="String" resultType="Student">
		<!-- select * from student where sname like '%#{v}%' -->
		<!-- 方式一 业务层解决 -->
		<!-- select * from student where sname like #{v} -->
		
		<!-- 方式二 concat 推荐-->
		<!-- select * from student where sname like concat('%',#{v},'%') -->
		
		<!-- 方式三 ${} 
			${} 和 #{} 区别 *****
		-->
		<!-- select * from student where sname like '%${v}%' -->
	
		<!-- 方式四 sql语法 -->
		<!-- select * from student where sname like "%"#{v}"%" -->
		
		<!-- 方式五 bind  推荐-->
		<bind name="kk" value="'%'+_parameter+'%'"/>
		select * from student where sname like #{kk}
	
	</select>

测试:

SqlSession sqlSession = DaoUtil.getSqlSession();

		StudentMapper stuMapper = sqlSession.getMapper(StudentMapper.class);	
        List<Student> slist = stuMapper.findStudentLikeSname("张");

		slist.forEach(System.out::println);
		DaoUtil.closeResource(sqlSession);

方式一:在 张 前后加%%即

  List<Student> slist = stuMapper.findStudentLikeSname("%张%");

#{} ${} 区别

  • #{}匹配的是一个占位符,相当于JDBC中的一个?会对一些敏感的字符进行过滤,编译过后会对传递的值加上双引号,因此可以防止SQL注入问题。
  • ${}匹配的是真实传递的值,传递过后,会与sql语句进行字符串拼接。${}会与其他sql进行字符串拼接,不能预防sql注入问题。

#{}是预编译处理,$ {}是字符串替换。

mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;

mybatis在处理 $ { } 时,就是把 ${ } 替换成变量的值。使用 #{} 可以有效的防止SQL注入,提高系统安全性。

示例完整代码

StudentMapper.java

public interface StudentMapper {

	// 查询
	public List<Student> findStudent(Student s);

	public List<Student> findStudentWhere(Student s);

	public List<Student> findStudentChoose(Student s);

	public int updateStudentSet(Student s);

	public List<Student> findStudentTrim(Student s);

	public int updateStudentTrim(Student s);
	
	public int addStudent(Student s);

	public List<Student> findStudentArray(int[] arr);

	public List<Student> findStudentList(List<Integer> sidList);

	// 批量增加
	public int addStudentList(List<Student> stuList);

	// 模糊查询
	public List<Student> findStudentLikeSname(String keyname);

}

StudentMapper.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">

<mapper namespace="com.zkt.mapper.StudentMapper">

	<!-- OGNL 对象图导航语言 属性 运算符 逻辑 字符串增强 == -->

	<!-- test中的表达式成立 就把if标签里面的字串拼接 -->
	<select id="findStudent" resultType="student" parameterType="student">
		select * from student where 1=1
		<if test="ssex != null">
			and ssex=#{ssex}
		</if>
		<if test="classid != 0">
			and classid=#{classid}
		</if>
	</select>

	<!-- where标签 
		1.添加一个where关键词 
		2. 去掉where后的第一个and 
		3.当没where标签中没有任何成立的字串时 什么也不添加 -->
	<select id="findStudentWhere" resultType="student" parameterType="student">
		select * from student
		<where>
			<if test="ssex != null">
				and ssex=#{ssex}
			</if>
			<if test="classid != 0">
				and classid=#{classid}
			</if>
		</where>
	</select>

	<select id="findStudentChoose" resultType="student" parameterType="student">
		select * from student
		<where>
			<choose>
				<when test="sname != null">
					and sname=#{sname}
				</when>
				<when test="ssex != null">
					and ssex=#{ssex}
				</when>
				<otherwise>and sid > 10</otherwise>
			</choose>
		</where>
	</select>


	<update id="updateStudentSet" parameterType="student">
			update student
			<set>
				<if test="sname != null">sname = #{sname},</if>
				<if test="birthday != null">birthday = #{birthday},</if>
				<if test="ssex != null">ssex = #{ssex},</if>
				<if test="classid != 0">classid = #{classid}</if>
			</set>
			where sid = #{sid}
	</update>
	
	
	<!-- trim 万能标签
		prefix 开始添加一个什么
		prefixOverrides 开始去掉一个什么
		suffix 结束添加一个什么
		suffixOverrides 结束去掉一个什么
	 -->
	 <select id="findStudentTrim" parameterType="student" resultType="student">
	 	select * from student 
	 	<trim prefix=" where " prefixOverrides="and" >
	 		<if test="ssex != null"> and ssex= #{ssex}</if>
			<if test="classid != 0"> and classid = #{classid}</if>
	 	</trim>
	 </select>
	
	
	<update id="updateStudentTrim" parameterType="student">
			update student
			<trim prefix="set " suffixOverrides=",">
				<if test="sname != null">sname = #{sname},</if>
				<if test="birthday != null">birthday = #{birthday},</if>
				<if test="ssex != null">ssex = #{ssex},</if>
				<if test="classid != 0">classid = #{classid},</if>
			</trim>
			where sid = #{sid}
	</update>

	 <insert id="addStudent" parameterType="student">
	 	insert into  student 
	 	<trim prefix="(" suffix=")" suffixOverrides=",">
	 		<if test="sid != 0"> sid,</if>
	 		<if test="sname != null"> sname,</if>
	 		<if test="birthday != null"> birthday,</if>
	 		<if test="ssex != null"> ssex,</if>
	 		<if test="classid != 0"> classid,</if>
	 	</trim>
	 	values
	 	<trim prefix="(" suffix=")" suffixOverrides=",">
	 		<if test="sid != 0"> #{sid},</if>
	 		<if test="sname != null"> #{sname},</if>
	 		<if test="birthday != null"> #{birthday},</if>
	 		<if test="ssex != null"> #{ssex},</if>
	 		<if test="classid != 0"> #{classid},</if>
	 	</trim>
	 </insert>
	
	<select id="findStudentArray" resultType="student">
		select * from student
		<where> 
			<foreach collection="array" item="x" open="sid in(" close=")" index="i" separator=",">
				#{x}
			</foreach>
		</where>
	</select>
	
	<select id="findStudentList" resultType="student">
		select * from student
		<where> 
			<foreach collection="list" item="x" open="sid in(" close=")" index="i" separator=",">
				#{x}
			</foreach>
		</where>
	</select>
	
	<insert id="addStudentList" >
		insert into student (sname,birthday,ssex,classid)
		values
		<foreach collection="list" item="stu" separator=",">
			(#{stu.sname},#{stu.birthday},#{stu.ssex},#{stu.classid})
		</foreach>
	</insert>
	
	<select id="findStudentLikeSname" parameterType="String" resultType="Student">
		<!-- select * from student where sname like '%#{v}%' -->
		<!-- 方式一 业务层解决 -->
		<!-- select * from student where sname like #{v} -->
		
		<!-- 方式二 concat 推荐-->
		<!-- select * from student where sname like concat('%',#{v},'%') -->
		
		<!-- 方式三 ${} 
			${} 和 #{} 区别 *****
		-->
		<!-- select * from student where sname like '%${v}%' -->
	
		<!-- 方式四 sql语法 -->
		<!-- select * from student where sname like "%"#{v}"%" -->
		
		<!-- 方式五 bind  推荐-->
		<bind name="kk" value="'%'+_parameter+'%'"/>
		select * from student where sname like #{kk}
	
	</select>
		
</mapper>

测试:

public class Test01 {
	public static void main(String[] args) {
		SqlSession sqlSession = DaoUtil.getSqlSession();

		StudentMapper stuMapper = sqlSession.getMapper(StudentMapper.class);

		Student s = new Student();
//		s.setClassid(1);
//		s.setSsex("男");
//		s.setSname("zkt");
//		s.setSid(1);

//		List<Student> slist = stuMapper.findStudent(s);
//		List<Student> slist = stuMapper.findStudentWhere(s);
//		List<Student> slist = stuMapper.findStudentChoose(s);
//		List<Student> slist = stuMapper.findStudentTrim(s);

//		int[] arr = {1,2,3,4,5,6,7};
//		List<Student> slist = stuMapper.findStudentArray(arr);

//		List<Integer> sidlist = new ArrayList<Integer>();
//		sidlist.add(1);
//		sidlist.add(2);
//		sidlist.add(3);
//		sidlist.add(4);
//		sidlist.add(5);
//		List<Student> slist = stuMapper.findStudentList(sidlist);

		List<Student> slist = stuMapper.findStudentLikeSname("张");

		slist.forEach(System.out::println);

//		int ret = stuMapper.updateStudentSet(s);
//		int ret = stuMapper.addStudent(s);

//		Student s1 = new Student();
//		s1.setBirthday(new Date());
//		s1.setClassid(1);
//		s1.setSname("刘备");
//		s1.setSsex("男");
//		
//		Student s2 = new Student();
//		s2.setBirthday(new Date());
//		s2.setClassid(2);
//		s2.setSname("小乔");
//		s2.setSsex("女");
//		
//		Student s3 = new Student();
//		s3.setBirthday(new Date());
//		s3.setClassid(2);
//		s3.setSname("曹操");
//		s3.setSsex("男");
//		
//		List<Student> stulist = new ArrayList<Student>();
//		stulist.add(s1);
//		stulist.add(s2);
//		stulist.add(s3);
//		
//		int ret = stuMapper.addStudentList(stulist);
//		
//		if(ret == stulist.size()) {
//			sqlSession.commit();
//			System.out.println("成了");
//		}else {
//			sqlSession.rollback();
//			System.out.println("凉了");
//		}

		DaoUtil.closeResource(sqlSession);

	}
}




七、映射器注解

映射器配置文件的缺陷

  • 繁琐:配置文件的书写本身繁琐,需要掌 握的内容比较多
  • 不直观:配置文件和接口直接只是名称相同, 对应起来比较麻烦.

常用的注解

  • 基本注解:实现简单的增删改查操作。
  • 结果映射注解:实现结果的映射关系, 也可以完成级联映射。
  • 动态SQL注解:实现动态 SQL 的内容

八、基本注解

基本注解的分类

  • 增加操作 @Insert 类似 < insert > 完成新增
  • 删除操作 @Delete 类似 < delete > 完成删除
  • 修改操作 @Update 类似 < update > 完成修改
  • 查询操作 @Select 类似 < select > 完成查询

@Insert 新增

功能:完成新增操作,类似配置文件的<insert>元素;

说明:新增时所用的参数取值是接口方法的入参,可以是对象,也可以是 Map 集合。

语法:

语法:
@Insert (“ sql 语句”)

主键回填 

功能:完成数据库自增主键的回填;

语法:

语法:
@Options(useGeneratedKeys = true, keyProperty = "主键属性")

StudentMapper.java

//新增 -- 主键回填
	@Insert("insert into student(sname,birthday,ssex,classid)"
			+ "values(#{sname},#{birthday},#{ssex},#{classid})")
	@Options(useGeneratedKeys = true,keyProperty = "sid")
	public int addStudent(Student s);

 测试:

SqlSession sqlSession = DaoUtil.getSqlSession();

		StudentMapper stuMapper = sqlSession.getMapper(StudentMapper.class);

		Student s = new Student();
		s.setClassid(1);
		s.setSsex("男");
		s.setSname("zkt89");
		s.setBirthday(new Date());
//		s.setSid(1);
        System.out.println("添加前"+s);
		int ret = stuMapper.addStudent(s);
		System.out.println("添加后"+s);
		
		if(ret >0) {
			sqlSession.commit();
			System.out.println("成了");
		}else {
			sqlSession.rollback();
			System.out.println("凉了");
		}
		DaoUtil.closeResource(sqlSession);

 

主键自增 

功能:完成自定义主键的自增;

语法:

语法:
@SelectKey ( statement = "自增规则", keyProperty 
= "主键属性", resultType = 结果类型, before = true )

@Delete 删除

功能:完成删除操作,类似配置文件的<delete>元素;

说明:删除时所用的参数取值是接口方法的入参,可以是对象,也可以是 Map 集合。

语法:

语法:
@Delete (“ sql 语句”)

示例:

StudentMapper.java

@Delete("delete from student where sid = #{v}")
	public int deleteStudent(int sid);

 测试:

	SqlSession sqlSession = DaoUtil.getSqlSession();

		StudentMapper stuMapper = sqlSession.getMapper(StudentMapper.class);
		
		int ret = stuMapper.deleteStudent(23);
		if (ret > 0) {
			sqlSession.commit();
			System.out.println("成了");
		} else {
			sqlSession.rollback();
			System.out.println("凉了");
		}
		DaoUtil.closeResource(sqlSession);

@Update 更新

功能:完成更新操作,类似配置文件的<update>元素;

说明:更新时所用的参数取值是接口方法的入参,可以是对象,也可以是Map 集合。

语法:

语法:
@Update (“ sql 语句”)

示例:

StudentMapper.java

@Update("update student set sname=#{sname},birthday=#{birthday},"
			+ "ssex=#{ssex},classid=#{classid} where sid=#{sid}")	
	public int updateStudent(Student s);

 测试:

SqlSession sqlSession = DaoUtil.getSqlSession();

		StudentMapper stuMapper = sqlSession.getMapper(StudentMapper.class);

		Student s = new Student();
		s.setClassid(1);
		s.setSsex("男");
		s.setSname("zkt89");
		s.setBirthday(new Date());
		s.setSid(4);

		int ret = stuMapper.updateStudent(s);
		if (ret > 0) {
			sqlSession.commit();
			System.out.println("成了");
		} else {
			sqlSession.rollback();
			System.out.println("凉了");
		}
		DaoUtil.closeResource(sqlSession);

@Selete 查询 

功能:完成查询操作,类似配置文件的 <select>元素;

说明:查询时所用的参数取值是接口方法的入参,可以是 对象,也可以是 Map 集合。

语法:

语法:
@Selete (“ sql 语句”)

示例:

StudentMapper.java

@Select("select * from student")
	public List<Student> findStudent();

@Select("select * from student where sid = #{v}")
	public Student findStudentBySid(int Sid);

 测试:

SqlSession sqlSession = DaoUtil.getSqlSession();

		StudentMapper stuMapper = sqlSession.getMapper(StudentMapper.class);

		List<Student> slist = stuMapper.findStudent();

		slist.forEach(System.out::println);
        System.out.println("============");
		Student s = stuMapper.findStudentBySid(5);
		System.out.println(s);
		DaoUtil.closeResource(sqlSession);

注解和sqlMapper.xml 可以同时使用

注解底层还是sqlMapper 方法还是不能重载

传递多个参数的方式: 

  • 方法1:Map 方式 跟sqlmap一样
  • 方法2:JavaBean 方式 跟sqlmap一样
  • 方法3:@Param 方式

示例:

StudentMapper.java

//多参 4 javabean map arg0... param1...
	//@Param
	@Select("select * from student where ssex = #{sex} and classid=#{banjibianhao} limit #{cp},#{sp}")
	public List<Student> findStudentBySexAndClassidPage(
			@Param("sex")String sex,
			@Param("banjibianhao")int classid,
			@Param("cp")int curpage,
			@Param("sp")int sizepage);

 测试:

SqlSession sqlSession = DaoUtil.getSqlSession();

		StudentMapper stuMapper = sqlSession.getMapper(StudentMapper.class);

		List<Student> slist = stuMapper.findStudentBySexAndClassidPage("男", 1, (1-1)*3, 3);
		slist.forEach(System.out::println);

		DaoUtil.closeResource(sqlSession);

九、结果映射注解

@Results 结果映射

功能: 完成数据库字段和 JavaBean 属性的映射关系;

说明:每个 @Results 可以包含多个 @Result,其中通过 id 属性来判断是否为主键。

语法:

语法:
@Results({ @Result(id = 是否为主键, 
column = "字段", property = "属性" ) })

@Results 复用

示例:

SMasterMapper .java

@Results({ @Result(column = "sm_name", property = "smname") })

	@Select("select * from schoolmaster")
	public List<SMaster> findAllSm();

	@Select("select * from schoolmaster where smid = #{v}")
	public SMaster findSmBySmid(int smid);

测试:

SqlSession sqlSession = DaoUtil.getSqlSession();

		SMasterMapper smMapper = sqlSession.getMapper(SMasterMapper.class);

		List<SMaster> smlist = smMapper.findAllSm();
		smlist.forEach(System.out::println);

		SMaster sm = smMapper.findSmBySmid(1);
		System.out.println(sm);

注解映射各用各的

一对一映射 

功能:一对一的关系映射; 

说明:FetchType.lazy 是延时加载,FetchType.EAGER 是即时加载。

语法:

语法:
@One( Select = 一对一查询方法, 
fetchType = FetchType.EAGER ) 

示例:

StudentMapper.java

@Results({
		@Result(column = "classid",property = "bj", 
				one=@One(select = "com.ape.mapper.BanjiMapper.findBanjiByClassid"))
	})
	
	@Select("select * from student ")
	public List<Student> findStudentAndClass();

BanjiMapper.java

@Select("select * from class where classid=#{classid}")
	public Banji findBanjiByClassid(int classid);

 测试:

SqlSession sqlSession =DaoUtil.getSqlSession();
		StudentMapper stuMapper =sqlSession.getMapper(StudentMapper.class);
		List<Student> sList = stuMapper.findStudentAndClass();
		sList.forEach(System.out::println);


		DaoUtil.closeResource(sqlSession);

注解没有表联查 只有单表和自己写的映射关系

一对一映射的实现案例

一对多映射

功能:一对多的关系映射;

说明:FetchType.lazy 是延时加载,FetchType.EAGER 是即时加载。

语法:

语法:
@Many( Select = 一对多查询方法, 
fetchType = FetchType.EAGER ) 

示例:

BanjiMapper.java

@Results({
		@Result(column = "classid",property = "classid"),
		@Result(column = "classid",property = "sList",
				many =@Many(select = "com.zkt.mapper.StudentMapper.findStudentByClassid"))
		})
	@Select("select * from class")
	public List<Banji> findAllBanji();

StudentMapper.java

@Select("select * from student where classid=#{v}")
	public List<Student> findStudentByClassid(int classid);

 测试:

SqlSession sqlSession = DaoUtil.getSqlSession();

		BanjiMapper bjmapper = sqlSession.getMapper(BanjiMapper.class);
		List<Banji> bjList = bjmapper.findAllBanji();

		bjList.forEach(System.out::println);

		DaoUtil.closeResource(sqlSession);
	

一对多映射的实现案例

示例完整代码 

实体类同mybatis2

BanjiMapper.java

public interface BanjiMapper {

	@Select("select * from class where classid=#{classid}")
	public Banji findBanjiByClassid(int classid);

	@Results({ @Result(column = "classid", property = "classid"),
			@Result(column = "classid", property = "sList", many = @Many(select = "com.zkt.mapper.StudentMapper.findStudentByClassid")) })
	@Select("select * from class")
	public List<Banji> findAllBanji();

}

StudentMapper.java

public interface StudentMapper {

	@Select("select * from student")
	public List<Student> findStudent();

	@Select("select * from student where sid = #{v}")
	public Student findStudentBySid(int Sid);

	// 多参 4 javabean map arg0... param1...
	// @Param
	@Select("select * from student where ssex = #{sex} and classid=#{banjibianhao} limit #{cp},#{sp}")
	public List<Student> findStudentBySexAndClassidPage(@Param("sex") String sex, @Param("banjibianhao") int classid,
			@Param("cp") int curpage, @Param("sp") int sizepage);

	// 新增 -- 主键回填
	@Insert("insert into student(sname,birthday,ssex,classid)" + "values(#{sname},#{birthday},#{ssex},#{classid})")
	@Options(useGeneratedKeys = true, keyProperty = "sid")
	public int addStudent(Student s);

	@Update("update student set sname=#{sname},birthday=#{birthday},"
			+ "ssex=#{ssex},classid=#{classid} where sid=#{sid}")
	public int updateStudent(Student s);

	@Delete("delete from student where sid = #{v}")
	public int deleteStudent(int sid);

	@Results({
			@Result(column = "classid", property = "bj", one = @One(select = "com.zkt.mapper.BanjiMapper.findBanjiByClassid")) })
	@Select("select * from student")
	public List<Student> findStudentAndClass();

	@Select("select * from student where classid=#{v}")
	public List<Student> findStudentByClassid(int classid);

}

测试1

public class Test01 {
	public static void main(String[] args) {
		SqlSession sqlSession = DaoUtil.getSqlSession();

		StudentMapper stuMapper = sqlSession.getMapper(StudentMapper.class);

		Student s = new Student();
		s.setClassid(1);
		s.setSsex("男");
		s.setSname("zkt89");
		s.setBirthday(new Date());
		s.setSid(4);

//		List<Student> slist = stuMapper.findStudent();
//
//		slist.forEach(System.out::println);
		
//		System.out.println("=============");
//		Student s = stuMapper.findStudentBySid(5);
//		System.out.println(s);

		List<Student> slist = stuMapper.findStudentBySexAndClassidPage("男", 1, (1-1)*3, 3);
		slist.forEach(System.out::println);

//		System.out.println("添加前"+s);
//		int ret = stuMapper.addStudent(s);
//		System.out.println("添加后"+s);

//		int ret = stuMapper.updateStudent(s);
//		int ret = stuMapper.deleteStudent(23);
//		if (ret > 0) {
//			sqlSession.commit();
//			System.out.println("成了");
//		} else {
//			sqlSession.rollback();
//			System.out.println("凉了");
//		}
		DaoUtil.closeResource(sqlSession);

	}
}

测试3

public class Test03 {
	public static void main(String[] args) {
		SqlSession sqlSession = DaoUtil.getSqlSession();
//		StudentMapper stuMapper =sqlSession.getMapper(StudentMapper.class);
//		List<Student> sList = stuMapper.findStudentAndClass();
//		sList.forEach(System.out::println);

		BanjiMapper bjmapper = sqlSession.getMapper(BanjiMapper.class);
		List<Banji> bjList = bjmapper.findAllBanji();

		bjList.forEach(System.out::println);

		DaoUtil.closeResource(sqlSession);
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/768131.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

代码随想录算符训练营第1天|LeetCode704二分查找,LeetCode27移除元素

704.二分查找 题目链接&#xff1a;704. 二分查找 - 力扣&#xff08;LeetCode&#xff09; 文档讲解&#xff1a;代码随想录 (programmercarl.com) 视频链接&#xff1a;手把手带你撕出正确的二分法 | 二分查找法 | 二分搜索法 | LeetCode&#xff1a;704. 二分查找_哔哩哔哩_…

libtorch+torchvision windows编译

libtorch建议直接采用官方的预编译版本,对应好torchvision版本做编译。 1. libtorch预编译版本下载 libtorch官方下载地址 Pybind11编译 git clone https://github.com/pybind/pybind11.git cd pybind11 mkdir build (base) PS E:\project\pybind11-2.13.1> cd .\build…

STMF4学习笔记(天空星)

前言&#xff1a;本篇笔记参考嘉立创文档&#xff0c;连接放在最后 #RTC相关概念定义 Real-Time Clock 缩写 RTC 翻译 实时时钟&#xff0c;是单片机片内外设的一种&#xff0c;作用于提供准确的时间还有日期&#xff0c;这个外设有独立的电源&#xff0c;当单片机停止供电…

Vue移动端地图App:van-uploader导致的卡顿问题

问题描述 基于Vue3+Vant IU 4开发的移动端地图App,在进行地图点位上报、上报记录查看过程中,出现App卡顿、甚至闪退的问题,进行问题定位之后,发现是van-uploader组件导致的问题。 van-uploader文件上传组件 van-uploader组件用于将本地的图片或文件上传至服务器,并在上传…

番外篇 | 斯坦福提出即插即用二阶优化器Sophia :相比Adam实现2倍加速,显著节省大语言模型训练成本

前言:Hello大家好,我是小哥谈。大模型的预训练成本巨大,优化算法的改进可以加快模型的训练时间并减少训练开销。目前大模型的训练优化器基本上都采用Adam及其变体,并且Adam的应用已经有9个年头了,在模型优化方面相当于霸主的地位。但是能否够在优化器方面提高模型预训练效…

第15届蓝桥杯Python青少组选拔赛(STEMA)2023年8月真题-附答案

第15届蓝桥杯Python青少组选拔赛&#xff08;STEMA&#xff09;2023年8月真题 题目总数&#xff1a; 11 总分数&#xff1a; 400 一、单选题 第 1 题 单选题 以下不符合 Python 语言变量命名规则的是&#xff08; &#xff09;。 A. k B. 2_k C. _k D. ok 答案 B …

全面解析自然语言处理(NLP):基础、挑战及应用前景

自然语言处理 (NLP) 简介与应用前景 自然语言处理&#xff08;NLP&#xff09;是人工智能和计算语言学的一个分支&#xff0c;致力于使计算机能够理解、解释和生成人类语言。这篇博文将深入探讨自然语言处理的基础知识、挑战、典型任务及其广泛的应用前景。 一、自然语言处理的…

企业部署 LLM 的四种方法

目录 生产环境中的四种 LLM 方法1. 基于上下文的提示工程 -- Prompt Engineering2. 检索增强生成 -- RAG3. 微调模型 -- Fine Tune4. 训练模型参考随着大型语言模型 (LLM) 的快速发展,企业正积极探索其用例,并将首批生成式 AI 应用部署到生产环境中。自今年 LLM 或 LLMOps 真…

全网最详细的软件测试面试题总结+基础知识(完整版)

一、什么是软件&#xff1f; 软件是计算机系统中的程序和相关文件或文档的总称。 二、什么是软件测试&#xff1f; 说法一&#xff1a;使用人工或自动的手段来运行或测量软件系统的过程&#xff0c;以检验软件系统是否满足规定的要求&#xff0c;并找出与预期结果之间的差异…

python3.8安装详细教程

python3.8下载及安装详细教程 Python 3.8 是一个重要的Python版本&#xff0c;它引入了一系列新功能和改进。以下是对Python 3.8的详细概述&#xff0c;包括其关键特性、安装方法以及版本状态等信息。 Python 3.8的关键特性 海象运算符&#xff08;Walrus Operator&#xff09…

字符串操作函数

目录 一.strlen函数 二.strcpy函数 三.strcat函数 四.strcmp函数 五.strncpy函数 六.strncat函数 七.strncmp 函数 八.strstr函数 九.strtok函数 十.strchr函数 十一.strrchr函数 十二.strpbrk函数 十三.strspn函数 十四.strcspn函数 一.strlen函数 size_t str…

yaklang window安装 vscode运行得到“hello world”

资源来源&#xff1a;旅程伊始&#xff1a;Yak 语言环境安装与搭建环境 | Yak Program Language 安装yak语言非常简单&#xff0c;管理员权限打开命令行运行以下命令&#xff1a; powershell (new-object System.Net.WebClient).DownloadFile(https://yaklang.oss-cn-beijing…

“穿越时空的机械奇观:记里鼓车的历史与科技探秘“

在人类文明的发展历程中&#xff0c;科技的创新与进步不仅仅推动了社会的进步&#xff0c;也为我们留下了丰富的文化遗产。记里鼓车&#xff0c;作为一种古老的里程计量工具&#xff0c;其历史地位和技术成就在科技史上具有重要的意义。本文将详细介绍记里鼓车的起源、结构原理…

MySQL数据库设计作业 ——《网上书店系统》数据库设计实验报告

数据库设计作业——《网上书店系统》数据库设计 一、功能需求 普通用户&#xff1a;可以进行最基础的登陆操作&#xff0c;可浏览图书、按类别查询图书、查看 图书的详细信息&#xff0c;还可以注册成为会员。会员&#xff1a;需要填写详细信息&#xff08;真实姓名、性别、手…

SSM学习4:spring整合mybatis、spring整合Junit

spring整合mybatis 之前的内容是有service层&#xff08;业务实现层&#xff09;、dao层&#xff08;操作数据库&#xff09;&#xff0c;现在新添加一个domain&#xff08;与业务相关的实体类&#xff09; 依赖配置 pom.xml <?xml version"1.0" encoding&quo…

springboot+vue+mybatis企业保修系统+PPT+论文+讲解+售后

企业管理系统提供给用户一个企业信息管理的系统&#xff0c;最新的企业信息让用户及时了解企业管理动向,,还能通过交流区互动更方便。本系统采用了B/S体系的结构&#xff0c;使用了java技术以及MYSQL作为后台数据库进行开发。系统主要分为系统管理员、员工和主管三个部分&#…

【C语言】手撕结构体内存对齐

©作者:末央&#xff06; ©系列:C语言初阶(适合小白入门) ©说明:以凡人之笔墨&#xff0c;书写未来之大梦 目录 结构体对齐规则结构体大小计算 - 三步曲 结构体对齐规则 怎么计算结构体的内存大小。这就涉及到结构体内存对齐的问题。 结构体的第⼀个成员对⻬到…

项目实战--MySQL实现分词模糊匹配

一、需求描述 推广人员添加公司到系统时&#xff0c;直接填写公司简称&#xff0c;而公司全称可能之前已经被添加过&#xff0c;为防止添加重复的公司&#xff0c;所以管理员在针对公司信息审批之前&#xff0c;需要查看以往添加的公司信息里是否有相同公司。 二、方案 技术…

项目2:API Hunter 细节回顾 -1

一. 接口调用 对于开发者来说&#xff0c;接口的调用应当是方便快捷的&#xff0c;而且出于安全考虑&#xff0c;通常会选择在后端调用第三方 API&#xff0c;避免在前端暴露诸如密码的敏感信息。 若采用 HTTP 调用方式&#xff1a; HttpClientRestTemplate第三方库&#xf…

【JavaWeb】登录校验-会话技术(一)Cookie与Session

登录校验 实现登陆后才能访问后端系统页面&#xff0c;不登陆则跳转登陆页面进行登陆。 首先我们在宏观上先有一个认知&#xff1a; HTTP协议是无状态协议。即每一次请求都是独立的&#xff0c;下一次请求并不会携带上一次请求的数据。 因此当我们通过浏览器访问登录后&#…
最新文章