mybatis(动态sql及分页)

mybatis-动态sql及分页

  • [1. 动态sql简述](#1. 动态sql简述)
  • [2. 动态sql示例](#2. 动态sql示例)
    • [2.1 if](#2.1 if)
    • [2.2 choose](#2.2 choose)
    • [2.3 foreach](#2.3 foreach)
    • [2.4 sql 及 include](#2.4 sql 及 include)
    • [2.5 sql中的特殊字符](#2.5 sql中的特殊字符)
  • [3. 后台分页实现](#3. 后台分页实现)
  • [4. 数据版本号处理并发问题](#4. 数据版本号处理并发问题)

1. 动态sql简述

mybatis的动态sql语句是基于OGNL表达式的。可以方便的在sql语句中实现某些逻辑. 总体说来mybatis动态SQL语句主要有以下几类:

复制代码
if 语句 (简单的条件判断)
choose (when,otherwize) ,相当于java 语言中的 switch ,与 jstl 中的choose 很类似
trim (对包含的内容加上 prefix,或者 suffix 等,前缀,后缀)
where (主要是用来简化sql语句中where条件判断的,能智能的处理 and or ,不必担心多余导致语法错误)
set (主要用于更新时)
foreach (在实现 mybatis in 语句查询时特别有用)

2. 动态sql示例

2.1 if

以修改功能为例,演示if的用法

1)mapper层(即Dao层)


2)在service层增加对应的方法

3)在测试类中加入对应的方法进行测试

2.2 choose

以查询功能为例,演示choose

1)mapper层


2)在service层增加对应的方法

3)在测试类中加入对应的方法进行测试

2.3 foreach

在查询中使用in条件,以此演示foreach用法

1)建立VO对象使用List集合存放要查询的sid集合。

注:使用这种方式是为了讲述VO,model,entity之间的区别,vo被称为值对象,用来存放参数或页面显示的视图数据,它与数据库中的表没有对应关系,这一点与model和entity不同。

是否使用vo对象则看个人习惯,查询参数与页面视图数据也可以使用Map来存放。

2)mapper

3)service层

4)测试

2.4 sql 及 include

创建可复用的sql片段,通过include使用

2.5 sql中的特殊字符

在xml中,"<"、">"、"&"等字符是不能直接存入的,否则xml语法检查时会报错,如果想在xml中使用这些符号。在sql中需要使用这些特殊字符,可以使用以下两种方式处理:

复制代码
1)转义: >(>) <(<) &(&) 空格( )
2)使用<![CDATA[]]>标签,示例:
javascript 复制代码
<select parameterType="java.util.HashMap" resultMap="userInfo1"> 
     <![CDATA[ SELECT newsEdit,newsId, newstitle FROM shoppingGuide WHERE 1=1 AND newsday > #{startTime} AND newsday <= #{endTime} ]]>
     <if test="etidName!=''"> AND newsEdit=#{etidName} </if> 
 </select> 
 
 # 因为这里有 ">" "<=" 特殊字符所以要使用 <![CDATA[ ]]> 来注释,但是有<if> 标签,所以把<if>等 放外面

3. 后台分页实现

在大数据量查询时,往往需要数据库端分页,mybatis的分页功能是基于内存的,可以使用pagehelper来实现后端分页。

1) 导入依赖的包

javascript 复制代码
<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>5.1.2</version>
</dependency>

2)将插件配置到mybatis.cfg.xml 中

javascript 复制代码
<plugins>
    <!-- 分页插件 -->
    <plugin interceptor="com.github.pagehelper.PageInterceptor">    
    </plugin>
</plugins>

3)service层

4)测试类

4. 数据版本号处理并发问题

数据版本号是处理并发问题的比较简单易行的方法,实现方式为:在数据库表中加入一个数据版本号的字段(如果:version)每当数据修改时,处理维护需要修改的数据还要同时维护数据的版本号,将数据的版本号加1,在执行修改时,需要判断数据库中的数据版本号是否是当时获取数据时的版本号,如果不是则说明数据已过期不能执行跟新,此时可能抛出一个异常说明数据已过期。

相关推荐
萧鼎7 分钟前
深度探索 Py2neo:用 Python 玩转图数据库 Neo4j
数据库·python·neo4j
m0_653031361 小时前
腾讯云认证考试报名 - TDSQL数据库交付运维专家(TCCE MySQL版)
运维·数据库·腾讯云
power 雀儿1 小时前
集群聊天服务器---MySQL数据库的建立
服务器·数据库·mysql
骑着王八撵玉兔3 小时前
【性能优化与架构调优(二)】高性能数据库设计与优化
数据库·性能优化·架构
想要入门的程序猿4 小时前
Qt写入excel
数据库·qt·excel
Q_970956394 小时前
java+vue+SpringBoo校园失物招领网站(程序+数据库+报告+部署教程+答辩指导)
java·数据库·vue.js
Wyc724094 小时前
Maven
java·数据库·maven
程序猿小D4 小时前
[附源码+数据库+毕业论文]基于Spring+MyBatis+MySQL+Maven+jsp实现的电影小说网站管理系统,推荐!
java·数据库·mysql·spring·毕业设计·ssm框架·电影小说网站
羊小猪~~4 小时前
数据库学习笔记(十七)--触发器的使用
数据库·人工智能·后端·sql·深度学习·mysql·考研
背太阳的牧羊人5 小时前
Neo4j 的向量搜索(Neo4jVector)和常见的向量数据库(比如 Milvus、Qdrant)之间的区别与联系
数据库·neo4j·milvus