动态SQL是MyBatis提供的一种动态生成SQL语句的方式,可以根据不同的条件生成不同的SQL语句,从而实现更加灵活的查询和操作。
在MyBatis的映射文件中,可以通过使用if、choose、when、otherwise、foreach等标签来实现动态SQL。下面以if和foreach为例,介绍如何在MyBatis映射文件中使用动态SQL。
动态SQL是指在程序运行时生成SQL语句的技术,而不是在编译期就已经确定SQL语句。动态SQL可以根据不同的条件来生成不同的SQL语句,这样可以提高程序的灵活性和可扩展性。
动态SQL一般是通过一些程序库或框架实现的,比较常见的有JDBC、Hibernate、MyBatis等。在这些框架中,可以使用占位符或参数来动态生成SQL语句,从而实现灵活的查询和更新操作,同时也可以避免SQL注入等安全问题。
动态SQL一般用于需要根据条件动态生成SQL语句的情况,比如搜索和过滤功能、动态排序、动态分页等。但是,动态SQL也可能会增加系统的复杂度和性能开销,需要谨慎使用。
- #:#是理SQL,预编译处理,将传入的参数值替换成?占位符,然后使用PreparedStatement对象执行SQL语句。使用#可以有效防止SQL注入攻击。
- $:$是占位符传参, 预处字符串替换,外在形式,$传参不带引号,.$传参存在SQL注入,#传参自带引号,将传入的参数值直接替换到SQL语句中。使用$可以灵活地构造SQL语句,但也可能会导致SQL注入攻击。
1. 使用%通配符进行模糊查询:
2. 使用_通配符进行模糊查询:
3. 使用正则表达式进行模糊查询:
MyBatis中的结果映射是指将查询结果与Java对象之间进行映射的过程。MyBatis支持多种结果映射方式,包括自动映射和手动映射。其中,自动映射是根据结果集中列名与Java对象中属性名之间的对应关系进行映射,而手动映射则需要通过编写映射配置文件来指定查询结果中的列名与Java对象中属性名之间的对应关系。
在MyBatis内部定义了一个拦截器接口,其中一个关键的方法就是intercept,从而实现拦截 来,我们看看这个接口的定义 分页插件的原理就是使用MyBatis提供的插件接口,实现自定义插件,在插件的拦截方法内,拦截待执行的SQL,然后根据设置的dialect(方言),和设置的分页参数,重写SQL ,生成带有分页语句的SQL,执行重写后的SQL,从而实现分页
Mybatis提供了一个插件PageHelper,可以方便地进行分页查询。使用PageHelper只需要在查询方法前调用PageHelper.startPage方法,然后就可以进行分页查询了。
4.0.0
org.example
mybatis01
1.0-SNAPSHOT
war
mybatis01 Maven Webapp
http://www.example.com
1.8
1.8
junit
junit
4.12
javax.servlet
javax.servlet-api
4.0.0
provided
org.mybatis
mybatis
3.4.5
com.github.pagehelper pagehelper
5.1.2
mysql
mysql-connector-java
5.1.44
org.apache.logging.log4j
log4j-core
2.9.1
org.apache.logging.log4j
log4j-api
2.9.1
org.apache.logging.log4j
log4j-web
2.9.1
mybatis01
src/main/java
**/*.xml
src/main/resources
jdbc.properties
*.xml
org.mybatis.generator
mybatis-generator-maven-plugin
1.3.2
mysql
mysql-connector-java
5.1.44
true
maven-clean-plugin
3.1.0
maven-resources-plugin
3.0.2
maven-compiler-plugin
3.8.0
maven-surefire-plugin
2.22.1
maven-war-plugin
3.2.2
maven-install-plugin
2.5.2
maven-deploy-plugin
2.8.2
package com.zhnaghao.utils;
import javax.servlet.http.HttpServletRequest;
import java.io.Serializable;
import java.util.Map;
/**
* @author zhnaghao
* @site www.zhnaghao.com
* @company s公司
* @create 2023-08-15-15:42
*/
public class PageBean implements Serializable {
private static final long serialVersionUID = 2422581023658455731L;
//页码
private int page=1;
//每页显示记录数
private int rows=10;
//总记录数
private int total=0;
//是否分页
private boolean isPagination=true;
//上一次的请求路径
private String url;
//获取所有的请求参数
private Map map;
public PageBean() {
super();
}
//设置请求参数
public void setRequest(HttpServletRequest req) {
String page=req.getParameter("page");
String rows=req.getParameter("rows");
String pagination=req.getParameter("pagination");
this.setPage(page);
this.setRows(rows);
this.setPagination(pagination);
this.url=req.getContextPath()+req.getServletPath();
this.map=req.getParameterMap();
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public Map getMap() {
return map;
}
public void setMap(Map map) {
this.map = map;
}
public int getPage() {
return page;
}
public void setPage(int page) {
this.page = page;
}
public void setPage(String page) {
if(null!=page&&!"".equals(page.trim()))
this.page = Integer.parseInt(page);
}
public int getRows() {
return rows;
}
public void setRows(int rows) {
this.rows = rows;
}
public void setRows(String rows) {
if(null!=rows&&!"".equals(rows.trim()))
this.rows = Integer.parseInt(rows);
}
public int getTotal() {
return total;
}
public void setTotal(int total) {
this.total = total;
}
public void setTotal(String total) {
this.total = Integer.parseInt(total);
}
public boolean isPagination() {
return isPagination;
}
public void setPagination(boolean isPagination) {
this.isPagination = isPagination;
}
public void setPagination(String isPagination) {
if(null!=isPagination&&!"".equals(isPagination.trim()))
this.isPagination = Boolean.parseBoolean(isPagination);
}
/**
* 获取分页起始标记位置
* @return
*/
public int getStartIndex() {
//(当前页码-1)*显示记录数
return (this.getPage()-1)*this.rows;
}
/**
* 末页
* @return
*/
public int getMaxPage() {
int totalpage=this.total/this.rows;
if(this.total%this.rows!=0)
totalpage++;
return totalpage;
}
/**
* 下一页
* @return
*/
public int getNextPage() {
int nextPage=this.page+1;
if(this.page>=this.getMaxPage())
nextPage=this.getMaxPage();
return nextPage;
}
/**
* 上一页
* @return
*/
public int getPreivousPage() {
int previousPage=this.page-1;
if(previousPage<1)
previousPage=1;
return previousPage;
}
@Override
public String toString() {
return "PageBean [page=" + page + ", rows=" + rows + ", total=" + total + ", isPagination=" + isPagination
+ "]";
}
}
package com.zhagnhao.Dto;
import com.zhagnhao.model.Book;
/**
* @author zhagnhao
* @site www.zhagnhao.com
* @company s公司
* @create 2023-08-15-15:42
*/
public class BookDto extends Book {
private float max;
private float min;
public float getMax() {
return max;
}
public void setMax(float max) {
this.max = max;
}
public float getMin() {
return min;
}
public void setMin(float min) {
this.min = min;
}
}
BookMapper接口中增加以下代码:
List
在创建的对象接口中增加以下代码:
List
在接口实现类中增加以下代码:
@Override
public List
@Test
public void BookList(){
Map map = new HashMap();
map.put("bname","圣墟");
PageBean pageBean = new PageBean();
//第几页
pageBean.setPage(1);
//显示多少数据
pageBean.setRows(10);
bookBiz.BookListPager(map,pageBean);
总之,MyBatis通过映射和动态SQL的方式,为我们提供了非常灵活和高效的数据库访问解决方案,可以帮助我们快速开发高质量的Java应用程序。