mybatis动态sql

我爱java系列---【mysql结果集的处理】

半世苍凉 提交于 2019-12-01 08:12:42
1.查询返回的结果的表中字段名与实体类的属性名不一致时。( resultType( 输出结果类型 ) ) resultType 可以指定将查询结果映射为 Pojo ,但需要 Pojo 的属性名和 Sql 查询的列名一致方可映射成功。 如果 Sql 查询字段名和 Pojo的属性名不一致,可以通过resultMap将字段名和属性名作一个对应关系 , resultMap 实质上还需要将查询结果映射到 Pojo 对象中。 由于 mapper.xml 中 Sql 查询列 (user_id) 和 Order 类属性 (userId) 不一致,所以查询结果不能映射到 Pojo 中。 需要定义 resultMap ,把 orderResultMap 将 Sql 查询列 (user_id) 和 Order 类属性 (userId) 对应起来 改造 OrderMapper.xml ,如下: <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!-- namespace:命名空间,用于隔离sql,还有一个很重要的作用,Mapper动态代理开发的时候使用

java持久层框架mybatis如何防止sql注入

落花浮王杯 提交于 2019-12-01 07:38:23
sql注入大家都不陌生,是一种常见的攻击方式,攻击者在界面的表单信息或url上输入一些奇怪的sql片段,例如“or ‘1’=’1’”这样的语句,有可能入侵参数校验不足的应用程序。所以在我们的应用中需要做一些工作,来防备这样的攻击方式。在一些 安全性很高的应用中,比如银行软件,经常使用将sql语句全部替换为 存储过程这样的方式,来防止sql注入,这当然是一种很 安全的方式,但我们平时开发中,可能不需要这种死板的方式。 mybatis框架作为一款半自动化的持久层框架,其sql语句都要我们自己来手动编写,这个时候当然需要防止sql注入。其实Mybatis的sql是一个具有“输入+输出”功能,类似于函数的结构,如下: <select id=“getBlogById“ resultType=“Blog“ parameterType=”int”><br> select id,title,author,content from blog where id=#{id} </select> 这里,parameterType 标示了输入的参数类型,resultType标示了输出的参数类型。回应上文,如果我们想防止sql注入,理所当然地要在输入参数上下功夫。上面代码中高亮部分即输入参数在sql中拼接的部分,传入参数后,打印出执行的sql语句,会看到sql是这样的: select id,title

Mybatis 防止SQL注入笔记

China☆狼群 提交于 2019-12-01 07:38:14
#{xxx},使用的是PreparedStatement,会有类型转换,所以比较安全; ${xxx},使用字符串拼接,可以SQL注入; like查询不小心会有漏洞,正确写法如下: Mysql: select * from t_user where name like concat('%', #{name}, '%') Oracle: select * from t_user where name like '%' || #{name} || '%' SQLServer: select * from t_user where name like '%' + #{name} + '%' mybatis如何防止sql注入 sql注入大家都不陌生,是一种常见的攻击方式,攻击者在界面的表单信息或url上输入一些奇怪的sql片段,例如“or ‘1’=’1’”这样的语句,有可能入侵参数校验不足的应用程序。所以在我们的应用中需要做一些工作,来防备这样的攻击方式。在一些安全性很高的应用中,比如银行软件,经常使用将sql语句全部替换为存储过程这样的方式,来防止sql注入,这当然是一种很安全的方式,但我们平时开发中,可能不需要这种死板的方式。 mybatis框架作为一款半自动化的持久层框架,其sql语句都要我们自己来手动编写,这个时候当然需要防止sql注入。其实Mybatis的sql是一个具有“输入

Mybatis的动态SQL

蓝咒 提交于 2019-12-01 07:00:55
L110301X1: 查询user表中userName字段中姓名含“孙”字且userRole为3的人: 改造testGetUserList5()类,将原来的使用类对象传参改成使用两个参数传参 在UserMapper.xml文件中配置 </select> <resultMap type= "user" id= "userList6" > <result property= "id" column= "id" /> <result property= "userCode" column= "userCode" /> <result property= "userName" column= "userName" /> <result property= "userRole" column= "userRole" /> <result property= "userRoleName" column= "roleName" /> </resultMap> <select id= "getUserList6" resultMap= "userList6" > select u.*,r.roleName from smbms_user u,smbms_role r where userName like CONCAT ('%',#{userName},'%') and userRole=#

动态SQL

廉价感情. 提交于 2019-12-01 05:22:00
MyBatis 的强大特性之一便是它的动态 SQL。 如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦。拼接的时候要确保不能忘了必要的空格,还要注意省掉列名列表最后的逗号。利用动态 SQL 这一特性可以彻底摆脱这种痛苦。 通常使用动态 SQL 不可能是独立的一部分,MyBatis 当然使用一种强大的动态 SQL 语言来改进这种情形,这种语言可以被用在任意的 SQL 映射语句中。 动态 SQL 元素和使用 JSTL 或其他类似基于 XML 的文本处理器相似。在 MyBatis 之前的版本中,有很多的元素需要来了解。MyBatis 3 大大提升了它们,现在用不到原先一半的元素就可以了。MyBatis 采用功能强大的基于 OGNL 的表达式来消除其他元素。 文章最下面包含一些demo. 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

动态Sql(一)

二次信任 提交于 2019-12-01 05:22:00
MyBatis 的强大特性之一便是它的动态 SQL。 如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦。拼接的时候要确保不能忘了必要的空格,还要注意省掉列名列表最后的逗号。利用动态 SQL 这一特性可以彻底摆脱这种痛苦。 通常使用动态 SQL 不可能是独立的一部分,MyBatis 当然使用一种强大的动态 SQL 语言来改进这种情形,这种语言可以被用在任意的 SQL 映射语句中。 动态 SQL 元素和使用 JSTL 或其他类似基于 XML 的文本处理器相似。在 MyBatis 之前的版本中,有很多的元素需要来了解。MyBatis 3 大大提升了它们,现在用不到原先一半的元素就可以了。MyBatis 采用功能强大的基于 OGNL 的表达式来消除其他元素。 文章最下面包含一些demo. 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

mybatis动态SQL

前提是你 提交于 2019-12-01 04:58:44
  有时候静态SQL语句并不能很好的满足我们的业务,我们希望通过一些条件,来构建动态SQL语句   mybatis对动态SQL提供了一些:<if> <where> <trim> <choose> <when> <foreach> <set> 来实现 1、<if>块 <if test="要判断的内容">   如果条件成立SQL语句会跟上这里面的内容 </if> <if test="salary != null"> and salary > #{salary} </if>    2、<where>块 where 元素,会自动帮我们添加where ,并且去除where 后面的and or 例如下面的代码,如果两个条件都成立的话SQL语句是where xxx = ? and yyy > ?.... 如果第一个条件不成立,SQL语句是where yyy > ?..... <where>   <if test = "xxx">     and xxx = #{id}   </if>   <if test = "xxx">     and yyy > #{salary}   </if>   ...... </where> 3、<trim>块 trim:用来裁剪字符串用的,有四个属性 prefix:自动添加前缀 prefixOverrides:把前缀后面的内容覆盖掉 suffix:自动添加后缀

必须知道的MyBatis实用知识点

丶灬走出姿态 提交于 2019-12-01 03:01:48
一、 MyBatis简介 MyBatis的前身是Apache的一个开源项目iBatis,2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis。2013年11月迁移到GitHub,因此目前MyBatis是由GitHub维护的。 同样作为持久层框架的 Hibernate在前些年非常的火,它在配置了映射文件和数据库连接文件后就可以通过Session操作,它甚至提供了HQL去操作POJO进而操作数据库的数据,几乎可以使编程人员脱离sql语言。可是为什么MyBatis却越来越受欢迎呢?我们稍稍总结如下: Hibernate: 1.不方便的全表映射,比如更新时需要发送所有的字段; 2.无法根据不同的条件组装不同sql; 3.对多表关联和复制sql查询支持较差; 4.有HQL但性能较差,做不到sql优化; 5.不能有效支持存储过程; 在当今的大型互联网中,灵活、 sql优化,减少数据的传递是最基本的优化方法,但是Hibernate却无法满足我们的需求,而MyBatis提供了更灵活、更方便的方法。在MyBatis里,我们需要自己编写sql,虽然比Hibernate配置要多,但是是MyBatis可以配置动态sql,也可以优化sql,且支持存储过程,MyBatis几乎能做到 JDBC 所能做到的所有事情!凭借其高度灵活

Mybatis

ぃ、小莉子 提交于 2019-12-01 01:21:02
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/a745233700/article/details/80977133 1、什么是Mybatis? (1)Mybatis是一个半ORM(对象关系映射)框架,它内部封装了JDBC,开发时只需要关注SQL语句本身,不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。程序员直接编写原生态sql,可以严格控制sql执行性能,灵活度高。 (2)MyBatis 可以使用 XML 或注解来配置和映射原生信息,将 POJO映射成数据库中的记录,避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。 (3)通过xml 文件或注解的方式将要执行的各种 statement 配置起来,并通过java对象和 statement中sql的动态参数进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射为java对象并返回。(从执行sql到返回result的过程)。 2、Mybaits的优点: (1)基于SQL语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,SQL写在XML里,解除sql与程序代码的耦合,便于统一管理;提供XML标签,支持编写动态SQL语句,并可重用。 (2

mybatis 基础(二) 动态sql 关于where if / where choose when otherwise

*爱你&永不变心* 提交于 2019-11-30 21:43:28
个人理解: where if就相当于正常的java中的if 语句,如果有多个条件组合判断的话用 and, or连接 而where choose when otherwise choose就好像是switch,when相当于case,可以有一种属性的对个判断,但不能同时去判断多个属性. 同时,只要有一个when满足,则break otherwise就好像是default,如果前面的when都不满足,则进入otherwise 1.动态sql where if 传递参数为实体类user,if内的userName是user的属性 username=#{userName} 中的username是数据库表中的字段, #{userName}是实体类user中的. <select id="findByCondition" parameterType="user" resultType="user"> select * from user <!-- 这里的userName 对应的也是实体类中的属性--> <!-- test里面的属性基本都来自于parameterType中的,如这里的userName,是实体类user中的属性--> <where> <if test="userName!=null"> username=#{userName} </if> <if test="gender!=null"