mybatis动态sql

MyBatis增啥改查

我们两清 提交于 2019-11-30 19:50:55
一. 什么是Mybatis MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO)。 MyBatis参考资料官网: https://mybatis.github.io/mybatis-3/zh/index.html 。 官网对Mybatis的介绍更加具有权威性: MyBatis 是支持定制化SQL、存储过程以及高级映射的优秀的持久层框架。 MyBatis 避免了几乎所有的 JDBC 代码和手工设置参数以及抽取结果集。 MyBatis 使用简单的 XML 或注解来配置和映射基本体,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。 MyBatis优点: 1)、简单易学 mybatis本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。 2)、灵活

myBatis基础知识点

生来就可爱ヽ(ⅴ<●) 提交于 2019-11-30 19:11:56
1. Mybatis框架优缺点   优点:     1. 易于上手和掌握。     2. sql写在xml里,便于统一管理和优化。     3. 解除sql与程序代码的耦合。     4. 提供映射标签,支持对象与数据库的orm字段关系映射     5. 提供对象关系映射标签,支持对象关系组建维护     6. 提供xml标签,支持编写动态sql。   缺点:     1. sql工作量很大,尤其是字段多、关联表多时,更是如此。     2. sql依赖于数据库,导致数据库移植性差。     3. 由于xml里标签id必须唯一,导致DAO中方法不支持方法重载。     4. 字段映射标签和对象关系映射标签仅仅是对映射关系的描述,具体实现仍然依赖于sql。(比如配置了一对多Collection标签,如果sql里没有join子表或查询子表的话,查询后返回的对象是不具备对象关系的,即Collection的对象为null)     5. DAO层过于简单,对象组装的工作量较大。     6. 不支持级联更新、级联删除。     7. 编写动态sql时,不方便调试,尤其逻辑复杂时。     8 提供的写动态sql的xml标签功能简单(连struts都比不上),编写动态sql仍然受限,且可读性低。     9. 若不查询主键字段,容易造成查询出的对象有“覆盖”现象。     10.

mybatis执行过程及经典面试题

北慕城南 提交于 2019-11-30 18:03:58
Mybatis执行流程   mybatis中xml解析是通过SqlSessionFactoryBuilder.build()方法。   初始化mybatis(解析xml文件构建成Configuration对象)并初始化SqlSessionFactory对象   在解析xml时会同时根据其中节点做相应的初始化操作   关键节点: settings、typeAliases、mappers   通过SqlSesssionFactory.openSession()方法打开一个SqlSession对象   SqlSessionFactory对象的作用是里面存了全局的配置信息以及初始化环境和DataSource,DataSource对象可以用来开辟连接,SqlSessionFactory对象是用来保存全局信息并且打开数据库连接   在打开SqlSession对象的时候就会开辟一个连接对象并传给SqlSession对象,和数据库打交道的操作入口在于SqlSession对象   通过SqlSession.getMapper()根据传入的Mapper对象类型动态代理并返回一个动态代理后的Mapper对象   由SqlSession.select()/update(),MapperProxy对象的invoke()方法执行后再执行execure方法,再根据情况选择执行select/update  

MyBatis动态拼接sql,statementType="STATEMENT"使用

耗尽温柔 提交于 2019-11-30 18:03:32
背景,写一个需求,展示数据的结果需要将查询出来的结果列转行,但是发现需要列转行的数据是动态的,没办法确定有多少个,所以需要动态的拼接sql处理。 起初设想是在MyBatis里面去动态拼接,然后尝试多次放弃了。。。 要动态拼接的sql如下,下面是静态固定的几个列,实际需要查出来循环拼接的: 然后选择在java控制层去处理了: 【1】java中拼接, 重点标注了底色: List<PageData> flNameList = xinchouService.getZiDuanByStatus(pd); //所有当月生效福利字段 String str = ""; if(flNameList.size()>0){ for(int i=0;i<flNameList.size();i++){ str += "sum(case when fl_name= ' "+flNameList.get(i).getString("fl_name")+" ' then fl_sum else 0 end ) as "+flNameList.get(i).getString("fl_name")+" ,"; } str = str.substring(0,str.length()-1); } System.out.println("str:----------------------------"+str);

以及Hibernate和Mybatis区别

帅比萌擦擦* 提交于 2019-11-30 14:40:14
ORM框架? Object Relational Mapping,对象-关系映射。 项目中的业务实体有两种表现形式:对象和关系数据,即在内存中表现为对象,在数据库中表现为关系数据。 为什么需要ORM框架? ORM框架是对象关系映射,那为什么要映射mapping? 因为对象之间可以存在关联和继承关系,但是在数据库中,关系数据无法表达多对多关联和继承关系。(ps:在数据库原理中,会把逻辑上的多对多转换为多个一对关系才能实现)因此,对象和关系(业务实体的两种表现形式)想要映射正确,项目系统一般以中间件的形式,即持久层框架。 Hibernate? Hibernate是一个开源的对象关系映射框架。 它对jdbc进行了非常轻量级的对象封装,将pojo(普通的Java对象)与数据库表建立映射关系,是一个全自动的ORM框架,甚至自动生成SQL语句,自动执行。 因此,程序员可以随心所有地使用对象编程思维来操纵数据库。 Hibernate特点: Hibernate通过修改一个“持久化”对象的属性,从而修改数据库表中对应的记录数据 提供线程和进程两个级别的缓存提升应用程序性能 有丰富的映射方式将 Java对象之间的关系(POJO) 转换为 数据库表之间的关系 屏蔽不同数据库实现之间的差异。在Hibernate中只需通过“方言”的形式指定当前使用的数据库,就可以根据底层数据库的实际情况生成适合的SQL语句

初始MyBatis

萝らか妹 提交于 2019-11-30 14:35:36
初始MyBatis 什么是 MyBatis? MyBatis是支持定制化SQL,存储过程以及高级映射的优秀的持久层框架.MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集.MyBatis可以对配置和原生Map使用简单的XMl或注解,将接口和Java的POJO(Plain Old java Objects,普通的Java对象)映射成数据库中的记录. *** MyBatis如何安装? jar包下载地址 要使用MyBatis,只需要mybatis-x.x.x.jar文件置于classpath中即可,web项目把jar包放到WEB-INF下的lib包中 如果使用Maven来构建项目,则需将下面dependency代码置于pom.xml文件中: <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifacId> <version>x.x.x</version> //版本号 </dependency> MyBatis的功能架构 我们把Mybatis的功能架构分为三层 API接口层:提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库.接口层一接受调用请求就会调用数据处理层来完成具体的数据处理. 数据处理层:负责具体的SQL查找.SQL解析.SQL执行和执行结果映射处理等

MyBatis进阶

六眼飞鱼酱① 提交于 2019-11-30 13:35:37
MyBatis进阶 笔记内容:日志管理、动态SQL、缓存、对象关联查询、分页、批处理和注解 日志管理 日志文件作用:用于记录系统操作事件的记录文件或文件集合,日志保存历史数据,是诊断问题以及理解系统活动的重要依据。 日志分为两部分:比如,SLF4j与Logback,如下图所示 日志门面和日志实现作用区别:统一的门面屏蔽了底层复杂的实现,门面就像插盘的面板规格,插盘内部的电路设计细节不同。门面和实现分开有助于数据迁移。 日志实现组件作用:提供日志的打印、输出、管理 使用步骤 在pom文件中加入logback依赖 <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> </dependency> 可以自定义控制台输出日志的格式:在resources目录下新建logback.xml,规定控制台的输出日志格式。 一般调试时,设置root level级别为debug以上,方便调试。 <configuration> <appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>[%thread] %d{HH:mm

mybatis-Java API

前提是你 提交于 2019-11-30 12:26:40
Java API 既然你已经知道如何配置 MyBatis 和创建映射文件,你就已经准备好来提升技能了。 MyBatis 的 Java API 就是你收获你所做的努力的地方。正如你即将看到的,和 JDBC 相比, MyBatis 很大程度简化了你的代码而且保持简洁,很容易理解和维护。MyBatis 3 已经引入 了很多重要的改进来使得 SQL 映射更加优秀。 应用目录结构 在我们深入 Java API 之前,理解关于目录结构的最佳实践是很重要的。MyBatis 非常灵 活, 你可以用你自己的文件来做几乎所有的事情。 但是对于任一框架, 都有一些最佳的方式。 让我们看一下典型应用的目录结构: /my_application /bin /devlib /lib <-- MyBatis *.jar文件在这里。 /src /org/myapp/ /action /data <-- MyBatis配置文件在这里, 包括映射器类, XML配置, XML映射文件。 /mybatis-config.xml /BlogMapper.java /BlogMapper.xml /model /service /view /properties <-- 在你XML中配置的属性 文件在这里。 /test /org/myapp/ /action /data /model /service /view

MyBatis动态sql和分页

为君一笑 提交于 2019-11-30 06:09:19
MyBatis动态sql 在接口中定义方法 然后alt加回车在xml中如图: 1.if 语句 (简单的条件判断) 2. choose (when,otherwize) ,相当于java 语言中的 switch ,与 jstl 中的choose 很类似 3. trim (对包含的内容加上 prefix,或者 suffix 等,前缀,后缀) 4. where (主要是用来简化sql语句中where条件判断的,能智能的处理 and or ,不必担心多余导致语法错误)、 5. set (主要用于更新时) 6. foreach (在实现 mybatis in 语句查询时特别有用) 测试: @Test public void selectByIn() { List list = new ArrayList(); list.add(1); list.add(2); list.add(3); list.add(10003); List<Book> books = this.bookService.selectByIn(list); for(Book b : books){ System.out.println(b); } } 展示: 模糊查询 这里演示3种: 接口: List<Book> selectBylike1(@Param("bname") String bname); List<Book>

mybatis动态sql以及分页

依然范特西╮ 提交于 2019-11-30 06:09:19
1、mybatis动态sql 2、模糊查询 3、查询返回结果集的处理 4、分页查询 5、特殊字符处理 1.mybatis动态sql If、trim、foreach If 标签判断某一字段是否为空 <select id="list4" resultType="java.util.Map" parameterType="java.util.Map"> select * from t_mvc_book <where> <if test="null != bname and bname !=''"> and bname like #{bname} </if> </where> </select> trim 标签一般用于去除sql语句中多余的and关键字,逗号,或者给sql语句前拼接 “where“、“set“以及“values(“ 等前缀,或者添加“)“等后缀,可用于选择性插入、更新、删除或者条件查询等操作。 <trim prefix="values (" suffix=")" suffixOverrides="," > <if test="bid != null" > #{bid,jdbcType=INTEGER}, </if> <if test="bname != null" > #{bname,jdbcType=VARCHAR}, </if> <if test="price !=