mybatis动态sql

MyBatis中#{}和${}的区别详解

烂漫一生 提交于 2020-01-10 22:03:32
区别 1.#将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值是id,则解析成的sql为order by "id". 2. 将 传 入 的 数 据 直 接 显 示 生 成 在 s q l 中 。 如 : o r d e r b y 将传入的数据直接显示生成在sql中。如:orderbyuser_id$,如果传入的值是111,那么解析成sql时的值为order by user_id, 如果传入的值是id,则解析成的sql为order by id. 3.#方式能够很大程度防止sql注入。 4.$方式无法防止Sql注入。 5.$方式一般用于传入数据库对象,例如传入表名.    6.一般能用#的就别用$. MyBatis排序时使用order by 动态参数时需要注意,用$而不是# 实例讲解 : 动态 sql 是 mybatis 的主要特性之一,在 mapper 中定义的参数传到 xml 中之后,在查询之前 mybatis 会对其进行动态解析。mybatis 为我们提供了两种支持动态 sql 的语法:#{} 以及 ${}。 在下面的语句中,如果 name 的值为 zhangsan,则两种方式无任何区别: select * from user

Mybatis是如何实现防止SQL注入

你说的曾经没有我的故事 提交于 2020-01-10 13:36:00
Q:mybatis框架里 $ 和 # 的区别? A: 1 #是将传入的值当做字符串的形式,eg:select id,name,age from student where id =#{id},当前端把id值1,传入到后台的时候,就相当于 select id,name,age from student where id ='1'. 2 $是将传入的数据直接显示生成sql语句,eg:select id,name,age from student where id =${id},当前端把id值1,传入到后台的时候,就相当于 select id,name,age from student where id = 1. 3 使用#可以很大程度上防止sql注入。(语句的拼接) 4 但是如果使用在order by 中就需要使用 $. 5 在大多数情况下还是经常使用#,但在不同情况下必须使用$. 我觉得#与 的区别最大在于:#{} 传入值时,sql解析时,参数是带引号的,而 的区别最大在于:#{} 传入值时,sql解析时,参数是带引号的,而${}穿入值,sql解析时,参数是不带引号的。 什么是SQL注入 在讨论怎么实现之前,首先了解一下什么是SQL注入,我们有一个简单的查询操作:根据id查询一个用户信息。它的sql语句应该是这样: select * from user where id =

动态SQL

倖福魔咒の 提交于 2020-01-10 02:17:22
1.1动态SQL中的元素 动态SQL是MyBatis的强大特性之一,MyBatis 3采用了功能强大的基于OGNL的表达式来完成动态SQL, 它消除了之前版本中需要了解的大多数元素,使用不到原来一半的元素就能完成所需工作。 MyBatis动态SQL中的主要元素,如表所示。 1.2<if>元素 在MyBatis中,<if>元素是最常用的判断语句,它类似于Java中的if语句,主要用于实现某些简单的条件选择。 在实际应用中,我们可能会通过多个条件来精确地查询某个数据。例如,要查找某个客户的信息,可以通过姓名和职业来查找客户, 也可以不填写职业直接通过姓名来查找客户,还可以都不填写而查询出所有客户,此时姓名和职业就是非必须条件。 类似于这种情况,在MyBatis中就可以通过<if>元素来实现。下面就通过一个具体的案例,来演示这种情况下<if>元素的使用,具体实现步骤如下。 (2)修改映射文件CustomerMapper.xml,在映射文件中使用<if>元素编写根据客户姓名和职业组合条件查询客户信息列表的动态SQL <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3

Mybatis(1)-初识mybaits

こ雲淡風輕ζ 提交于 2020-01-07 19:16:12
一、概述 1、概述     mybatis 是一个优秀的基于 java 的持久层框架,它内部封装了 jdbc,使开发者只需要关注 sql 语句本身, 而不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁杂的过程。   mybatis 通过 xml 或注解的方式将要执行的各种 statement 配置起来,并通过 java 对象和 statement 中 sql 的动态参数进行映射生成最终执行的 sql 语句,最后由 mybatis 框架执行 sql 并将结果映射为 java 对象并 返回。   采用 ORM 思想解决了实体和数据库映射的问题,对 jdbc 进行了封装,屏蔽了 jdbc api 底层访问细节,使我 们不用与 jdbc api 打交道,就可以完成对数据库的持久化操作。 2、 JDBC编程  (1)步骤    1> 加载数据库驱动    2> 创建并获取数据库链接   3> 创建jdbc statement对象    4 > 设置sql语句    5> 设置sql语句中的参数(使用preparedStatement)   6>通过statement执行sql并获取结果    7>对sql执行结果进行解析处理   8>释放资源(resultSet、preparedstatement、connection) 1 package com.xhbjava; 2

MyBatis 动态SQL

≯℡__Kan透↙ 提交于 2020-01-07 07:10:50
动态SQl是MyBatis的强大特性之一,可以完成对SQL语句的动态组装。 比如说传入一个User对象,要根据这个User中的数据查询用户的完整信息: 如果User对象中只有name属性有值,sql语句是:select * from user_tb where name=#{name} 如果User对象中只有tel属性有值,sql语句是:select * from user_tb where tel=#{tel} 如果User对象的name、tel都有值,sql语句是:select * from user_tb where name=#{name} and tel=#{tel} 有时候sql语句不是一成不变的,要根据传入的数据动态生成要执行的sql语句,动态sql就适合这种情况。 最好将日志的控制台输出级别设置为DEBUG,这样在控台能看到SQL语句。 MyBatis中的动态sql元素 <if> 相当于java中的if,用于单分支的条件判断 <choose>、<when>、<otherwise> 相当于java中的switch...case...default,用于多分支的条件判断,从多个选项中选择一个 <foreach> 循环,常和sql的in语句搭配使用 <where>、<trim>、<set> 辅助元素,用于一些处理sql拼装、特殊字符的问题 <bind>

Mybatis是如何实现SQL防注入的

核能气质少年 提交于 2020-01-07 04:48:16
Mybatis这个框架在日常开发中用的很多,比如面试中经常有一个问题: $ 和 # 的区别,它们的区别是使用 # 可以防止SQL注入,今天就来看一下它是如何实现SQL注入的。 什么是SQL注入 在讨论怎么实现之前,首先了解一下什么是SQL注入,我们有一个简单的查询操作:根据id查询一个用户信息。它的sql语句应该是这样: select * from user where id = 。我们根据传入条件填入id进行查询。 如果正常操作,传入一个正常的id,比如说2,那么这条语句变成 select * from user where id =2 。这条语句是可以正常运行并且符合我们预期的。 但是如果传入的参数变成 '' or 1=1 ,这时这条语句变成 select * from user where id = '' or 1=1 。让我们想一下这条语句的执行结果会是怎么?它会将我们用户表中所有的数据查询出来,显然这是一个大的错误。这就是SQL注入。 Mybatis如何防止SQL注入 在开头讲过,可以使用 # 来防止SQL注入,它的写法如下: <select id="safeSelect" resultMap="testUser"> SELECT * FROM user where id = #{id} </select> 在mybatis中查询还有一个写法是使用 $ ,它的写法如下:

Mybatis(六):动态 SQL

≡放荡痞女 提交于 2020-01-06 14:31:32
介绍: MyBatis 的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦。拼接的时候要确保不能忘了必要的空格,还要注意省掉列名列表最后的逗号。利用动态 SQL 这一特性可以彻底摆脱这种痛苦。 通常使用动态 SQL 不可能是独立的一部分,MyBatis 当然使用一种强大的动态 SQL 语言来改进这种情形,这种语言可以被用在任意的 SQL 映射语句中。 动态 SQL 元素和使用 JSTL 或其他类似基于XML的文本处理器相似。在 MyBatis 之前的版本中,有很多的元素需要来了解。MyBatis 3 大大提升了它们,现在用不到原先一半的元素就可以了。MyBatis 采用功能强大的基于 OGNL 的表达式来消除其他元素。 简单来讲,就是掌握四个标记 if choose (when, otherwise) trim (where, set) foreach 一、 <if> 选择性条件查找 < ! -- 选择性查找 -- > < select id = "selectSelective" resultMap = "userMap" parameterType = "cn.saytime.domain.User" > SELECT * FROM tb_user WHERE 1 = 1 < if test =

mybatis总结

牧云@^-^@ 提交于 2020-01-06 04:17:29
1.mybatis的工作原理 1:使用连接池,datasource,在驱动并连接的这个过程中优化并解耦 JDBC第一步其实从效率角度来看是不合适的,因为无论什么数据库都不可能支撑随机和庞大的连接数,而且不可避免的存在连接浪费的情况,Mybatis就封装了这些优化的方法。 2:统一sql存取到XML 如果代码写在java块中,在团队合作中很可能出现两个交叉业务的代码使用类似的sql语句,而开发人员的工作本身没有交集,那就代表sql语句肯定是无法复用的。而且对sql的修改,就代表着对java文件的修改,需要重新编译和打包部署(比如常见的状态值更改,sql修改随着业务变化必然存在修改)。 mybatis将sql统一存取到xml中,就算存在业务交叉,但因为统一配置的缘故,sql在xml中一目了然,两个跨team的程序员可以看到对方的sql,来判断自己是否需要重用。并且使用xml配置可以减少代码编译。 3:参数和结果集映射 sql的方式需要传入参数,如果存在多条件“或类型”的查询(列表查询的查询条件允许空),那就代表你必须传参进行sql拼接,就算使用xml的方式也不行。要么每个业务独立配置xml中的sql,要么还是写入java代码中,或者以工具的方式进行自动拼接。 Mybatis使用映射的方式,方便model管理参数,同时以解析器的方式将参数动态拼接到sql(sqlmaper里那些标签)

Mybatis面试题

人走茶凉 提交于 2020-01-04 03:08:32
1、Mybatis动态sql是做什么的?都有哪些动态sql?简述一下动态sql的执行原理? 答:动态Sql主要是根据对象中的不通的取值,来实现对Sql的一个动态的拼接,实现不同的Sql的语句。 主要动态Sql 的标签有 If语句(简单的条件判断) Choose(when/otherwise),相当于java语言中的switch,与jstl中choose类似 Trim(对包含的内容加上prefix,或者suffix) Where(主要是用来简化SQL语句中where条件判断,能智能的处理and/or 不用担心多余的语法导致的错误) Set(主要用于更新时候) Foreach(一般使用在mybatis in语句查询时特别有用) 以及 sql 标签来抽取sql 的片段,简化代码 执行原理: 2、Mybatis是否支持延迟加载?如果支持,它的实现原理是什么? 答:Mybatis仅支持association关联对象和collection关联集合对象的延迟加载,association指的就是一对一,collection指的就是一对多查询。在Mybatis配置文件中,可以配置是否启用延迟加载 lazyLoadingEnabled =true|false。 它的原理是,使用CGLIB创建目标对象的代理对象,当调用目标方法时,进入拦截器方法,比如调用a.getB().getName()

MyBatis 动态SQL

拥有回忆 提交于 2020-01-02 21:04:48
动态 SQL MyBatis 的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦。拼接的时候要确保不能忘了必要的空格,还要注意省掉列名列表最后的逗号。利用动态 SQL 这一特性可以彻底摆脱这种痛苦。 通常使用动态 SQL 不可能是独立的一部分,MyBatis 当然使用一种强大的动态 SQL 语言来改进这种情形,这种语言可以被用在任意的 SQL 映射语句中。 动态 SQL 元素和使用 JSTL 或其他类似基于 XML 的文本处理器相似。在 MyBatis 之前的版本中,有很多的元素需要来了解。MyBatis 3 大大提升了它们,现在用不到原先一半的元素就可以了。MyBatis 采用功能强大的基于 OGNL 的表达式来消除其他元素。 if choose (when, otherwise) trim (where, set) foreach if 动态 SQL 通常要做的事情是有条件地包含 where 子句的一部分。比如: <select id="findActiveBlogWithTitleLike" resultType="Blog"> SELECT * FROM BLOG WHERE state = ‘ACTIVE’ <if test="title != null"> AND title like