mybatis动态sql

Mybatis简单数据库查询

|▌冷眼眸甩不掉的悲伤 提交于 2020-02-24 20:51:22
简介: MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。 MyBatis的功能架构: 分为三层 1.API接口层:提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。 2.数据处理层:负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。 3.基础支撑层:负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑。 优点: 1.解除sql与程序代码的耦合:通过提供DAL层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。 2.提供映射标签,支持对象与数据库的orm字段关系映射 3.提供对象关系映射标签,支持对象关系组建维护 4.提供xml标签,支持编写动态sql。 until public

MyBatis的深入原理分析之1-架构设计以及实例分析

久未见 提交于 2020-02-24 20:23:54
MyBatis是目前非常流行的ORM框架,它的功能很强大,然而其实现却比较简单、优雅。本文主要讲述MyBatis的架构设计思路,并且讨论MyBatis的几个核心部件,然后结合一个select查询实例,深入代码,来探究MyBatis的实现。 一、MyBatis的框架设计 注:上图很大程度上参考了iteye 上的 chenjc_it 所写的博文 原理分析之二:框架整体设计 中的MyBatis架构体图,chenjc_it总结的非常好,赞一个! 1.接口层---和数据库交互的方式 MyBatis和数据库的交互有两种方式: a.使用传统的MyBatis提供的API; b. 使用Mapper接口 1.1.使用传统的MyBatis提供的API 这是传统的传递 Statement Id 和查询参数给 SqlSession 对象,使用 SqlSession 对象完成和数据库的交互; MyBatis 提供了非常方便和简单的API,供用户实现对数据库的增删改查数据操作,以及对数据库连接信息和 MyBatis 自身配置信息的维护操作。 上述使用 MyBatis 的方法,是创建一个和数据库打交道的 SqlSession 对象,然后根据 Statement Id 和参数来操作数据库,这种方式固然很简单和实用,但是它不符合面向对象语言的概念和面向接口编程的编程习惯。由于面向接口的编程是面向对象的大趋势,

MyBatis动态sql之foreach标签 构建 in 语句

不打扰是莪最后的温柔 提交于 2020-02-21 20:34:22
<foreach> 元素主要用在构建 in 条件中,它可以在 SQL 语句中迭代一个集合。 <foreach> 元素的属性主要有 item、index、collection、open、separator、close。 item 表示集合中每一个元素进行迭代时的别名。 index 指定一个名字,用于表示在迭代过程中每次迭代到的位置。 一般没什么用。 open 表示该语句以什么开始。 一般没什么用,还不是直接用 ( 来的方便直接。 separator 表示在每次进行迭代之间以什么符号作为分隔符。 close 表示以什么结束。 一般没什么用,还不是直接用 ) 来的方便直接。 在使用 <foreach> 元素时,最关键、最容易出错的是 collection 属性,该属性是必选的,但在不同情况下该属性的值是不一样的,主要有以下 3 种情况: 如果传入的是单参数且参数类型是一个 List,collection 属性值为 list。 或者直接用 @Param("xxx") ,然后collection的值为:xxx。这种方式更直接,便于理解。 如果传入的是单参数且参数类型是一个 array 数组,collection 的属性值为 array。 或者直接用 @Param("xxx") ,然后collection的值为:xxx。这种方式更直接,便于理解。 如果传入的参数是多个,需要把它们封装成一个

Mybatis——动态SQL语句!

不问归期 提交于 2020-02-21 07:25:28
含义 动态的SQL语句,就是指在运行的时候,根据Mapper.xml中的语句,来决定方法传入参数的使用。 使用 <if test=""></if>标签 Mapper.xml中的配置 if 判断 参数传入的值,判断是否可以使用,再执行SQL语句, 缺点 如何传入的值分别是null,1时or 符号不会消失,这样sql语句识别不出来。 < select id = "queryUserByUser" resultType = "com.atguigu.pojo.User" parameterType = "com.atguigu.pojo.User" > select `id` , `last_name` lastName , `sex` from t_user where < if test = "lastName!=null" > last_name = # { lastName } < / if > < if test = "sex==0||sex==1" > or sex = # { sex } < / if > < / select > <where ></where>标签 Mapper.xml中的配置where能有效帮助我们,添加和去除查询条件 前面 的关键字。 缺点 不能去除查询条件 后面 的多余的关键。 < select id = "queryUserByUser"

Java框架之Mybatis(二)

流过昼夜 提交于 2020-02-19 08:44:36
本文主要介绍 Mybatis(一)之后剩下的内容: 1 mybatis 中 log4j的配置 2 dao层的开发(使用mapper代理的方式) 3 mybatis的配置详解 4 输入输出映射对应的类型 ( parameterType 和 resultType ) 5 mybatis 动态 sql 6 mybatis 中的一级缓存 7 mybatis 中的二级缓存 8 mybatis 和 缓存框架的整合 9 mybatis 中二级缓存使用时注意的问题 10 mybatis 和 spring 整合 11 mybatis + spring mvc 一、mybatis 中 log4j 的配置 在 config 文件夹下,新建 log4j.properties ,其内容如下: 即可 log4j.rootLogger=DEBUG, Console #Console log4j.appender.Console=org.apache.log4j.ConsoleAppender log4j.appender.Console.layout=org.apache.log4j.PatternLayout log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n log4j.logger.java.sql

Mybatis动态SQL

…衆ロ難τιáo~ 提交于 2020-02-19 04:16:36
动态SQL常用的标签 1.< if >标签 2.< where >标签 3.< foreach >标签 示例一 < if >标签与< where >标签的使用 < ! --我们可以把常用sql语句定义然后使用时直接调用即可-- > < sql id = "default" > select * from user < /sql > < select id = "findState" parameterType = "cn.msg.bean.User" resultType = "cn.msg.bean.User" > < ! --引用sql语句-- > < include refid = "default" > < /include > < ! --以下内容为如果任意一个属性不为空或默认值,就添加相应的sql条件-- > < where > < if test = "name!=null" > and name = #{name} < /if > < if test = "id!=0" > and id = #{id} < /if > < if test = "money!=0.0" > and money = #{money} < /if > < /where > < /select > 示例二 < foreach >标签的使用 < ! -

SQL注入详解

北战南征 提交于 2020-02-17 04:11:45
一:什么是sql注入   SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编写时的疏忽,通过SQL语句,实现无账号登录,甚至篡改数据库。 二: SQL注入攻击的总体思路     1:寻找到SQL注入的位置   2:判断服务器类型和后台数据库类型   3:针对不同的服务器和数据库特点进行SQL注入攻击 三: SQL注入攻击实例 String sql = "select * from user_table where username= ' "+userName+" ' and password=' "+password+" '"; --当输入了上面的用户名和密码,上面的SQL语句变成: SELECT * FROM user_table WHERE username= '’or 1 = 1 -- and password='’ """ --分析SQL语句: --条件后面username=”or 1=1 用户名等于 ” 或1=1 那么这个条件一定会成功; --然后后面加两个-,这意味着注释,它将后面的语句注释,让他们不起作用,这样语句永远都--能正确执行,用户轻易骗过系统,获取合法身份。 --这还是比较温柔的,如果是执行 SELECT * FROM user_table WHERE username='' ;DROP DATABASE (DB

Mybatis面试问题集锦

♀尐吖头ヾ 提交于 2020-02-15 13:17:51
1、#{}和${}的区别是什么? 答:mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值; mybatis在处理 $ { } 时,就是把 ${ } 替换成变量的值,完成的是简单的字符串拼接。 补充:在mybatis中使用#{}可以防止sql注入,提高系统安全性。MyBatis排序时使用order by 动态参数时需要注意,用$而不是# 2、Xml映射文件中,除了常见的select|insert|updae|delete标签之外,还有哪些标签? 答:还有很多其他的标签, 、 、 、 、 ,加上动态sql的9个标签,trim|where|set|foreach|if|choose|when|otherwise|bind等,其中 为sql片段标签,通过 标签引入sql片段, 为不支持自增的主键生成策略标签。 3、最佳实践中,通常一个Xml映射文件,都会写一个Dao接口与之对应,请问,这个Dao接口的工作原理是什么?Dao接口里的方法,参数不同时,方法能重载吗? 答:Dao接口,就是人们常说的Mapper接口,接口的全限名,就是映射文件中的namespace的值,接口的方法名,就是映射文件中MappedStatement的id值,接口方法内的参数,就是传递给sql的参数。Mapper接口是没有实现类的,当调用接口方法时

Mybatis(6)动态SQL if where foreach标签的使用

試著忘記壹切 提交于 2020-02-15 08:35:42
if标签判断(多条件查询) 1.写一个方法 2.配置映射文件 3.测试 2.where标签 where标签可以省略where1=1这个条件,通过mybatis自动生成 3.foreach标签(子查询) 根据id查询user信息,id使用List集合元素 1.在QueryVo实体类中封装一个ids集合和相应的get,set方法 2.写一个方法 3.根据foreach标签拼接sql语句 foreach标签 collection属性指定要遍历的集合ids open属性指定sql的开始 close属性指定sql语句结束 separator属性指定集合中的元素放到sql语句中的隔开符号 item是给ids这个元素的别名 #{ }中要获取的内容是item的内容(写item属性里的别名) 相当于: for (QueryVo idlist:ids) { System.out.println(idlist); } sql语句:select * from user where 1=1 and id in(集合元素1,2,3 ) 4.测试 4.抽取重复sql语句 *sql标签 * 注:sql标签里的sql语句不要在分号,拼接语句时会出错 使用include标签的refid属性直接引用 来源: CSDN 作者: 秃头入门程序猿 链接: https://blog.csdn.net/qq_25539045

MyBatis-复习篇

南笙酒味 提交于 2020-02-12 11:31:36
1.Mybatis工作流程 2.封装方法 3.采用映射方法实现接口查询 4.接口配置文件 讲述增删改查(源代码) (1)模糊查询的方法 (2)Mapper生命周期 5.pojo实体类中的字段和数据库中的字段不一样 (1)换一个别名 (2)、使用返回类型 resultMap 6.Mybatis分页查询 (1).通过UserMapper.xml配置来实现 UserMapper.xml配置: 测试类: (2).通过Java代码实现分页 (不建议使用,但是快) (3)分页可以使用其他方法 7.按照查询嵌套处理(多对一复杂查询) (1).通过子查询来完成 (2).按照结果嵌套查询--联表查询 8.类似于联表查询 一对多 联表查询 小结 提取SQL片段: 引用SQL片段: 测试 如下 10.二级缓存 注意:采用了二级缓存会出现序列化的问题 缓存工作流程图 结论 1.Mybatis工作流程 2.封装方法 SqlSessionFactoryUtils 里面的openSession 3.采用映射方法实现接口查询 UserMapper userMapper =session.getMapper(UserMapper.class); List<User> userList =userMapper.getList(); 4.接口配置文件 讲述增删改查(源代码) (1)模糊查询的方法 (2