Springboot + MyBatis入门培训 2 增改删除与查询 in like foreach操作

Posted zhtbs

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Springboot + MyBatis入门培训 2 增改删除与查询 in like foreach操作相关的知识,希望对你有一定的参考价值。

介绍在MyBatis中如何操作sql文的常用基础方法包括的INSERT、UPDATE、DELETE定义。MyBatis怎么使用if 判断条件来生成需要的业务sql文。查询条件中in like 使用技巧和注意事项,foreach 循环的应用。
项目运行环境配置看Springboot + MyBatis入门培训 1 项目运行环境配置

MyBatis 中的INSERT、UPDATE、DELETE操作

在我们使用到新增,修改,删除等业务的时候,需要用到数据库中的SQL语句INSERT、UPDATE、DELETE来操作数据库。这些语句需要写在MyBatis 下sql文xml对应的xml元素属性中,再有业务接口定义这几个业务的方法装入到 spring 容器中来。

UserSql.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="cn.core.my.app.dao.UserDao">
<insert id="saveuser">  
    INSERT INTO user(id, user)
    VALUES(#{id}, #{name})
</insert>
<update id="upuser">
    UPDATE user
    SET user=#{name}
    where id=#{id}
</update>
<delete id="deuser">
    delete from user 
    where id=#{id}
</delete>
</mapper>

spring UserDao容器类定

@Component
@Mapper
public interface UserDao {
 //添加
 int saveuser(Map map);
 //修改
 int upuser(Map map);
  //删除
 int deuser(Map map);
}

测试定义MyBatisTest

@RunWith(SpringRunner.class)
@SpringBootTest(classes=OnApp.class)
public class MyBatisTest {
	@Autowired
	UserDao userdao;
	@Test
	public void TestUserList(){
        //定义sql文中的参数
		Map map=new HashMap();
        //定义user表id属性
		map.put("id",2);
        //定义user表user属性
		map.put("name", "zhtbs");
        //删除业务
	    userdao.deuser(map);
        //添加
		userdao.saveuser(map);
		map.put("name", "zht114001");
        //修改
		userdao.upuser(map);
	}
}

运行测试类后后台打印出来以下信息内容

-----------删除完成-----------------
==>  Preparing: delete from user where id=? 
==> Parameters: 2(Integer)
<==    Updates: 1
-----------新增完成-----------------
==>  Preparing: INSERT INTO user(id, user) VALUES(?, ?) 
==> Parameters: 2(Integer), zhtbs(String)
<==    Updates: 1
-----------修改完成-----------------
==>  Preparing: UPDATE user SET user=? where id=? 
==> Parameters: zht114001(String), 2(Integer)
<==    Updates: 1

MyBatis 查询条件 元素

  • < if test=" 判断条件 "> 在xml中的if元素写判断逻辑。

  • _parameter 查询条件为空判断默认判断

sql文xml中 通过 _parameter 属性判断查询条件是否为空,如果不为空生成对应条件的查询sql语句内容。

sql.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="cn.core.my.app.dao.UserDao">
  <select id="UserList" resultType="map">
     select * from user
     <where>
		<if test="_parameter != null"> ID = #{id}</if>
	</where>
  </select>
</mapper>

测试定义MyBatisTest

@RunWith(SpringRunner.class)
@SpringBootTest(classes=OnApp.class)
public class MyBatisTest {
	@Autowired
	UserDao userdao;
	@Test
	public void TestUserList(){
		Map map=new HashMap();
		map.put("id",2);//查询条件是2 
		List<Map> list=userdao.UserList(map);
        for(Map map1:list){
            System.out.println(map1);
        }
	}
}

运行结果

==>  Preparing: select * from user WHERE id = ? 
==> Parameters: 2(Integer)
<==    Columns: id, user
<==        Row: 2, zht114001
<==      Total: 1

查询 in like 与${参数}与#{参数}使用

在 sql文xml中 使用查询 in like 查询条件需要将参数设置为${参数}模式,这种模式是MyBatis 执行sql文的时候直接明文显示,生成原始sql文执行通过jdbc执行。

如果使用#{参数},MyBatis 执行的sql文参数为?号,在jdbc方法中执行。

  • ${参数} 动态sql文 通常用于动态sql文生成

  • sql文中有 like 关键字一定要使用${参数} 传递参数内容

sql.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="cn.core.my.app.dao.UserDao">
  <select id="UserList" resultType="map">
    select * from user
     <where>
	     <if test="_parameter != null"> 
            id in (#{id}) and user like '%${name}%' 
         </if>
	 </where>
 </select>

测试定义MyBatisTest

@RunWith(SpringRunner.class)
@SpringBootTest(classes=OnApp.class)
public class MyBatisTest {
	@Autowired
	UserDao userdao;
	@Test
	public void TestUserList(){
		Map map=new HashMap();
		map.put("id",2);//查询条件是 
        map.put("name", "zht");//模糊查询
		List<Map> list=userdao.UserList(map);
        for(Map map1:list){
            System.out.println(map1);
        }
	}
}

运行结果

==>  Preparing: select * from user 
        WHERE id in (?) 
		and user like '%zht%' 
==> Parameters: 2(Integer)
<==    Columns: id, user
<==        Row: 2, zht
<==      Total: 1

MyBatis 循环遍历 foreach

当像sql文xml中的需要使用集合(list)的时候,会用到MyBatis xml中的foreach标签元素循环遍历集合中的信息内容。

  • foreach 集合循环体
  • collection 集合对象引用
  • item 集合中元素的引用
  • index 循环次数
  • open 循环字符串内容设置 例如 “(” separator="," close=")"> separator隔断, close结束字符

在foreach 循环体中 引用集合中的元素对象 #{item.id} 生成sql文字符串。

<?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="cn.core.my.app.dao.UserDao"> 
<select id="UserForList" resultType="map">
   select * from user
   <where>
	  <if test="list != null and list.size() > 0">
		ID IN
		<foreach item="item" 
                 index="index" 
                 collection="list"
		open="(" separator="," close=")">
			#{item.id}
		</foreach>
		</if>
    </where>
   </select>
</mapper>

UserDao 集合查询方法设置

@Component
@Mapper
public interface UserDao {
	 List<Map> UserForList(List list);
}

测试定义MyBatisTest

@RunWith(SpringRunner.class)
@SpringBootTest(classes=OnApp.class)
public class MyBatisTest {
	@Autowired
	UserDao userdao;
	@Test
	public void TestUserForList(){
		Map map=new HashMap();
		map.put("id",1);
		Map map1=new HashMap();
		map1.put("id",2);
		List list=new ArrayList();
		list.add(map);
		list.add(map1);
		userdao.UserForList(list);
	}
}

将id信息装入map,再将这些map对象装入到list集合中,用这个集合list作为查询条件,生产sql文内容。

运行结果

==>  Preparing: select * from user WHERE ID IN ( ? , ? ) 
==> Parameters: 1(Integer), 2(Integer)
<==    Columns: id, user
<==        Row: 1, username
<==        Row: 2, zht
<==      Total: 2

Sql文转义字符

在sql文xml会有一些特殊字符需要在到转义字符或者xml语法来转义这些特殊字符

内容xml转义
大于<![CDATA[ 条件 < #{参数}]]>&gt;
小于<![CDATA[ 条件 > #{参数}]]>&lt;
大于等于<![CDATA[ 条件 <= #{参数}]]>&gt;=
小于等于<![CDATA[ 条件 >= #{参数}]]>&lt;=
<![CDATA[ & ]]>&amp;
单引号<![CDATA[ ' ]]>&apos;
双引号<![CDATA[ " ]]>&quot;

以上是关于Springboot + MyBatis入门培训 2 增改删除与查询 in like foreach操作的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot+Mybatis整合入门

SpringBoot整合mybatis快速入门

SpringBoot入门四,添加MyBatis支持

springboot整合mybatis入门

SpringBoot入门之基于注解的Mybatis

SpringBoot 整合 MyBatis-Plus 入门体验