mybatis如何实现的数据库排序

目录
  • mybatis数据库排序
  • mybatis order by 排序
    • 方式能够很大程度防止sql注入
    • order by 之后要使用$而非#

mybatis数据库排序

今天用到了对数据库按照倒序进行输出。因为刚接触mybatis,所以对这方面还不是太了解,再网上搜了好长时间终于找到了一些有用的信息。

我的目标是这样的,数据库中的信息分为无效和有效,对数据库中的信息的有效值按照倒序进行输出,输出到表格中,

在网上看到了这样的语句,SELECT * FROM photo ORDER BY id DESC;于是我就直接拿过来用了,但是却出现了问题,因为我的是有条件排序的,

尝试了几次后我发现是这样写的, select

<include refid="Base_Column_List" />
from manager_user where is_valid = 1 

ORDER BY id DESC;这样的话输出的内容就达到了我的目标,将语句中的desc换成asc就可以进行升序排序

mybatis order by 排序

在使用MyBatis解析xml进行排序的时候,遇见排序无效的问题!

  • #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #{user_id},如果传入的值是111,那么解析成sql时的值为order by “111”, 如果传入的值是id,则解析成的sql为order by “id”。
  • $将传入的数据直接显示生成在sql中。如:order by ${user_id},如果传入的值是111,那么解析成sql时的值为order by 111, 如果传入的值是id,则解析成的sql为order by id。

方式能够很大程度防止sql注入

  • $方式无法防止Sql注入。
  • $方式一般用于传入数据库对象,例如传入表名。
  • 一般能用#的就别用$。

order by 之后要使用$而非#

附解决代码段:

其中orderByField就是传入进行排序的参数值!

<choose>
  <when test="orderByField != null and orderByField !=''">
    <choose><when test="isAsc == true">
      order by ${orderByField} ASC
  </when>
  <otherwise>
    order by ${orderByField} DESC
  </otherwise></choose>
  </when>
<otherwise>
  order by id DESC

</otherwise></choose>

  ORDER BY
        <choose>
        <when test="sort!=null">
                #{sort,jdbcType=VARCHAR}
            <if test="order!=null">
                #{order,jdbcType=VARCHAR}
            </if>
        </when>
        <otherwise>
            id asc , create_time asc
        </otherwise>
     </choose>

原因是: #{order,jdbcType=VARCHAR},MyBatis会自动将排序字段当成一个字符串,等同于order by ‘create_time’ ‘desc’,可以通过执行,但无效,与order by create_time desc结果不同

解决方法: 使用order,Mybatis会将其视作直接变量,变量替换成功后,不会再加上引号成为字符串,同样排序顺序也一样

{order},因此

  ORDER BY
        <choose>
        <when test="sort!=null">
                ${sort}
            <if test="order!=null">
                ${order}
            </if>
        </when>
        <otherwise>
            id asc , create_time asc
        </otherwise>
     </choose>

#能很大程度的防止SQL注入 $无法防止Sql注入 $用于传入数据库对象 <![CDATA[]]>,在该符号内的语句,不会被当成字符串来处理,而是直接当成sql语句,比如要执行一个存储过程。

在mapper文件中写sql语句时,遇到特殊字符时,如:< > 等,建议使用

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • MyBatis实现Mysql数据库分库分表操作和总结(推荐)

    前言 作为一个数据库,作为数据库中的一张表,随着用户的增多随着时间的推移,总有一天,数据量会大到一个难以处理的地步.这时仅仅一张表的数据就已经超过了千万,无论是查询还是修改,对于它的操作都会很耗时,这时就需要进行数据库切分的操作了. MyBatis实现分表最简单步骤 既然文章的标题都这么写了,不如直接上干货来的比较实际,我们就先来看看如何实现最简单的分表. 1.我们模拟用户表数据量超过千万(虽然实际不太可能) 2.用户表原来的名字叫做user_tab,我们切分为user_tab_0和user_t

  • 使用Mybatis对数据库进行单表操作的实现示例

    简介 该篇文章主要是介绍如何使用MyBatis对Mysql数据库进行单表操作(对于mybatis的下载以及配置文件的作用和具体信息,我在上一篇文章中也已经提到了),使用的环境如下: JDK版本:1.8 编译器:IDEA2019 JDBC版本:8.0.18 mybatis版本:3.5.3 配置文件 首先需要有两个配置文件,一个是configuration.xml文件,配置的是连接数据库的环境以及对于mapper.xml文件的映射,还有另一个文件就是mapper.xml,这个文件主要是用来写sql语

  • 解决mybatis中order by排序无效问题

    1.#将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号.如:order by #{user_id},如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值是id,则解析成的sql为order by "id". 2.$将传入的数据直接显示生成在sql中.如:order by ${user_id},如果传入的值是111,那么解析成sql时的值为order by 111, 如果传入的值是id,则解析成的sql为order b

  • MyBatis-plus数据库字段排序不准确的解决

    目录 MyBatis-plus数据库字段排序不准确 例如:12还没有8,4,2大,这就很郁闷了 解决方案 Mybatis-plus遇到的坑 1. 数据库映射枚举 2. 自增主键 3. mybatis嵌套查询 4. 用updateWrapper的update做更新操作 5. 使用lambaQuery时 6. Integer判断为空 7. 基础类型的判断 8. 事务 9. mybatis 配置了多个数据库 MyBatis-plus数据库字段排序不准确 今天用mybatis-plus进行开发的时候遇到

  • mybatis如何实现的数据库排序

    目录 mybatis数据库排序 mybatis order by 排序 方式能够很大程度防止sql注入 order by 之后要使用$而非# mybatis数据库排序 今天用到了对数据库按照倒序进行输出.因为刚接触mybatis,所以对这方面还不是太了解,再网上搜了好长时间终于找到了一些有用的信息. 我的目标是这样的,数据库中的信息分为无效和有效,对数据库中的信息的有效值按照倒序进行输出,输出到表格中, 在网上看到了这样的语句,SELECT * FROM photo ORDER BY id DE

  • MSSQL数据库排序规则如何更改

    1.sp_helpsort SELECT SERVERPROPERTY ('Collation') 查看你的排序规则. 不过你的这个应该和字符集有关. 2.更改服务器排序规则 更改 SQL Server 2005 实例的默认排序规则的操作可能会比较复杂,包括以下步骤: 确保具有重新创建用户数据库及这些数据库中的所有对象所需的全部信息或脚本. 使用工具(例如大容量复制)导出所有数据. 删除所有用户数据库. 重新生成在 setup 命令的 SQLCOLLATION 属性中指定新的排序规则的 mast

  • Spring+Mybatis+Mysql搭建分布式数据库访问框架的方法

    一.前言 用Java开发企业应用软件, 经常会采用Spring+MyBatis+Mysql搭建数据库框架.如果数据量很大,一个MYSQL库存储数据访问效率很低,往往会采用分库存储管理的方式.本文讲述如何通过Spring+Mybatis构建多数据库访问的架构,并采用多线程提升数据库的访问效率. 需要说明一下,这种方式只适合数据库数量.名称固定,且不是特别多的情况.针对数据库数量不固定的情况,后面再写一篇处理方案. 二.整体方案 三.开发环境准备 3.1 下载Spring.Mybatis.Mysql

  • 详解Mybatis是如何把数据库数据封装到对象中的

    一.前言 接到一个问题,数据库为Null的数据,传递到前端显示为0.之前有了解过,持久层框架(mybatis)在把数据库数据封装到对象中,是利用对象的Setter方法,这个大家也都知道,因此我就在Setter方法尝试,结果并不完全是这样.下面我用例子演示. 二.准备阶段 1.数据表 2.表对应的实体类 @Data @ApiModel("用户账号") public class User { @ApiModelProperty(value = "用户id") Integ

  • Mybatis如何自动生成数据库表的实体类

    第一步引入jar 第二步,配置文本文件 # 数据库驱动jar 路径 本地创库的包 drive.class.path=C:/Users/Administrator/.m2/repository/mysql/mysql-connector-java/5.1.30/mysql-connector-java-5.1.30.jar # 数据库连接参数 jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://192.168.1.188:3306/sxh

  • MyBatis使用Zookeeper保存数据库的配置可动态刷新的实现代码

    核心关键点: 封装一个DataSource, 重写 getConnection 就可以实现 我们一步一步来看. 环境: Spring Cloud + MyBatis MyBatis常规方式下配置数据源: 使用Spring的Configuration package com.cnscud.cavedemo.fundmain.config; import com.cnscud.xpower.dbn.SimpleDBNDataSourceFactory; import org.apache.ibati

  • mybatis plus generator 根据数据库自动生成实体类的实现示例

    目录 1.添加依赖 2.编写代码生成器 3.运行主程序,输入表名 1.添加依赖 <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.3.2</version> </dependency> <dependency> <groupId&g

  • Mybatis使用JSONObject接收数据库查询的方法

    1. mapper.xml设置resultType resultType="com.alibaba.fastjson.JSONObject" 2. Mapper.java使用JSONObject接收 // 查询isvalid=1的数据 JSONObject selectValidBom(String parentsCode); 3. 测试 // 测试查询BOM的sql语句 @Test() public void testSelectValidBom() { JSONObject val

  • Mybatis实现分包定义数据库的原理与过程

    目录 前言 原理 前提: 猜想 实现 1:定义两个数据源 2:定义两个SqlSessionFactory 3:不同包实现绑定不同的sqlSessionFactory 4:测试 拓展: 总结 前言 业务需求中需要连接两个数据库处理数据,需要用动态数据源.通过了解mybatis的框架,计划 使用分包的方式进行数据源的区分. 原理 前提: 我们使用mybatis都会有四个步骤 1:构建SqlSessionFactory 2:通过SqlSessionFactory 获取到sqlSession 对象 3:

  • 基于mybatis一对多查询内层排序的问题

    目录 mybatis一对多查询内层排序 mybatis多排序问题 mybatis一对多查询内层排序 <!--根据板块id查询所有主题->指标->维度--> <resultMap id="TitleDimensionMap" type="com.etouch.admincenter.bean.ZhmdDiagnosisTitleBean"> <id column="title_id" property=&q

随机推荐