mybatis动态sql

MyBatis 注解开发+逆向(Generator)

笑着哭i 提交于 2020-01-02 18:42:50
注解开发 最初设计时,MyBatis 是一个 XML 驱动的框架。配置信息是基于 XML 的,而且映射语句也是定义在 XML 中的。随着技术的更新发展,对于开发效率要求也原来越高,特别是一些小型项目;越来越多的框架开始支持注解, 到MyBatis3时,MyBatis对注解有了完善的支持,利用注解可以在一些情况下提高开发效率 但不幸的是,Java 注解的的表达力和灵活性十分有限。尽管很多时间都花在调查、设计和试验上, 最强大的 MyBatis 映射并不能用注解来构建 1. select 接口方法声明: import com.kkb.pojo.User; import org.apache.ibatis.annotations.Select; public interface UserMapper2 { @Select("select * from kuser where id = #{id}") public User selectUserByID(int id); } 测试方法: @Test public void selectTest(){ SqlSession session = factory.openSession(); UserMapper2 mapper = session.getMapper(UserMapper2.class); User user = mapper

mybatis 入门

▼魔方 西西 提交于 2020-01-01 00:16:15
mybatis mybatis 是一个优秀的基于 java 的持久层框架,它内部封装了 jdbc ,使开发者只需要关注 sql 语句本身,而不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁杂的过程。 mybatis 通过 xml 或 注解 的方式将要执行的各种 statement 配置起来,并通过 java 对象和 statement 中 sql 的动态参数进行映射生成最终执行的 sql 语句,最后由 mybatis 框架执行 sql 并将结果映射为 java 对象并返回。 采用 ORM 思想解决了实体和数据库映射的问题,对 jdbc 进行了封装,屏蔽了 jdbc api 底层访问细节,使我们不用与 jdbc api 打交道,就可以完成对数据库的持久化操作。 jdbc问题 1、数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。 2、Sql 语句在代码中硬编码,造成代码不易维护,实际应用 sql 变化的可能较大,sql 变动需要改变 java 代码。 3、使用 preparedStatement 向占有位符号传参数存在硬编码,因为 sql 语句的 where 条件不一定,可能多也可能少,修改 sql 还要修改代码,系统不易维护。 4、对结果集解析存在硬编码(查询列名),sql 变化导致解析代码变化,系统不易维护

MyBatis进阶

*爱你&永不变心* 提交于 2019-12-31 20:01:49
Mapper代理 上一节 中直接利用session+id来执行sql的方式存在一些问题 session执行sql时都需要提供要执行sql的id,而这个id是字符串类型,意味着id是否正确在编译期间是无法获知的,必须等到运行时才能发现错误, sql需要的参数和返回值类都不明确,这也增加了出错的概率 理想的状况:像调用方法一样调用sql,既避免了直接写id的问题,也可以明确指定方法的参数类型和返回值类型 解决方案: MyBatis通过动态代理来解决,简单的说动态代理(动态生成),就是在运行过程中自动产生一个对象,用它来代理原本已经存在的对象的方法 MyBatis中本来由Executor(被代理对象)来完成sql的执行,现在由代理对象(自动生成)来代理Executor完成,代理对象会将我们的操作转交给Executor 问题是:MyBatis怎么知道代理对象是什么样的对象呢?,这就需要为MyBatis提供Mapper接口,这个接口就是对mapper.xml中的sql语句的声明,与DAO层的接口一毛一样 使用步骤 创建接口类 package com.kkb.mapper; import com.kkb.pojo.Products; public interface ProductsMapper { //根据name查询一个Products public Products

2019年mybatils面试高频题(java)

浪尽此生 提交于 2019-12-31 12:33:04
前言 2019即将过去,伴随我们即将迎来的又是新的一年,过完春节,马上又要迎来新的金三银四面试季。 那么,作为程序猿的你,是否真的有所准备的呢,亦或是安于本职工作,继续做好手头上的事情。 当然,不论选择如何,假如你真的准备在之后的金三银四跳槽的话,那么作为一个Java工程师,就不可不看了。 如何在几个月的时间里,快速的为即将到来的面试进行充分的准备呢? 一、什么是MyBatis? 答:MyBatis是一个可以自定义SQL、存储过程和高级映射的持久层框架。 二、讲下MyBatis的缓存 答:MyBatis的缓存分为一级缓存和二级缓存,一级缓存放在session里面,默认就有二级缓存放在它的命名空间里,默认是不打开的,使用二级缓存属性类需要实现Serializable序列化接口(可用来保存对象的状态),可在它的映射文件中配置 三、Mybatis是如何进行分页的?分页插件的原理是什么? 答: 1、Mybatis使用RowBounds对象进行分页,也可以直接编写sql实现分页,也可以使用Mybatis的分页插件。 2、分页插件的原理:实现Mybatis提供的接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写sql。 举例:select * from student,拦截sql后重写为:select t.* from (select * from student)t

mybatis 的 dao 接口跟 xml 文件里面的 sql 是如何建立关系的?一步步解析

泄露秘密 提交于 2019-12-31 09:38:22
序言 在开始正文之前,首先解释Dao接口和XML文件里的SQL是如何一一对应的? 一句话讲完就是:mybatis 会先解析这些xml 文件,通过 xml 文件里面的命名空间 (namespace)跟dao 建立关系;然后 xml 中的每段 sql 会有一个id 跟 dao 中的接口进行关联。 那么问题来了: "如果 我有两个这个xml 文件 都跟这个dao 建立关系了,那不是就是冲突了?" 带着这个疑问我们就要开始下面的正题了! 一、初始化 首先我们要知道每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为中心的,SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。 但 SqlSessionFactory 是一个接口,它里面其实就两个方法: openSession 、 getConfiguration 其中, openSession 方法是为了获取一个SqlSession对象,完成必要数据库增删改查功能。但是,SqlSessionFactory属性太少了,所以需要 getConfiguration 的配合;来配置mapper映射文件、SQL参数、返回值类型、缓存等属性。 /** * Creates an {@link SqlSession} out of a connection or a

Mybatis操作Mysql批量更新的一个坑-&allowMultiQueries=true允许批量更新

 ̄綄美尐妖づ 提交于 2019-12-30 04:30:07
前言 利用Mybatis批量更新或者批量插入,实际上即使Mybatis完美支持你的sql,你也得看看你操作的数据库是否完全支持,而同事,最近就遇到这样的一个坑! 问题 先带大家来看一段sql的配置:      1 <update id="updateAllAvailable"> 2 <foreach collection="skuOptionList" item="item" index="index" open="" close="" separator=";">     update t_xxx 3 <set> old_id = #{item.oldId} </set> 4 where id = #{item.id} 5 </foreach> 6 </update> 以上的配置动态SQL看着没有问题,这里用到了Mybatis的动态sql,实际上说白了也就是拼sql,不过这个繁杂的工作交给Mybatis帮我们去做了,可是,只要一执行就要报语法错误。 解决方案 后来发现,原来mysql的批量更新是要我们主动去设置的, 就是在数据库的连接url上设置一下,加上 * &allowMultiQueries=true * 即可。 来源: https://www.cnblogs.com/yvanBk/p/9845797.html

备战2020春招,这次彻底搞懂MyBatis,这些面试题没白刷(附答案)

﹥>﹥吖頭↗ 提交于 2019-12-28 02:54:15
前言: 春招面试题MyBatis篇来咯!!! Mybatis 是一个半 ORM(对象关系映射)框架,它内部封装了 JDBC,开发时只需要关注 SQL 语句本身,不需要花费精力去处理加载驱动、创建连接、创建statement 等繁杂的过程。程序员直接编写原生态 sql,可以严格控制 sql 执行性能,灵活度高。 最近有好多朋友在准备春招,所以小编也会多出一些面试专题的文章给有需要的人,所以记得给我点个关注哦 一.MyBatis 框架的缺点: 1、SQL 语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写 SQL 语句的功底有一定要求。 2、SQL 语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。 二.MyBatis 框架适用场合: 1、MyBatis 专注于 SQL 本身,是一个足够灵活的 DAO 层解决方案。 2、对性能的要求很高,或者需求变化较多的项目,如互联网项目,MyBatis 将是 不错的选择。 三.MyBatis 与 Hibernate 有哪些不同? 1、Mybatis 和 hibernate 不同,它不完全是一个 ORM 框架,因为 MyBatis 需要 程序员自己编写 Sql 语句。 2、Mybatis 直接编写原生态 sql,可以严格控制 sql 执行性能,灵活度高,非常 适合对关系数据模型要求不高的软件开发,因为这类软件需求变化频繁,一但需

MyBatis常用SQL语句整理笔记

久未见 提交于 2019-12-27 18:10:01
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 最近使用Mybatis作为持久层框架,自然/动态sql写得也比较多了,最常见的就是在查询语句中使用if标签来动态地改变过滤条件。 Mybatis强大特性之一就是它的动态sql,免除了拼接sql带来的各种麻烦。 在项目开发过程中,常见的和不常见的问题都有碰到过,所以在这总结一下。 if choose(when,otherwise) trim(where,set) foreach 1.通常用于多条件组合查询 <select id="productId" parameterType="Product" resultMap="getProduct"> SELECT * FROM PRODUCT t WHERE (1=1) <if test="Product.productId!=null"> AND t.PRODUCT_ID = #{Product.productId} </if> <if test="Product.productName!=null"> AND t.PRODUCT_NAME like '%#{Product.productName}%' </if> <if test="Product.inStock!=null"> AND t.PRODUCT.INSTOCK = 0 </if> ORDER BY

mybatis动态新增sql语句

青春壹個敷衍的年華 提交于 2019-12-27 16:39:52
注意传入的参数是实体类型 <!--动态新增--> <insert id="insertGeo" parameterType="com.entity.GovernmentDetail"> insert into GOVERNMENT_DETAIL <trim prefix="(" suffix=")" suffixOverrides=","> <if test="unitType != null">UNIT_TYPE,</if> <if test="plateCode != null">PLAT_CODE,</if> <if test="descrip != null">DESCRIP,</if> <if test="businessGuid != null">BUSINESS_GUID,</if> <if test="hotLine != null">HOT_LINE,</if> <if test="lineAdress != null">LINE_ADRESS,</if> <if test="extend1 != null">EXTEND1,</if> <if test="extend2 != null">EXTEND2,</if> CREATE_TIME, </trim> <trim prefix="values (" suffix=")" suffixOverrides=",

mybatis动态更新sql语句

ⅰ亾dé卋堺 提交于 2019-12-27 16:38:13
注意参数是实体 <!--更新--> <update id="updateOne" parameterType="com.entity.GovernmentDetail"> UPDATE GOVERNMENT_DETAIL <trim prefix="set" suffixOverrides=","> <if test="UNIT_TYPE!=null">unitType=#{unitType},</if> <if test="PLAT_CODE!=null">plateCode=#{plateCode},</if> <if test="DESCRIP!=null">descrip=#{descrip},</if> <if test="BUSINESS_GUID!=null">businessGuid=#{businessGuid},</if> <if test="HOT_LINE!=null">hotLine=#{hotLine},</if> <if test="LINE_ADRESS!=null">lineAdress=#{lineAdress},</if> <if test="EXTEND1!=null">extend1=#{extend1},</if> <if test="EXTEND2!=null">extend2=#{extend2},</if> </trim>