这也许是你不曾留意过的 Mybatis 细节

转载自  这也许是你不曾留意过的 Mybatis 细节

Mybatis 可以说是 Java 后端的必备技能,可能你和我一样经常使用到它。但有时 cv 多了,会忘记了一些细节处理,比如为什么要加上这个注解?它的作用是什么等等。

这篇文章是我以前写的一些关于 Mybatis 细节,希望对各位有起到查漏补缺的作用。

1. 配置文件

SqlMapConfig.xml 文件各参数介绍:

<configuration><!-- 加载属性文件 --><properties resource="jdbc.properties"><!--properties中还可以配置一些属性名和属性值  --><!-- <property name="jdbc.driver" value=""/> --></properties><!-- 全局配置参数,需要时再设置 --><settings><!-- 打开延迟加载的开关,默认为false --><setting name="lazyLoadingEnabled" value="true"/><!-- 开启二级缓存,默认为true --><setting name="cacheEnabled" value="true"/><!-- 使用jdbc的getGeneratedKeys获取数据库自增主键值 --><setting name="useGeneratedKeys" value="true"/></settings><!-- 别名定义 --><typeAliases><!-- 针对单个别名定义type:类型的路径,alias:别名。示例:--><typeAlias type="com.czd.mybatis.po.User" alias="user"/><!-- 批量别名定义指定包名,mybatis自动扫描包中的po类,自动定义别名,别名就是类名(首字母大写或小写都可以)--><package name="com.czd.mybatis.po"/></typeAliases><!-- 和spring整合后 environments配置将废除--><environments default="development"><environment id="development"><!-- 使用jdbc事务管理,事务控制由mybatis--><transactionManager type="JDBC"/><!-- 数据库连接池,由mybatis管理--><dataSource type="POOLED"><property name="driver" value="${jdbc.driver}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/></dataSource></environment></environments><!--加载映射文件有 3 种方法,如下所示-->
<mappers> 
<mapper resource="sqlmap/User.xml"/><!--1. 通过 resource 方法一次加载一个映射文件 --><!-- <mapper resource="mapper/UserMapper.xml"/> --><!-- 2. 通过 mapper 接口加载单个映射文件遵循一些规范:需要将 mapper 接口类名和 mapper.xml 映射文件名称保持一致,且在一个目录中--><!-- <mapper class="com.iot.mybatis.mapper.UserMapper"/> --><!-- 3. 批量加载 mapper指定 mapper 接口的包名,mybatis 自动扫描包下边所有 mapper 接口进行加载遵循一些规范:需要将 mapper 接口类名和 mapper.xml映射文件名称保持一致,且在一个目录中--><package name="com.czd.mybatis.mapper"/><mappers/>

 

2. # 和 $ 的区别

使用 #{parameterName} 引用参数的时候,Mybatis 会把这个参数认为是一个字符串,例如在下面的 sql 传入参数 “Smith”,

Select from emp where name = #{employeeName}

就会被转换为: 

Select from emp where name = ‘Smith’;

同理在下面 sql 传入参数 “Smith”:

Select from emp where name = ${employeeName}

使用的时候就会被转换为 :

Select from emp where name = Smith;

简单来说, #{} 是经过预编译的,是安全的,而 ${} 是未经过预编译的,仅仅是取变量的值,是非安全的,存在 sql 注入的危险。# 将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。

使用 ${} 的情况,order by、like 语句只能用 ${} 了,用 #{} 会多个 ’ ’ 导致 sql 语句失效.此外动态拼接 sql,模糊查询时也要用 ${}。

举个栗子,假如 name=陈,那么该 sql 就是 ... LiKE '%陈%',

DELETE FROM stu WHERE `name` LIKE '%${name}%'

上面话有点长,这里小小总结下:

  • #{} :编译好 SQL 语句再取值

  • ${} :取值以后再去编译SQL语句

 

3. SQL 语句中的列名与关键字冲突时怎么办

比如:name 字段。

解决方法:在列名两边加上两个 ` 即可,如下:

DELETE FROM stu WHERE `name` LIKE '%${name}%'

 

4. 列名和 bean 属性名不一样,导致获取不到数据时怎么办

那么为什么会导致查询的 SQL 语句无法得到正确结果呢?

因为 mybatis 会通过反射得到 bean ,由于字段名和属性名不一样,导致无法将查询到的表字段数据 set 到 bean 属性中。

解决方法: 
【不推荐】修改表字段名称或 bean 属性名称,使它们同名即可

【推荐】修改 标签中的相应内容,如下图所示 

 

 

5. @Param 参数的作用

作用:相当于给其修饰的参数指定一个别名。

若接口只有一个参数则可以不用指定别名,List 参数除外。当有多个参数时一定要指定,否则 mybatis 映射不到对应的字段。

如下代码:

List<Book> queryAll(@Param("offset")int offset, @Param("limit")int limit);

该接口方法对应的 mapper 实现如下:

<select id="queryAll" resultType="Book">SELECTbook_id,`name`,`number`FROMbookORDER BYbook_idLIMIT #{offset}, #{limit}
</select>

可以看到 #{} 里面的值是和 @Param("value") 保持一致的,也一定要一致,否则 mybatis 会找不到这个值而导致报错。另外,@Param("value") 中的 value 可以是任意的。

参考:

https://github.com/liyifeng1994/ssm

https://github.com/brianway/springmvc-mybatis-learning/blob/master/sourcecode/mybatis/config/SqlMapConfig.xml 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/324461.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Nacos整合Ribbon实现客户端负载均衡

启动类去掉RibbonClient注解 10 50 100 1 权重优先调用 注意:启动类加RibbonClient注解 2 集群优先调用 3 元数据基于版本优先调用

ssl1344-Knights【最大独立集,最大匹配,图论】

正题 大意 求在一个扣掉m个格子的n*n的棋盘能放置的最多的马。 解题思路 求最大独立集就好了&#xff0c;最大独立集点数-最大匹配数。最重要的是如何建图。定义一个数组point[i][j]表示点的编号。但是如果这样的话就会O(n4)O(n4)就会超时。现在我们把棋盘从左到右后从上到…

小课堂?小视频?小商店?

今天&#xff0c;没有什么特别内容可更新&#xff0c;就来随便聊聊吧。01雄雄的小课堂这是一个公众号&#xff0c;内容主要有两大类。一类是以分享编程技术为主&#xff0c;一方面是为了提升自己&#xff0c;另一方面也是为了帮助别人&#xff0c;希望阅者有益&#xff0c;平时…

Entity Framework Core 软删除与查询过滤器

注意&#xff1a;我使用的是 Entity Framework Core 2.0 (2.0.0-preview2-final)。正式版发布后&#xff0c;功能可能存在变动。 继续探索Entity Framework Core 2.0&#xff0c;今天我将探讨如何轻松使用软删除&#xff08;或逻辑删除&#xff09;。我的意思是以透明的方式实…

相比学习好的学生,老师最喜欢努力认真学习的学生

相比学习好的学生&#xff0c;老师还是更喜欢努力学习的学生。好多人有这样的错觉&#xff0c;谁学习好&#xff0c;老师就喜欢谁&#xff0c;谁就是老师面前的大红人&#xff0c;可能有的老师是这样的吧&#xff0c;但是&#xff0c;对于我来说&#xff0c;相比那些学习好的学…

Postgresql快速写入\/读取大量数据(.net)

环境及测试 使用.net驱动npgsql连接post数据库。配置&#xff1a;win10 x64, i5-4590, 16G DDR3, SSD 850EVO. postgresql 9.6.3&#xff0c;数据库与数据都安装在SSD上&#xff0c;默认配置&#xff0c;无扩展。 CREATE TABLE public.mesh (x integer NOT NULL,y integer N…

mybatis更新Blob类型字段要用updateByPrimaryKeyWithBLOBs

转载自 mybatis更新Blob类型字段要用updateByPrimaryKeyWithBLOBs 不会报错也不会更新desc 业务desc数据库类型为Blob 查看源码 解决方案:

Ajax实现动态及时刷新表格数据

大家好&#xff0c;我是雄雄&#xff0c;今天分享的技术很简单&#xff0c;即ajax结合jdbc动态实现及时刷新表单数据。前言&#xff1a;相信大家在网上冲浪的时候&#xff0c;肯定会发现这样的场景&#xff0c;在实现某个查询功能时&#xff0c;下方表格中会显示需要展示的结果…

扩展entity framework core实现默认字符串长度,decimal精度,entity自动注册和配置

文章以efcore 2.0.0-preview2.测试验证通过。其他版本不保证使用&#xff0c;但是思路不会差太远。源代码,报道越短&#xff0c;事情越严重&#xff01;文章越短&#xff0c;内容越精悍&#xff01; 目标&#xff1a;1.实现entity的自动发现和mapper设置.2.默认字符串长度&…

上机不会做?在讲台上做做试试!

上周四班上到了sql语句的查询&#xff0c;正好临近周末&#xff0c;于是就在周末的时候布置了几个增删改查的案例让回家做做。今天随便找了几个人上黑板上做&#xff0c;本以为都没有问题了呢&#xff0c;结果做的一塌糊涂……惨&#xff0c;太惨了&#xff01;当时我就在想&am…

ASP.NET Core API 版本控制

几天前&#xff0c;我和我的朋友们使用 ASP.NET Core 开发了一个API &#xff0c;使用的是GET方式&#xff0c;将一些数据返回到客户端 APP。我们在前端进行了分页&#xff0c;意味着我们将所有数据发送给客户端&#xff0c;然后进行一些data.length操作&#xff0c;以获得item…

mybatis环境搭建步骤(含配置文件代码)

1.创建web项目2.将所需要的jar包放在项目内&#xff0c;并且build-path3.创建资源文件夹resources4.在资源文件夹中创建xml文件mybatis-config.xml,文件代码如下&#xff1a;<?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE configurationPUB…

多久没有给家里打过电话了?

你多久没有给家里打过电话了&#xff1f;对于我这种常年在外&#xff0c;且工作地距家直线距离都有数百公里的人来说&#xff0c;回家可是一种极大的奢侈啊。貌似自从在济南上班以来&#xff0c;平均每年也就有空回去两次&#xff0c;第一次一般都是有急事需要赶紧赶回去&#…

Feign数据压缩传输

没使用之前 使用 使用之后

漫画:删去k个数字后的最小值

转载自 漫画&#xff1a;删去k个数字后的最小值 我们来举一个栗子&#xff1a; 给定整数 541270936&#xff0c;要求删去一个数&#xff0c;让剩下的整数尽可能小。 此时&#xff0c;无论删除哪一个数字&#xff0c;最后的结果都是从9位整数变成8位整数。既然同样是8位整数&…

使用 InSpec 实现符合性即代码

法规符合性是每个企业必须面对的一个现实问题。同时&#xff0c;随着改变业界格局的新技术以及客户对数字服务的期望的出现&#xff0c;竞争压力也随之增加。各行业能否在快速交付新产品和服务的同时&#xff0c;仍然履行法规符合性义务&#xff1f; 回答是肯定的。解决方案就是…

计算机专业毕业后能做什么工作?

众所周知&#xff0c;目前比较火的专业之一莫过于计算机专业了。在这个互联网时代&#xff0c;越来越多的人选择去学习计算机专业&#xff0c;可是你知道计算机专业毕业后都有哪些岗位可选择吗&#xff1f;各个岗位的工作任务主要是什么&#xff1f;以下是对于计算机专业中各个…