mybatis动态sql基础
2023-06-13 09:16:59 时间
mybatis动态sql
动态sql:sql的内容是变化的,可以根据条件获取到不同的sql语句。主要是where部分发送变化。
动态sql的实现,使用的是mybatis提供的标签,<if>,<where>,<foreach>
<if>是判断条件的,
语法<if test=”判断java对象的属性值”> 语法 </if>
mybatis动态sql-if标签
接口
List<User> selectStudentIf(User user);
Mapper文件
<!--if
<if test="使用参数java对象的属性值作为判断条件,语法规则 属性=xx">
-->
<select id="selectStudentIf" resultType="org.example.daomain.User">
SELECT * FROM TEST1
WHERE
<if test="p_name !=null and p_name!=''">
p_name =#{p_name}
</if>
<if test="address !='SS'">
and address = #{address}
</if>
</select>
测试类
@Test
public void testSelectStudents(){
/**使用mybatis的动态代理机制,使用sqlSession.getMapper(dao接口)
* getMapper能够获得dao接口的实现类对象
**/
SqlSession sqlSession = MyBatisUtils.getSqlSessionAuto();
UserDao dao = sqlSession.getMapper(UserDao.class);
User user =new User();
user.setP_name("小红");
user.setAddress("北京");
//调用dao的方法,执行数据库的操作
List<User> users =dao.selectStudentIf(user);
users.forEach(u-> System.out.println("用户:"+u));
}
执行顺序,从上往下
小问题
当第一个if不成立,第二if成立时,会造成语法错误
小技巧
解决小技巧:
mybatis动态sql-where标签
<where>用来包含 多个<if>的,当多个if有一个成立的,<where>会自动增加一个where关键字,并去掉if中多余的and ,or等。
接口
//where
List<User> selectStudentWhere(User user);
Mapper
<select id="selectStudentWhere" resultType="org.example.daomain.User">
SELECT * FROM TEST1
<where>
<if test="p_name !=null and p_name!=''">
p_name =#{p_name}
</if>
<if test="address !='SS'">
and address = #{address}
</if>
</where>
</select>
测试类
//where
@Test
public void selectStudentWhere(){
/**使用mybatis的动态代理机制,使用sqlSession.getMapper(dao接口)
* getMapper能够获得dao接口的实现类对象
**/
SqlSession sqlSession = MyBatisUtils.getSqlSessionAuto();
UserDao dao = sqlSession.getMapper(UserDao.class);
User user =new User();
user.setP_name("小红");
user.setAddress("北京");
//调用dao的方法,执行数据库的操作
List<User> users =dao.selectStudentWhere(user);
users.forEach(u-> System.out.println("用户:"+u));
}
mybatis动态sql-foreach标签
<foreach>循环java中的数组,list集合的。主要用在sql的in语句中。
学生id是 1 2 3的三个学生
SELECT * FROM TEST1 WHERE p_id in (1,2,3)
<foreach collection="" item="" open="" close="" separator=""></foreach>
Collection:表示接口中的方法参数的类型,如果是数组使用array,如果是list集合使用list
Item:自定义的,表示数组和集合成员的变量
Open:循环开始时的字符
Close:循环结束时的字符
Separator:集合成员之间的分隔符
foreach用法1
接口
//foreach用法1
List<User> selectFor(List<Integer> idlist);
Mapper
<select id="selectFor" resultType="org.example.daomain.User">
SELECT * FROM TEST1 WHERE p_id IN
<foreach collection="list" item="p_id" open="(" close=")" separator=",">
#{p_id}
</foreach>
</select>
测试类
@Test
public void selectFor(){
SqlSession sqlSession = MyBatisUtils.getSqlSessionAuto();
UserDao dao = sqlSession.getMapper(UserDao.class);
List<Integer> list =new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
List<User> users =dao.selectFor(list);
users.forEach(u -> System.out.println(u));
}
foreach用法2
接口
//foreach用法2 使用User对象
List<User> selectForTwo(List<User> userlist);
Mapper
<!--//foreach用法2使用对象-->
<select id="selectForTwo" resultType="org.example.daomain.User">
SELECT * FROM TEST1 WHERE p_id IN
<foreach collection="list" item="User" open="(" close=")" separator=",">
#{User.p_id}
</foreach>
</select>
测试类
@Test
public void selectForTwo(){
SqlSession sqlSession = MyBatisUtils.getSqlSessionAuto();
UserDao dao = sqlSession.getMapper(UserDao.class);
List<User> userslist =new ArrayList<>();
User u1 =new User();
u1.setP_id(1);
User u2 =new User();
u2.setP_id(2);
userslist.add(u1);
userslist.add(u2);
List<User> users = dao.selectForTwo(userslist);
users.forEach(u-> System.out.println(u));
}
动态sql-代码片段
Sql代码片段,就是多次复用的sql语法
步骤
定义:<sql id=”自定义名称唯一”>sql语句</sql>
使用:<include refid=”id的值”/>
案例
<sql id="SELCETSQL">
SELECT * FROM TEST1 WHERE p_id IN
</sql>
<select id="selectForTwo" resultType="org.example.daomain.User">
<include refid="SELCETSQL"/>
<foreach collection="list" item="User" open="(" close=")" separator=",">
#{User.p_id}
</foreach>
</select>
相关文章
- mybatis逆向生成java代码_mybatis生成
- Mybatis分页查询(通过SQL分页实现)[通俗易懂]
- Mybatis动态SQL的实现[通俗易懂]
- SpringBoot配置Mybatis:详细易懂「建议收藏」
- if sql语句_SQL IF语句介绍和概述
- Mybatis中Dao接口的工作原理
- Mybatis执行一个Sql的流程
- MyBatis中的JdbcType映射数据类型对照表
- springboot mybatis缓存_secure boot未正确配置
- mybatis中数据库的配置 (mysql8.0)
- 一文带你快速搭建框架(最全MyBatis笔记)
- Spark SQL报错:org.apache.spark.sql.catalyst.errors.package$TreeNodeException 排查记录
- 详解Mybatis一对多、多对一、多对多
- sql编程工具Sql Prompt下载及安装破解图文教程
- SpringBoot之(二):基础篇—SpringBoot+Mybatis+MySql增删改查详解程序员
- JAVAEE——SpringMVC第一天:介绍、入门程序、架构讲解、SpringMVC整合MyBatis、参数绑定、SpringMVC和Struts2的区别详解编程语言
- Mybatis 分表插件shardbatis2.x使用指南详解编程语言
- Springboot集成mybatis通用Mapper与分页插件PageHelper详解编程语言
- Mybatis自定义SQL拦截器详解编程语言
- MyBatis动态sql之choose、when、otherwise标签
- Maven搭建SSM(SpringMVC+Spring+MyBatis)框架入门教程(超级详细)
- MyBatis关联(级联)查询
- MySQL创建视图的SQL语句实例分析(mysql创建视图的sql语句)
- Linux下实现SQL语句的操作(linux执行sql语句)
- 利用SQL查询Redis中的数据(用sql查询redis)
- 学习MySQL如何使用SQL语句在MySQL中创建表(mysql中创建表sql)
- Oracle中的事务处理用SQL控制逻辑(oracle中事物sql)
- 大赛Oracle下一周SQL大赛谁能抱得美人归(oracle下一周sql)
- Oracle SQL遍历向数据库中求索无止境(oracle sql遍历)
- Oracle SQL实战从初学者到专家(oracle sql实战)
- 掌握Oracle SQL写法,激发你的SQL能力(oracle sql写法)