莱芜网站设计,网站新增关键词,专业做网站安全的sine安,互联网广告公司介绍#xff1a;
动态SQL是MyBatis提供的一种动态生成SQL语句的方式#xff0c;可以根据不同的条件生成不同的SQL语句#xff0c;从而实现更加灵活的查询和操作。
在MyBatis的映射文件中#xff0c;可以通过使用if、choose、when、otherwise、foreach等标签来实现动态SQL…介绍
动态SQL是MyBatis提供的一种动态生成SQL语句的方式可以根据不同的条件生成不同的SQL语句从而实现更加灵活的查询和操作。
在MyBatis的映射文件中可以通过使用if、choose、when、otherwise、foreach等标签来实现动态SQL。下面以if和foreach为例介绍如何在MyBatis映射文件中使用动态SQL。
动态sql概述 动态SQL是指在程序运行时生成SQL语句的技术而不是在编译期就已经确定SQL语句。动态SQL可以根据不同的条件来生成不同的SQL语句这样可以提高程序的灵活性和可扩展性。 动态SQL一般是通过一些程序库或框架实现的比较常见的有JDBC、Hibernate、MyBatis等。在这些框架中可以使用占位符或参数来动态生成SQL语句从而实现灵活的查询和更新操作同时也可以避免SQL注入等安全问题。 动态SQL一般用于需要根据条件动态生成SQL语句的情况比如搜索和过滤功能、动态排序、动态分页等。但是动态SQL也可能会增加系统的复杂度和性能开销需要谨慎使用。 动态sql使用
if 可以根据变量值控制语句块的执行
select idgetUserList parameterTypemap resultTypeUserSELECT * FROM userwhereif testname ! nullAND name #{name}/ifif testage ! nullAND age #{age}/if/where
/selectforeach标签用于动态生成IN操作符后面的值列表
select idgetUserList parameterTypemap resultTypeUserselectinclude refidBase_Column_List /from t_user where uid in foreach collectionuids itemuid separator,#{uid}/foreach
/selectMyBatis中#与$的区别 ##是理SQL预编译处理将传入的参数值替换成?占位符然后使用PreparedStatement对象执行SQL语句。使用#可以有效防止SQL注入攻击。 $$是占位符传参 预处字符串替换外在形式$传参不带引号.$传参存在SQL注入#传参自带引号将传入的参数值直接替换到SQL语句中。使用$可以灵活地构造SQL语句但也可能会导致SQL注入攻击。 MyBatis中的模糊查询有三种形式
1. 使用%通配符进行模糊查询
select idgetUserByNameLike parameterTypejava.lang.StringresultTypecom.example.UserSELECT * FROM user WHERE name LIKE CONCAT(%, #{name}, %)
/select
2. 使用_通配符进行模糊查询
select idgetUserByNameLike parameterTypejava.lang.StringresultTypecom.example.UserSELECT * FROM user WHERE name LIKE CONCAT(_, #{name}, _)
/select
3. 使用正则表达式进行模糊查询
select idgetUserByNameLike parameterTypejava.lang.StringresultTypecom.example.UserSELECT * FROM user WHERE name REGEXP #{name}
/select
MyBatis中的结果映射
MyBatis中的结果映射是指将查询结果与Java对象之间进行映射的过程。MyBatis支持多种结果映射方式包括自动映射和手动映射。其中自动映射是根据结果集中列名与Java对象中属性名之间的对应关系进行映射而手动映射则需要通过编写映射配置文件来指定查询结果中的列名与Java对象中属性名之间的对应关系。
Mybatis的分页原理
在MyBatis内部定义了一个拦截器接口,其中一个关键的方法就是intercept,从而实现拦截 来,我们看看这个接口的定义 分页插件的原理就是使用MyBatis提供的插件接口,实现自定义插件,在插件的拦截方法内,拦截待执行的SQL,然后根据设置的dialect(方言),和设置的分页参数,重写SQL ,生成带有分页语句的SQL,执行重写后的SQL,从而实现分页
插件分页
Mybatis提供了一个插件PageHelper可以方便地进行分页查询。使用PageHelper只需要在查询方法前调用PageHelper.startPage方法然后就可以进行分页查询了。
?xml version1.0 encodingUTF-8?project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersiongroupIdorg.example/groupIdartifactIdmybatis01/artifactIdversion1.0-SNAPSHOT/versionpackagingwar/packagingnamemybatis01 Maven Webapp/name!-- FIXME change it to the projects website --urlhttp://www.example.com/urlpropertiesmaven.compiler.source1.8/maven.compiler.sourcemaven.compiler.target1.8/maven.compiler.target/propertiesdependencies!-- ********************** junit单元测试依赖 ********************** --dependencygroupIdjunit/groupIdartifactIdjunit/artifactIdversion4.12/version
!-- scopetest/scope--/dependency!-- ********************** Java Servlet API ********************** --dependencygroupIdjavax.servlet/groupIdartifactIdjavax.servlet-api/artifactIdversion4.0.0/versionscopeprovided/scope/dependency!-- ********************** Mybatis依赖 ********************** --dependencygroupIdorg.mybatis/groupIdartifactIdmybatis/artifactIdversion3.4.5/version/dependency!-- ********************** Mybatis的分页依赖********************** --dependency groupIdcom.github.pagehelper/groupId artifactIdpagehelper/artifactIdversion5.1.2/version/dependency!-- ********************** Mysql JDBC驱动 ********************** --dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion5.1.44/version/dependency!-- ********************** 日志配置 ********************** --!--记得修改mybatis.cfg.xml添加如下内容--!--setting namelogImpl valueLOG4J2/--!--核心log4j2jar包--dependencygroupIdorg.apache.logging.log4j/groupIdartifactIdlog4j-core/artifactIdversion2.9.1/version/dependencydependencygroupIdorg.apache.logging.log4j/groupIdartifactIdlog4j-api/artifactIdversion2.9.1/version/dependency!--web工程需要包含log4j-web非web工程不需要--dependencygroupIdorg.apache.logging.log4j/groupIdartifactIdlog4j-web/artifactIdversion2.9.1/version/dependency/dependenciesbuildfinalNamemybatis01/finalNameresources!--解决mybatis-generator-maven-plugin运行时没有将XxxMapper.xml文件放入target文件夹的问题--resourcedirectorysrc/main/java/directoryincludesinclude**/*.xml/include/includes/resource!--解决mybatis-generator-maven-plugin运行时没有将jdbc.properites文件放入target文件夹的问题--resourcedirectorysrc/main/resources/directoryincludesincludejdbc.properties/includeinclude*.xml/include/includes/resource/resourcespluginsplugingroupIdorg.mybatis.generator/groupIdartifactIdmybatis-generator-maven-plugin/artifactIdversion1.3.2/versiondependencies!--使用Mybatis-generator插件不能使用太高版本的mysql驱动 --dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion5.1.44/version/dependency/dependenciesconfigurationoverwritetrue/overwrite/configuration/pluginpluginartifactIdmaven-clean-plugin/artifactIdversion3.1.0/version/plugin!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging --pluginartifactIdmaven-resources-plugin/artifactIdversion3.0.2/version/pluginpluginartifactIdmaven-compiler-plugin/artifactIdversion3.8.0/version/pluginpluginartifactIdmaven-surefire-plugin/artifactIdversion2.22.1/version/pluginpluginartifactIdmaven-war-plugin/artifactIdversion3.2.2/version/pluginpluginartifactIdmaven-install-plugin/artifactIdversion2.5.2/version/pluginpluginartifactIdmaven-deploy-plugin/artifactIdversion2.8.2/version/plugin/plugins/build
/project
mybatis.cfg.xml 配置文件
?xml version1.0 encodingUTF-8?
!DOCTYPE configuration PUBLIC -//mybatis.org//DTD Config 3.0//EN http://mybatis.org/dtd/mybatis-3-config.dtd
configuration!-- 引入外部配置文件 --properties resourcejdbc.properties/settingssetting namelogImpl valueLOG4J2//settings!-- 别名 --typeAliasestypeAlias typecom.Kissship.model.Book aliasBook//typeAliasesplugins!-- 配置分页插件PageHelper, 4.0.0以后的版本支持自动识别使用的数据库 --plugin interceptorcom.github.pagehelper.PageInterceptor/plugin/plugins!-- 配置mybatis运行环境 --environments defaultdevelopmentenvironment iddevelopment!-- typeJDBC 代表使用JDBC的提交和回滚来管理事务 --transactionManager typejdbc/!-- mybatis提供了3种数据源类型分别是POOLED,UNPOOLED,JNDI --!-- POOLED 表示支持JDBC数据源连接池 --!-- UNPOOLED 表示不支持数据源连接池 --!-- JNDI 表示支持外部数据源连接池 --dataSource typePOOLEDproperty namedrivervalue${jdbc.driver}/property nameurlvalue${jdbc.url}/property nameusername value${jdbc.username}/property namepassword value${jdbc.password}//dataSource/environment/environmentsmappersmapper resourcecom/Kissship/mapper/BookMapper.xml//mappers
/configuration
PageBean的分页工具类
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 page1;//每页显示记录数private int rows10;//总记录数private int total0;//是否分页private boolean isPaginationtrue;//上一次的请求路径private String url;//获取所有的请求参数private MapString,String[] map;public PageBean() {super();}//设置请求参数public void setRequest(HttpServletRequest req) {String pagereq.getParameter(page);String rowsreq.getParameter(rows);String paginationreq.getParameter(pagination);this.setPage(page);this.setRows(rows);this.setPagination(pagination);this.urlreq.getContextPath()req.getServletPath();this.mapreq.getParameterMap();}public String getUrl() {return url;}public void setUrl(String url) {this.url url;}public MapString, String[] getMap() {return map;}public void setMap(MapString, String[] 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 totalpagethis.total/this.rows;if(this.total%this.rows!0)totalpage;return totalpage;}/*** 下一页* return*/public int getNextPage() {int nextPagethis.page1;if(this.pagethis.getMaxPage())nextPagethis.getMaxPage();return nextPage;}/*** 上一页* return*/public int getPreivousPage() {int previousPagethis.page-1;if(previousPage1)previousPage1;return previousPage;}Overridepublic String toString() {return PageBean [page page , rows rows , total total , isPagination isPagination ];}
} BookDto
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.xml
!-- 分页查询的动态SQL--select idBookListPager resultTypejava.util.Map parameterTypejava.util.Map
select * from
t_mvc_book
where bname like
concat(concat(%,#{bname}),%)
/select
BookMapper接口中增加以下代码
ListMap BookListPager(Map map); 在创建的对象接口中增加以下代码
ListMap BookListPager(Map map, PageBean pageBean); 在接口实现类中增加以下代码 Overridepublic ListMap BookListPager(Map map, PageBean pageBean) {if (pageBean ! null pageBean.isPagination()){PageHelper.startPage(pageBean.getPage(),pageBean.getRows());}ListMap list bookMapper.BookListPager(map);if(pageBean ! null pageBean.isPagination()){PageInfo pageInfo new PageInfo(list);System.out.println(页码:pageInfo.getPageNum());System.out.println(页大小:pageInfo.getPageSize());System.out.println(总记录:pageInfo.getTotal());pageBean.setTotal(pageInfo.getTotal());}return list;}
Demo1测试 Testpublic 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应用程序。