分享好友 最新动态首页 最新动态分类 切换频道
21.<sql id="sqlId">与<include refid="sqlId">重用sql
2024-12-27 03:41

com.github.pagehelper.PageHelper

github上的一个基于mybatis的分页插件PageHelper

 

原理

1.1把计算好的分页放到线程变量中

1.2在mybatis查询,会进入到拦截器中,根据这个线程变量看是否要分页

PageHelper实现分页原理 - 十黎九夏 - 博客园

1.3多数据源适配分页(关于auto-dialect: true是网上看到的  没有亲自尝试

 
 
 

参考文章

使用Pagehelper进行分页时下一页没有数据依旧有数据返回_花儿小新♥-CSDN博客

 
 
 
 
 

之前我没加@Param  报了500 说找不到idList参数

如果是collection,默认是collection="list"

接上边那一点

参考

MyBatis(映射文件中使用foreach标签时报错,属性collection的问题

MyBatis,在foreach标签对中,使用List类型参数时,collection属性到底怎么写_HairyCoder的博客-CSDN博客

默认collection='list' 但是如果mapper中使用了@Param("") ,collection就得按照@Param指定的值

 
 
 

5.1.1resultMap是xml中定义的<resultMap>标签的id

 
 

5.1.2resultType需要写返回类的全路径

 
 

 5.2.1resultType对应pojo与数据库字段应一一对应

5.2.2 如果数据库中有下划线分割

如数据库字段为user_name,自定义实体属性为userName,可以在application.yml中开启驼峰自动转换

 

或者application.properties中

 
 

5.3.1目前,在我的实际应用中,一般java提供的类如String,Integer的才会用resultType,而自定义的类,一般都用resultMap做字段与实体类属性的映射

5.3.2根据阿里的开发手册,也是resultMap优先

为了解耦

 我用了mybatis分页拦截PageHelper,再执行过程中后边加了LIMIT,然后因为这个<select>里边已经写了分号,所以整个的sql就变成了.....;LIMIT  ,看到了吧,limit前边有个分号,自然执行出错

如果你不涉及到分页,那这样写可能不会报错

以下为理论知识没有亲自实践

databaseId

比如你写了了两个select   id一样  然后就databaseId不一样  一个是mybasql  一个是oracle 那么当url配置的是达梦时候就会执行dm那个select  当url配置的是h2时候就会执行h2那个select

加上databaseId这个属性  属性值和url中jdbc:后边的值一致

 
 

 为什么我会碰到这个知识点,因为踩了一个坑

公司要从mysql数据库切换到达梦数据库,然后遇到一个字段begin是关键字,切换为达梦后执行是有问题的。

我采取的几种方式

1.我之前的方式是把字段给改了名字begin->beginDM。

2.然后又考虑到有别人用所以又把名字改回去beginDM->begin,并且把关键字加了双引号 "begin"。

3.但是,如果哪天我们再切换成别的数据库怎么办?所以,搜索了mybatis如何兼容多种数据库databaseId

 

mybatis在把sql传入DBMS之前,先动态解析,再预编译

 

${}在动态解析那步,就进行字符串替换,所以我们在控制台能看到即将执行的sql

#{}在预编译那步,才替换为?  所以我们在控制台看到的是带?的sql

8.1.1正例

如想执行的sql是select id from user where user_name = #{userName}

然后入参userName为 张三 那预编译就变成'张三' 即 select id from user where user_name = '张三'

8.1.2反例

如想执行的sql是select id from #{table} where user_name = '张三'

然后传入user 那么sql就变成了 select id from 'user' where user_name = '张三'

此时sql无法执行

所以上一个反例  应该写成select id from ${table} where user_name = #{username}

因为容易出现sql注入,${}是一个简单的String替换,字符串是什么,解析就是什么

${}不安全,容易引起sql注入,举个栗子

 

如果我的tableName传入的是

 

那么完整的sql就变成了

 

其中--where name =?就变成了注释 不会执行  而且还把我user表删了  所以确实不安全

<where>标签

 
 
 
 
 

<where>是把第一个and去掉,set是把最后一个逗号,去掉

如下sql,就算classname为空,执行也不会报错

 
 

以上,<where>和<set>可以看作<trim>的简写

<where>相当于<trim prefix="where"  prefixOverrides="and | or">

<set>相当于<trim prefix="set"  suffixOverrides=",">

批量插入

 

separator表示分割方式  separator="," 就是用逗号,隔开

比如写一个批量插入的sql

INSERT INTO `devdb`.`testorder`(`order1`, `order2`) VALUES (1, 2),(3,4),(3,4),(3,4),(3,4),(3,4),(3,4);

hibernate无法自定义组装sql,对于复杂关联表以及复杂sql支持弱

但是开发速度快,省事

如果一个项目要求几天开发完,首选hibernate

但是hibernate性能不如mybatis

目前只知道mybatis这种模式与动态代理有关:通过Mapper 动态代理机制,可以只编写接口以及方法的定义

xml的namespace是mapper的全路径名

 
 

@Mapper或者@MapperScan扫描mapper,

mybatis:mapper-locations扫描xml文件

怎么注册成bean?我的理解:通过mybatis-spring中间件,把扫描到的注册成bean

 
 

作用

1.直接扫描路径,不用每个接口上都写@Mapper : 在接口类上添加了@Mapper,在编译之后会生成相应的接口实现类

2.指定要变成实现类的接口所在的包,然后包下面的所有接口在编译之后都会生成相应的实现类

到现在,我也一直觉得,mybatis的xml就相当与mapper接口的实现类,不然我们怎么都用@Autowired注入mapper接口

如果对象中有有参得构造方法,需要再mybatis中配置<constructor>,否则mybatis无法实例化对象

查出来数据需要转化成对象时,要用到那个对象得构造方法

数据库主键设置为自动递增时,程序在insert前不知道新的主键是什么

 

原理:数据库产生过的最大主键加1

比如最大主键101,把他删了,再插入一条,主键就是102

同mysql函数

 

复杂写法

 

selectkey中 order为after 是先插入数据后拿到主键

 
 
 
 

把涉及到的参数都整理到实体里,然后改一下parameterType就行  

23.1.mapper接口需要继承

 

23.2.namespace要一致,xml的namespace要使用子接口的全路径名

Pf1001BaseMapper.xml

 

Pf1001Mapper.xml

 
 

实际应用踩坑

mybatis的自动生成插件生成了mapper A和xml A之后  我新增了extendMapper B 和extendXml B  在mapper B中继承了mapper A

我在B中想使用A的resultMap  但是执行时报B中没有这个resultMap  原因是我xml A中的namespace没有改成mapper B

注意这里

最新文章
新闻资讯-突发消息!英国GCSE/Alevel或将引入AI技术出题,新趋势不可逆转
目前,GPT等AI工具已经完全融入了学习教育,改变了很多方面。而根据英国媒体的zui新消息,Ofqual负责人建议英国考试委员会应考虑使用AI来撰写GCSE和Alevel试卷。01“创作一份试题需要2年”考试监管机构相关临时负责人伊恩·鲍克汉姆爵士表
百度快照优化攻略,高效策略助力企业网络曝光升级
百度快照推广通过高效优化策略,助力企业快速提升网络曝光度,扩大品牌影响力,抢占市场先机。精准定位目标客户,提升搜索引擎排名,实现高效。随着互联网的快速发展,企业间的竞争日益激烈,如何在众多竞争者中脱颖而出,成为每个企业关注
Python ML常用库安装-详细滴
官网:tensorflow官网 1.CPU版本:2.GPU版本:安装预览版本(非稳定版本):3.导入(import)tensorflow出现DDL问题: vc_redist.x64.exe地址:下载地址 4.tensorflow的GPU版本前置cuda和cudnn要求:
韵云电脑软件,一款实用好用的云电脑选择
江山如画,云间电脑,仙子何方?试问世间,哪款软件,独领风骚?千古兴亡,岁月如梭,电子云舟,载我前行,欲觅良伴,指点江山,谈笑风生,今吾赋诗,以颂云电脑之佳选。吾观软件,犹如明珠,光华四射,首选“华为云电脑”,此乃国产之瑰宝
黄鹤楼(硬)红景天多少钱一包 黄鹤楼硬红景天价格
黄鹤楼红景天源自于西藏,相信很多朋友都见过了也抽过了,藏烟只接触过一次黄鹤楼的红景天,感觉还是不错的,黄鹤楼(硬)红景天多少钱一包?下面香烟网小编为大家整理介绍目前市面上现有的两款黄鹤楼硬红景天价格。黄鹤楼硬红景天价格1、黄鹤
指导大家微信红包透视专用开挂神器玩家必备神器
亲,天天麻将这款游戏可以开挂的,确实是有挂的,很多玩家在天天麻将这款游戏中打牌都会发现很多用户的牌特别好,总是好牌,而且好像能看到-人的牌一样。所以很多小伙伴就怀疑这款游戏是不是有挂,实际上这款游戏确实是有挂的,添加客服微
全国性服务低成本付费投流广告推荐 汽车投流 专属定制
  信息流付费获客是一种营销策略,通过在信息流平台上购买广告位或推广服务,向用户展示相关的内容,从而吸引用户点击和转化为付费用户。  在进行信息流付费获客时,可以选择以下几种方式:  1. 广告投放:在信息流平台上购买广告位
许冠文黄子华打破戏路,口碑港片《破·地狱》如何“破”题生死?
一个专拍喜剧的导演陈茂贤,两代“喜剧之神”许冠文和黄子华,却合力拍出一部严肃讨论生死话题的电影《破·地狱》。电影从半路出家的殡仪经纪魏道生(黄子华 饰)和古板守旧的喃呒师傅郭文(许冠文 饰)的故事中观照人生,带出对生命和死亡
高效流量入口攻略,引流搭建实用指南
本指南提供引流搭建的实用步骤,助你打造高效流量入口。涵盖选择、优化内容、利用SEO策略、社交媒体推广等多方面技巧,确保吸引目标用户,提升流量率。方向精炼架构搜索引擎优化(SEO)策略社交媒体营销推广邮件营销策略数据驱动分析与持续
搭建专业从零开始攻略
从零搭建专业,首先选择合适的建设,如WordPress,购买域名和主机。安装并配置,设计布局,添加内容,优化SEO,最后进行与。整个过程中需关注用户体验和搜索引擎优化,确保既美观又实用。挑选理想的主机购置主机配置主机提升性能与更新在数
相关文章
推荐文章
发表评论
0评