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[ 条件 < #{参数}]]> | > |
小于 | <![CDATA[ 条件 > #{参数}]]> | < |
大于等于 | <![CDATA[ 条件 <= #{参数}]]> | >= |
小于等于 | <![CDATA[ 条件 >= #{参数}]]> | <= |
和 | <![CDATA[ & ]]> | & |
单引号 | <![CDATA[ ' ]]> | ' |
双引号 | <![CDATA[ " ]]> | " |
以上是关于Springboot + MyBatis入门培训 2 增改删除与查询 in like foreach操作的主要内容,如果未能解决你的问题,请参考以下文章