MyBatis中动态Sql实现增删改查

本文详细介绍了如何在MyBatis中利用动态Sql进行CRUD操作。从编写查询接口开始,逐步讲解如何创建UserMapper.xml映射文件,并通过测试类验证其功能。

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

  1. 编写查询的接口
    1. package com.dao;
      
      import java.util.List;
      import java.util.Map;
      
      import org.apache.ibatis.annotations.Param;
      
      import com.pojo.Role;
      import com.pojo.User;
      
      public interface UserMapper {
      	// 使用where标签多条件查询
      	List<User> findUserByNameAndRoleIdAndPhone(@Param("uname") String name,
      			@Param("roleId") Integer roleId, @Param("phone") String phone);
      	//使用trim标签多条件查询
      	List<User> findUserByNameAndRoleIdAndPhone1(@Param("uname") String name,
      			@Param("roleId") Integer roleId, @Param("phone") String phone);
      
      	// 使用set标签修改
      	int updateRole(Role role);
      
      	// 删除
      	int deleteUser(int id);
      
      	// 添加
      	int addRole(Role role);
      
      	// 用户传递过来的是一个数组,根据数组进行查询
      	List<User> findUserAndRoleByIds(Integer[] ids);
      
      	// 用户传递过来的是一个数组,根据数组进行查询
      	List<User> findUserAndRoleByNames(List<String> names);
      
      	// 使用map集合进行入参查询
      	List<User> findUserAndRoleByMap(Map<String, Object> map);
      	
      	//使用choose标签确定只能以某一个作为条件进行查询
      	List<User> findUserByOne(User user);
      }
      

       

  2.  编写sql的映射文件UserMapper.xml
    1. <?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.dao.UserMapper">
      	<!-- 开启二级缓存 -->
      	<cache></cache>
      	
      	<!-- 使用if对参数进行判断,多条件查询(根据不为空的条件进行查询) -->
      	<select id="findUserByNameAndRoleIdAndPhone" resultType="User">
      		SELECT * FROM `smbms_user` 
      			<!-- WHERE 1=1 这样写就不用使用where标签 -->
      		<!-- 使用where标签的特性就是会自动的根据条件是否加and -->
      		<where>
      			<if test="uname!=null and uname!=''">
      				AND userName LIKE CONCAT('%',#{uname},'%')
      			</if>
      			<if test="roleId!=null">
      				AND userRole=#{roleId}
      			</if>
      			<if test="phone!=null and phone!=''">
      				AND phone=#{phone}
      			</if>
      		</where>
      	</select>
      	
      	<!-- 使用trim进行sql语句拼接 -->
      	<select id="findUserByNameAndRoleIdAndPhone1" resultType="User">
      		SELECT * FROM smbms_user 
      		<trim prefix="where" prefixOverrides="and">
      			<if test="uname!=null">
      				AND userName LIKE CONCAT('%',#{uname},'%') 
      			</if>
      			<if test="roleId!=null">
      				AND userRole=#{roleId}
      			</if>
      			<if test="phone!=null and phone!=''">
      				AND phone=#{phone}
      			</if>
      		</trim>
      	</select>
      	
      	<!-- 修改  -->
      	<update id="updateRole">
      		 UPDATE `smbms_role` 
      		 <!-- 使用set进行拼接 -->
      		<!--  <set>
      		 	<if test="roleCode!=null">roleCode=#{roleCode},</if>
      		 	<if test="roleName!=null">roleName=#{roleName},</if>
      		 	<if test="createdBy!=null">createdBy=#{createdBy},</if>
      		 	<if test="modifyBy!=null">modifyBy=#{modifyBy},</if>
      		 </set>
      		where id=#{id} -->
      	
      		<!-- 使用trim进行拼接 -->
      		<trim prefix="set" suffix="where id=#{id}" suffixOverrides="," >
      			<if test="roleCode!=null">roleCode=#{roleCode},</if>
      		 	<if test="roleName!=null">roleName=#{roleName},</if>
      		 	<if test="createdBy!=null">createdBy=#{createdBy},</if>
      		 	<if test="modifyBy!=null">modifyBy=#{modifyBy},</if>
      		</trim>
      	</update>
      
      	<!-- 删除 -->	
      	<delete id="deleteUser">
      		DELETE FROM `smbms_user`
      		<where>
      			id=#{id}
      		</where>
      	</delete>
      
      	<!-- 添加数据 -->
      	<insert id="addRole">
      		INSERT INTO `smbms_role` 
      		<trim prefix="(" suffix=")" suffixOverrides=",">
      			<if test="id!=null">id,</if>
      			<if test="roleCode!=null">roleCode,</if>
      		 	<if test="roleName!=null">roleName,</if>
      		 	<if test="createdBy!=null">createdBy,</if>
      		 	<if test="creationDate!=null">creationDate,</if>
      		 	<if test="modifyBy!=null">modifyBy,</if>
      		 	<if test="modifyDate!=null">modifyDate,</if>
      		</trim>
      		<trim prefix="values(" suffix=")" suffixOverrides=",">
      			<if test="id!=null">#{id},</if>
      			<if test="roleCode!=null">#{roleCode},</if>
      		 	<if test="roleName!=null">#{roleName},</if>
      		 	<if test="createdBy!=null">#{createdBy},</if>
      		 	<if test="creationDate!=null">#{creationDate},</if>
      		 	<if test="modifyBy!=null">#{modifyBy},</if>
      		 	<if test="modifyDate!=null">#{modifyDate},</if>
      		</trim>
      	</insert>
      	
      	<!-- 根据用户传递过来的是一个数组,根据数组进行查询 -->
      	<select id="findUserAndRoleByIds" resultMap="userList">
      		SELECT u.*,r.`roleName` FROM `smbms_user` u INNER JOIN
      		`smbms_role` r ON u.`userRole`=r.`id`
      		WHERE	u.`id` 
      		<!--collection:类型   item:当前的元素 open:前缀  separator:分隔 close:后缀-->
      		<foreach collection="array" item="id" open="in(" separator="," close=")" >
      			#{id}
      		</foreach>
      	</select>
      	<resultMap type="User" id="userList">
      		<id column="id" property="id"/>
      		<result column="roleName" property="userRoleName"/>
      	</resultMap>
      	
      	<!-- 使用foreach进行list集合参数的遍历  collection是写list-->
      	<select id="findUserAndRoleByNames" resultType="User">
      		SELECT * FROM `smbms_user` WHERE userName in
      		<foreach collection="list" item="name" open="(" separator="," close=")">
      			#{name}
      		</foreach>
      	</select>
      	
      	<!-- 使用foreach进行map集合参数的遍历  collection是写的集合的key名 -->
      	<select id="findUserAndRoleByMap" resultType="User">
      		SELECT * FROM `smbms_user` WHERE userName in
      		<foreach collection="nameKey" item="name" open="(" separator="," close=")">
      			#{name}
      		</foreach>
      		and phone in
      		<foreach collection="phoneKey" item="phone" open="(" separator="," close=")">
      			#{phone}
      		</foreach>
      	</select>
      	
      	<!-- 值根据一个条件进行查询,相当于switch -->
      	<select id="findUserByOne" resultType="User">
      		SELECT * FROM `smbms_user` WHERE 
      		<choose>
      			<when test="userName!=null">userName like CONCAT('%',#{userName},'%')</when>
      			<when test="userRole!=null">userRole like CONCAT('%',#{userRole},'%')</when>
      			<when test="phone!=null">phone like CONCAT('%',#{phone},'%')</when>
      			<otherwise>
      				id!=10
      			</otherwise>
      		</choose>
      	</select>
      </mapper>

       

  3. 编写测试类
    1. package com.test;
      
      import java.util.ArrayList;
      import java.util.HashMap;
      import java.util.List;
      import java.util.Map;
      
      import org.apache.ibatis.annotations.Select;
      import org.apache.ibatis.session.SqlSession;
      import org.apache.log4j.Logger;
      import org.junit.Test;
      
      import com.dao.UserMapper;
      import com.pojo.Role;
      import com.pojo.User;
      import com.util.MyBatisUtil;
      
      public class MyBatisTest {
      	Logger logger=Logger.getLogger(MyBatisTest.class);
      	
      	//使用where多条件查询
      	@Test
      	public void testWhere(){
      		SqlSession sqlSession = MyBatisUtil.openSession();
      		List<User> users = sqlSession.getMapper(UserMapper.class).findUserByNameAndRoleIdAndPhone("王洋", null, null);
      		for (User u : users) {
      			logger.debug(u);
      		}
      	}
      	
      	//使用trim多条件查询
      	@Test
      	public void testTrim(){
      		SqlSession sqlSession = MyBatisUtil.openSession();
      		List<User> users = sqlSession.getMapper(UserMapper.class).findUserByNameAndRoleIdAndPhone1("张", null, null);
      		for (User u : users) {
      			logger.debug(u);
      		}
      	}
      	
      	//修改操作
      	@Test
      	public void testSet(){
      		SqlSession sqlSession = MyBatisUtil.openSession();
      		Role role=new Role();
      		role.setId(3);
      		role.setRoleName("员工");
      		role.setModifyBy(2);
      		int count = sqlSession.getMapper(UserMapper.class).updateRole(role);
      		sqlSession.commit();
      		logger.debug(count);
      	}
      	
      	//删除操作
      	@Test
      	public void testDelete(){
      		SqlSession sqlSession = MyBatisUtil.openSession();
      		int count = sqlSession.getMapper(UserMapper.class).deleteUser(17);
      		sqlSession.commit();
      		logger.debug(count);
      	}
      	
      	//添加操作
      	@Test
      	public void testInsert(){
      		SqlSession sqlSession = MyBatisUtil.openSession();
      		Role role=new Role();
      		role.setRoleName("员工");
      		int count = sqlSession.getMapper(UserMapper.class).addRole(role);
      		sqlSession.commit();
      		logger.debug(count);
      	}
      	
      	//根据数组进行查询 
      	@Test
      	public void testArray(){
      		SqlSession sqlSession = MyBatisUtil.openSession();
      		Integer[] ids=new Integer[]{6,8,10};
      		List<User> users = sqlSession.getMapper(UserMapper.class).findUserAndRoleByIds(ids);
      		for (User u : users) {
      			logger.debug(u+","+u.getUserRoleName());
      		}
      	}
      	//根据list集合入参查询
      	@Test
      	public void testList(){
      		SqlSession sqlSession = MyBatisUtil.openSession();
      		List<String> names=new ArrayList<String>();
      		names.add("张华");
      		names.add("张晨");
      		names.add("asd");
      		names.add("赵燕");
      		List<User> users = sqlSession.getMapper(UserMapper.class).findUserAndRoleByNames(names);
      		for (User u : users) {
      			logger.debug(u+","+u.getUserRoleName());
      		}
      	}
      	
      	//根据map集合入参查询
      	@Test
      	public void testMap(){
      		SqlSession sqlSession = MyBatisUtil.openSession();
      		Map<String, Object> map=new HashMap<String, Object>();
      		String[] a={"张三","lisi","张华","张晨"};
      		List<String> phoneList=new ArrayList<String>();
      		phoneList.add("18098765434");
      		phoneList.add("13544561111");
      		phoneList.add("123");
      		map.put("nameKey", a);
      		map.put("phoneKey", phoneList);
      		List<User> users = sqlSession.getMapper(UserMapper.class).findUserAndRoleByMap(map);
      		for (User u : users) {
      			logger.debug(u+","+u.getUserRoleName());
      		}
      	}
      	
      	//测试 choose
      	@Test
      	public void testChoose() {
      		SqlSession sqlSession = MyBatisUtil.openSession();
      		User user=new User();
      		//user.setId(2);
      		//user.setUserName("张");
      		//user.setPhone("13544561111");
      		List<User> users = sqlSession.getMapper(UserMapper.class).findUserByOne(user);
      		for (User u : users) {
      			logger.debug(u);
      		}
      	}
      	
      }
      
       
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值