mybatis动态sql

Mybatis常见面试题总结

半城伤御伤魂 提交于 2019-12-09 01:55:10
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)与JDBC相比,减少了50%以上的代码量,消除了JDBC大量冗余的代码,不需要手动开关连接; (3)很好的与各种数据库兼容(因为MyBatis使用JDBC来连接数据库,所以只要JDBC支持的数据库MyBatis都支持)。 (4)

MyBatis动态SQL中Map参数处理

只愿长相守 提交于 2019-12-08 07:04:28
在MyBatis中,如果我们需要传递两个参数,有一种方式是通过Map作为传入参数,在动态SQL中,我们需要对传入的Map参数中的值进行判断,然后进行动态SQL的条件拼接处理。 假设我们有传入参数map如下: map.put("name",name); map.put("level",level); 对应的,我们有配置文件如下,可以看到,在test表达式中,我们不用再通过 #,$ 取值符,直接通过键值就可以取到Map中key所对应的值,如下所示: <select id="findSomethings" parameterType="hashmap" resultType="hashmap"> select name,age,id from user where 1 = 1 <if test="name != null and name!='' "> and name = #{name}</if> <if test="level != null and level!='' "> and level= #{level}</if> </select> 来源: CSDN 作者: __HelloWorld__ 链接: https://blog.csdn.net/kangkanglou/article/details/93639926

BeetlSQL ,更好的Dao工具

烂漫一生 提交于 2019-12-07 21:48:34
beetlsql 入门 同时具有Hibernate 优点 & Mybatis优点功能,适用于承认以SQL为中心,同时又需求工具能自动能生成大量常用的SQL的应用。 SQL 以更简洁的方式,Markdown方式集中管理,同时方便程序开发和数据库SQL调试 数据模型支持Pojo,也支持Map/List这种无模型的模型 SQL 模板基于Beetl实现,更容易写和调试,以及扩展 无需注解,自动生成大量内置SQL,轻易完成增删改查功能 简单支持关系映射而不引入复杂的OR Mapping概念和技术。 支持跨数据库平台,开发者所需工作减少到最小 具备Interceptor功能,可以调试,性能诊断SQL,以及扩展其他功能 内置支持主从数据库,通过扩展,可以支持更复杂的分库分表逻辑 代码例子 // 执行/user.md 里的select sql List<User> list = SqlManager.select(“user.select”,paras,User.class); // 使用内置的生成的sql执行 User user = SqlManage.selectById.unque(User.class,id); SQL例子 selectUser === select * from user where 1=1 @if(user.age==1){ and age = #user.age# @

MyBatis:动态SQL

六眼飞鱼酱① 提交于 2019-12-07 20:38:38
MyBatis 的真正强大之处在于它的映射语句,这也是它的魔力所在。由于它的映射语句异常强大,映射器的 XML 文件就显得相对简单。 在 XML 中添加一个 select 元素,写一个查询的 SQL,再做一些简单的配置,就可以将查询的结果直接映射到对象中。 select select 标签的常用属性有: id 命名空间中这条 SQL 的唯一标识; parameterType 将要传入这条语句的参数类的完全限定名或别名,可选,MyBatis 可以通过类型处理器推断出具体传入语句的参数; resultType 这条语句中返回的期望的类型的完全限定名或别名,如果返回的是集合那就应该设置为集合包含的类型; resultMap 外部 resultMap 的命名引用,注意 resultType 和 resultMap 只能选其一,不能同时使用。 insert 插入数据可以用 insert 元素,常用的属性有: parameterType 将要传入语句的参数的完全限定类名或别名; useGeneratedKeys 仅对 insert 和 update 有用,这会令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法来取出由数据库内部生成的主键; keyProperty 仅对 insert 和 update 有用,唯一标记一个属性,MyBatis 会通过

mybatis

喜你入骨 提交于 2019-12-06 16:24:20
什么是MyBatis? MyBatis是一款优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解来配置和映射原生信息,将接口和Java的POJOs(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。 为什么要使用MyBatis? 无论是Mybatis、Hibernate都是ORM的一种实现框架,都是对JDBC的一种封装! 持久层中的几种技术: Hibernate(一个比较老旧的框架) 优点:用起来十分舒服,sql代码都不用写 缺点:处理复杂业务时,灵活度差, 复杂的HQL难写难理解,例如多表查询的HQL语句 JDBC 优点:易理解,几个固定的步骤 缺点:开发起来太麻烦,什么都需要自己写 SpringDAO 其实是JDBC的一层封装就类似于dbutils一样 可以认为,MyBatis就是jdbc和Hibernate之间的一个平衡点 MyBatis 在 IBatis 的基础上做了哪些大的改进? 有接口绑定,包括注解绑定sql和xml绑定Sql; 动态sql由原来的节点配置变成OGNL表达式; 在一对一,多对一的时候引进了association,在一对多的时候引入了collection节点,不过都是在resultMap里面配置。

Mybatis 常用标签

风格不统一 提交于 2019-12-06 08:40:19
MyBatis 的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦。拼接的时候要确保不能忘了必要的空格,还要注意省掉列名列表最后的逗号。利用动态 SQL 这一特性可以彻底摆脱这种痛苦。 1、<if> 主要用于sql语句拼接(很简单)如示例 2、<choose,when,otherwise> 有些时候,我们不想用到所有的条件语句,而只想从中择其一二。针对这种情况,MyBatis 提供了 choose 元素,它有点像 Java 中的 switch 语句。 结构如下: <choose> <when test=" ** "> <when> <otherwise> </otherwise> </choose> 3<where,set> <update id="updateAuthorIfNecessary"> update Author set <if test="username != null">username=#{username},</if> <if test="password != null">password=#{password},</if> <if test="email != null">email=#{email},</if> <if test="bio != null">bio=#

MyBatis的动态sql语句

≯℡__Kan透↙ 提交于 2019-12-06 00:47:36
注意:这里的数据库中的表仍然使用的是前面的user表 前面我们提到的都是固定的sql语句 并且业务功能比较单一 比如通过id查询用户 通过姓名来查询用户等等 但是我们这里没有去考虑到业务比较复杂的情况 例如当用户名不为空的时候 我们根据用户名进行查询 但是 当地址不为空的时候 我们还要加上地址进行进一步的判断 所以这里是根据条件来进行动态的查询 前面的步骤还是相同 1、在iuserdao接口中添加相应的方法 List findByUser(User user); 2、在iuserdao.xml中进行相应的配置 if标签中写的是对象的属性名 我们可以对其进行一个条件的判断 这里的意思是如果username不为空的情况下 那么我们肯定是根据username来进行查询 并且这里如果address不为空的情况下 我们还需要拼接上address的条件 当然 如果两者都为空的情况下 我们肯定是查询所有的用户 3、编写相应的测试类 测试1: 当username和address都不为空的情况下,测试结果 User{id=46, username='王二麻子', sex='男', birthday=Wed Mar 07 17:37:26 CST 2018, address='天津'} 测试2:注释掉其中一行 测试结果: 同理 如果我们注释掉两个条件 那么肯定是查询所有的用户 当然这里我们还得注意一点

MyBatis sql映射器 Mapper

半腔热情 提交于 2019-12-05 20:56:03
入门   MyBatis 基于动态代理机制,让我们无需再编写 Dao 的实现。    传统 Dao 接口,现在名称统一以 Mapper 结尾 , 还有我们映射器配置文件要和映射器在同一个包 . :   IDeptDao---->DeptMapper.java---DeptMapper.xml(namespace 直接写 DeptMapper.java 的全限定名 ) 1.创建个 User 类(首先得有个数据库中的表是User,并且还有对应的字段) public class User { private Long id; private String name; get和set和tostring此处省略。。。。(get和set和tostring是要的,太长了没复制) } 2.个上面的类建个接口 UserMapper import java.util.List; /** * 查询数据库中所有数据 * @return */ public interface UserMapper {   List<User> queryAll(); } 3.建个 UserMapper.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http:/

mybatis 动态sql

前提是你 提交于 2019-12-05 19:51:46
if 判断语句 单条件分支判断 if标签用来实现根据条件拼接sql语句,下面示例用来判断参数如果不为null,则拼接sql 查询<select id="queryList" resultType="int"> select * from cart a where 1 = 1 <if test="user_id != null"> AND a.user_id = #{user_id} </if> <if test="goods_id != null"> AND a.goods_id = #{goods_id} </if></select>修改 <update id="update" parameterType="CartVo"> update cart <set> <if test="user_id != null">`user_id` = #{user_id},</if> <if test="goods_id != null">`goods_id` = #{goods_id},</if> <if test="goods_sn != null">`goods_sn` = #{goods_sn},</if> <if test="product_id != null">`product_id` = #{product_id},</if> <if test="goods_name !=

MyBatis的动态SQL详解

守給你的承諾、 提交于 2019-12-05 19:16:58
MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑。 MyBatis中用于实现动态SQL的元素主要有: if choose(when,otherwise) trim where set foreach if 就是简单的条件判断,利用if语句我们可以实现某些简单的条件选择。先来看如下一个例子: Xml代码 < select id = "dynamicIfTest" parameterType = "Blog" resultType = "Blog" > select * from t_blog where 1 1 = 1 < if test = "title != null" > and title = #{title} </ if > < if test = "content != null" > and content = #{content} </ if > < if test = "owner != null" > and owner = #{owner} </ if > </ select > 这条语句的意思非常简单,如果你提供了title参数,那么就要满足title=#{title},同样如果你提供了Content和Owner的时候,它们也需要满足相应的条件,之后就是返回满足这些条件的所有Blog,这是非常有用的一个功能