ssm_mybatis_复杂映射$配置深入_02

课程任务主要内容:

* Mybatis高级查询

* 映射配置文件深入

* 核心配置文件深入

* Mybatis多表查询

* Mybatis嵌套查询

Mybatis高级查询

1.1 ResutlMap属性


* resultType 

		如果实体的属性名与表中字段名一致,将查询结果自动封装到实体类中 

* ResutlMap 

		如果实体的属性名与表中字段名不一致,可以使用ResutlMap实现手动封装到实体类中 

<resultMap id="userResultMap" type="user">
		<id column="uid" property="id"></id>
		<result column="NAME" property="username"></result> 		
		<result column="PASSWORD" property="username"></result>
</resultMap>
<select id="findAllResultMap" resultMap="userResultMap">
	SELECT id AS uid,username AS NAME,password AS PASSWORD FROM USER 
</select>

注意:association 和collection标签的使用。

1.2 多条件查询(三种)

需求:根据id和username查询user表

1)方式一

​ 使用 #{arg0}-#{argn} 或者 #{param1}-#{paramn} 获取参数

UserMapper****接口

public interface UserMapper { 
	public List<User> findByIdAndUsername1(Integer id, String username);
    }

UserMapper.xml

<mapper namespace="com.lagou.mapper.UserMapper"> 
	<select id="findByIdAndUsername1" resultType="user">
    		<!-- select * from user where id = #{arg0} and username = #{arg1} -->
            select * from user where id = #{param1} and username = #{param2}
     </select> 
 </mapper>
2)方式二

​ 使用注解,引入 @Param() 注解获取参数**(注意:mapper配置文件中的参数字段,就是@Param() 中的字段)**

UserMapper****接口

public interface UserMapper { 
	public List<User> findByIdAndUsername2(@Param("id") Integer id,@Param("username") String username);
    }

UserMapper.xml

<mapper namespace="com.lagou.mapper.UserMapper"> 
		<select id="findByIdAndUsername2" resultType="user">
        select * from user where id = #{id} and username = #{username}
        </select> 
</mapper>
3)方式三(推荐)

​ 使用pojo对象传递参数**(注意:mapper配置文件中的参数字段,就是要和实体类中的字段相同)**

UserMapper****接口

public interface UserMapper {
	public List<User> findByIdAndUsername3(User user);
    }

UserMapper.xml

<mapper namespace="com.lagou.mapper.UserMapper"> 
		<select id="findByIdAndUsername3" parameterType="com.lagou.domain.User" resultType="com.lagou.domain.User">
        select * from user where id = #{id} and username = #{username} 
        </select> 
</mapper>

1.3 模糊查询

注意:当parameterType的属性是实体类型则sql语句中的字段用实体类对应的字段用#{},是mybatis框架为我们设置好的一些常用的类型的别名(基本数据类型和string)时,如果字段是一个则可以随便写。

需求

根据username模糊查询user表

1)方式一

在这里插入图片描述

2)方式二

注意:和方式一区别就是#{}和${}

注意:当parameterType的属性是实体类型则sql语句中的字段用实体类对应的字段用 , 是 m y b a t i s 框 架 为 我 们 设 置 好 的 一 些 常 用 的 类 型 的 别 名 ( 基 本 数 据 类 型 和 s t r i n g ) 时 , 如 果 字 段 是 一 个 则 只 能 写 成 {},是mybatis框架为我们设置好的一些常用的类型的别名(基本数据类型和string)时,如果字段是一个则只能写成 mybatisstring{value}。****注意要加‘’

在这里插入图片描述

3) ${} #{} 区别【笔试题】

#{} :表示一个占位符号

​ 通过 #{} 可以实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换,#{}可以有效防止sql注入。

​ #{} 可以接收简单类型值或pojo属性值。

​ 如果parameterType传输单个简单类型值, #{} 括号中名称随便写。

${} **😗*表示拼接ql串

​ 通过 ${} 可以将parameterType 传入的内容拼接在sql中且不进行jdbc类型转换,会出现sql注入问题。

​ ${} 可以接收简单类型值或pojo属性值。

​ 如果parameterType传输单个简单类型值, ${} 括号中只能是value。

Mybatis映射文件深入

2.1 返回主键

应用场景

​ 我们很多时候有这种需求,向数据库插入一条记录后,希望能立即拿到这条记录在数据库中的主键值。

2.1.1 useGeneratedKeys

注意:只适用于主键自增的数据库,mysql和sqlserver支持,oracle不支持

<!-- 		
			useGeneratedKeys="true" 声明返回主键 
			keyProperty="id" 把返回主键的值,封装到实体的id属性中 
			注意:只适用于主键自增的数据库,mysql和sqlserver支持,oracle不支持 --> 
<insert id="save" parameterType="user" useGeneratedKeys="true" keyProperty="id">
		INSERT INTO `user`(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address}) 
</insert>
2.1.2 selectKey
<!-- 
			selectKey 适用范围广,支持所有类型数据库 
			keyColumn="id" 指定主键列名 
			keyProperty="id" 指定主键封装到实体的id属性中
            resultType="int" 指定主键类型 
            order="AFTER" 设置在sql语句执行前(后),执行此语句 --> 
<insert id="save" parameterType="user"> 
		<selectKey keyColumn="id" keyProperty="id" resultType="int" order="AFTER">
        	SELECT LAST_INSERT_ID(); 
        </selectKey>
        	INSERT INTO `user`(username,birthday,sex,address) values(#{username},
        	#{birthday},#{sex},#{address}) 
</insert>

2.2 动态SQL

应用场景

​ 当我们要根据不同的条件,来执行不同的sql语句的时候,需要用到动态sql。(说白了就是需要判断然后sql拼接)

2.2.1 动态 SQL

需求

​ 根据id和username查询,但是不确定两个都有值。

​ 注意:where标签相当于 where 1=1,但是如果没有条件,就不会拼接where关键字

		<!-- 
		where标签相当于 where 1=1,但是如果没有条件,就不会拼接where关键字 
		--> 
		<select id="findByIdAndUsernameIf" parameterType="user" resultType="user">
        	SELECT * FROM `user` 
        	<where> 
        		<if test="id != null"> AND id = #{id} </if> 
        		<if test="username != null"> AND username = #{username} </if>
             </where> 
         </select>
2.2.2 动态 SQL

需求

​ 动态更新user表数据,如果该属性有值就更新,没有值不做处理。

<!-- set标签在更新的时候,自动加上set关键字,然后去掉最后一个条件的逗号 -->
<update id="updateIf" parameterType="user">
		UPDATE `user` 
		<set>
			<if test="username != null">
            	username = #{username}, 
            </if> 
            <if test="birthday != null">
           		 birthday = #{birthday}, 
            </if> <if test="sex !=null">
            	sex = #{sex}, </if> 
            <if test="address !=null"> 
           	 	address = #{address}, 
            </if>
         </set> 
         		WHERE id = #{id}
</update>
2.2.3 动态 SQL

foreach****主要是用来做数据的循环遍历

​ 例如: select * from user where id in (1,2,3) 在这样的语句中,传入的参数部分必须依靠foreach遍历才能实现。

标签用于遍历集合,它的属性:

• collection:代表要遍历的集合元素

• open:代表语句的开始部分

• close:代表结束部分

• item:代表遍历集合的每个元素,生成的变量名

• sperator:代表分隔符

<!-- 如果查询条件为普通类型 List集合,collection属性值为:collection 或者 list --> 
<!-- 如果查询条件为普通类型 Array数组,collection属性值为:array, parameterType="int"--> 
<select id="findByList" parameterType="list" resultType="user" > 
	SELECT * FROM `user`
    <where> 
		<foreach collection="collection" open="id in(" close=")" item="id" separator=",">
			#{id} 
		</foreach> 
	</where> 
</select>
2.2.4 总结

​ MyBatis映射文件配置

<select>:查询
<insert>:插入 
<update>:修改 
<delete>:删除 
<selectKey>:返回主键
<where>:where条件
<if>:if判断 
<foreach>:for循环
<set>:set设置 
<sql>:sql片段抽取

注意:

<!-- where标签相当于 where 1=1,但是如果没有条件,就不会拼接where关键字 --> 
<!-- set标签在更新的时候,自动加上set关键字,然后去掉最后一个条件的逗号 -->
<!-- 如果查询条件为普通类型 List集合,collection属性值为:collection 或者 list --> 
<!-- 如果查询条件为普通类型 Array数组,collection属性值为:array, parameterType="int"--> 

2.3 SQL片段

应用场景

​ 映射文件中可将重复的 sql 提取出来,使用时用 include 引用即可,最终达到 sql 重用的目的

<!--抽取的sql片段--> 
<sql id="selectUser">
	SELECT * FROM `user` 
</sql>

<select id="findByList" parameterType="list" resultType="user" > 
	<!--引入sql片段--> 
    <include refid="selectUser"></include>
    <where> 
		<foreach collection="collection" open="id in(" close=")" item="id" separator=",">
			#{id} 
		</foreach> 
	</where> 
</select>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SSM项目是一种基于Spring+SpringMVC+MyBatis框架的软件开发模式。这种模式集合了Spring的IOC和AOP特性,SpringMVC的Web开发能力以及MyBatis的ORM技术,使得项目在开发过程中更加高效和简便。 在SSM项目中,Spring作为核心容器,负责管理各个Bean的生命周期,并提供了强大的依赖注入功能,降低了代码耦合性,增加了代码的可维护性。Spring还通过AOP技术提供了事务管理、日志记录、权限控制等一系列的切面功能,使得开发过程更加灵活和可控。 SpringMVC是基于MVC设计模式的Web框架,它提供了统一的请求处理流程和各个层级之间的数据交互机制。通过注解和配置文件的方式,开发者可以定义Controller、视图解析器、拦截器等组件,实现对HTTP请求的响应和处理。 MyBatis是一种轻量级的持久层框架,它提供了ORM(对象关系映射)功能,通过简单的XML或注解配置,将Java对象和数据库表之间建立映射关系。MyBatis还提供了丰富的SQL映射、分页查询、缓存机制等功能,能够极大地简化数据库操作的代码量。 SSM项目开发主要包括以下几个步骤:首先,根据项目需求设计数据库表结构,并创建相应的实体类。然后,编写MyBatis的Mapper接口和SQL语句,实现对数据库的操作。接着,编写Service接口和实现类,在其中调用Mapper接口完成业务逻辑的处理。最后,编写Controller类,处理用户请求,并调用Service层方法返回结果给前端页面。 总之,SSM项目结合了Spring、SpringMVC和MyBatis的优点,可以有效地提高开发效率和代码质量。它在企业级应用开发中得到了广泛应用,是一种成熟和稳定的开发模式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值