mybatis动态sql

MyBatis学习笔记

一世执手 提交于 2019-12-05 11:36:08
PO, BO,VO,POJO的关系和区别 PO:persistent object 持久对象 1 .有时也被称为Data对象,对应数据库中的entity,可以简单认为一个PO对应数据库中的一条记录。 2 .在hibernate持久化框架中与insert/delet操作密切相关。 3 .PO中不应该包含任何对数据库的操作。 POJO :plain ordinary java object 无规则简单java对象 一个中间对象,可以转化为PO、DTO、VO。 1 .POJO持久化之后==〉PO (在运行期,由Hibernate中的cglib动态把POJO转换为PO,PO相对于POJO会增加一些用来管理数据库entity状态的属性和方法。PO对于programmer来说完全透明,由于是运行期生成PO,所以可以支持增量编译,增量调试。) 2 .POJO传输过程中==〉DTO 3 .POJO用作表示层==〉VO PO 和VO都应该属于它。 BO:business object 业务对象 业务对象主要作用是把业务逻辑封装为一个对象。这个对象可以包括一个或多个其它的对象。 比如一个简历,有教育经历、工作经历、社会关系等等。我们可以把教育经历对应一个PO,工作经历对应一个PO,社会关系对应一个PO。 建立一个对应简历的BO对象处理简历,每个BO包含这些PO。 这样处理业务逻辑时

MyBatis动态SQL

假如想象 提交于 2019-12-05 11:35:28
动态SQL简介 ​ MyBatis 的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦。拼接的时候要确保不能忘了必要的空格,还要注意省掉列名列表最后的逗号。利用动态 SQL 这一特性可以彻底摆脱这种痛苦。 ​ 通常使用动态 SQL 不可能是独立的一部分,MyBatis 当然使用一种强大的动态 SQL 语言来改进这种情形,这种语言可以被用在任意的 SQL 映射语句中。 ​ 动态 SQL 元素和使用 JSTL 或其他类似基于 XML 的文本处理器相似。在 MyBatis 之前的版本中,有很多的元素需要来了解。MyBatis 3 大大提升了它们,现在用不到原先一半的元素就可以了。MyBatis 采用功能强大的基于 OGNL 的表达式来消除其他元素。 ​ mybatis 的动态sql语句是基于OGNL表达式的。可以方便的在 sql 语句中实现某些逻辑. 总体说来mybatis 动态SQL 语句主要有以下几类: if 语句 (简单的条件判断) choose (when,otherwize) ,相当于java 语言中的 switch ,与 jstl 中的choose 很类似. trim (对包含的内容加上 prefix,或者 suffix 等,前缀,后缀) where

Java面试之持久层(10)

我的未来我决定 提交于 2019-12-05 10:04:38
91,什么是ORM? 对象关系映射(Object-Relational Mapping,简称ORM)是一种为了解决程序的面向对象模型与数据库的关系模型互不匹配问题的技术; 简单的说,ORM是通过使用描述对象和数据库之间映射的元数据(在Java中可以用XML或者是注解),将程序中的对象自动持久化到关系数据库中或者将关系数据库表中的行转换成Java对象,其本质上就是将数据从一种形式转换到另外一种形式。 92,Hibernate中SessionFactory是线程安全的吗?Session是线程安全的吗(两个线程能够共享同一个Session吗)? SessionFactory对应Hibernate的一个数据存储的概念,它是线程安全的,可以被多个线程并发访问。SessionFactory一般只会在启动的时候构建。对于应用程序,最好将SessionFactory通过单例模式进行封装以便于访问。 Session是一个轻量级非线程安全的对象(线程间不能共享session),它表示与数据库进行交互的一个工作单元。Session是由SessionFactory创建的,在任务完成之后它会被关闭。Session是持久层服务对外提供的主要接口。 Session会延迟获取数据库连接(也就是在需要的时候才会获取)。为了避免创建太多的session

MyBatis(动态SQL)

半城伤御伤魂 提交于 2019-12-05 09:48:47
if:判断 choose(when,otherwise):分支选择,类似java中的switch-case   如果带了id就用id查,如果带了lastName就用lastName查;只会进入其中一个 trim:字符串截取(where(封装查询条件),set(封装修改条件)) foreach 一、使用if 查询的时候,如果某些条件没带可能sql拼装会有问题 1、给where后面加上1=1 ,以后的条件都and xxx; 2、MyBatis使用where标签来将所有的查询条件包括在内。MyBatis就会将where标签中拼装的sql,多出来的and或者or去掉。( 只会去掉第一个多出来的and或者or ),and或者or都放在左边。 //携带了哪个字段查询条件就带上这个字段的值 public List<Employee> getEmpsByConditionIf(Employee employee); <!--查询员工,要求:携带了哪个字段查询条件就带上这个字段的值--> <select id="getEmpsByConditionIf" resultType="emp"> select * from tbl_employee <where> <!-- test:判断表达式(OGNL) OGNL的使用参照官方文档或者百度 从参数中取值进行判断 遇见特殊符号应该写转义字符; -->

day03-MyBatis的动态SQL语句查询

久未见 提交于 2019-12-05 09:23:33
场景一: 例如当我们想实现这样的查询的时候之前的操作貌似满足不了我们。 场景二: 还有些时候我们如果输入的信息越多满足要求的就越多,所查找出来的用户就越少 当我们之输入姓名的时候可能查找出10个人,当再输入性别的时候可能人数就会减少一半 mybatis为了解决例如上面的问题引入了一些标签例如: <if></if> <where></where> <foreach></foreach> <when></when> <set></set> 场景一的解决: UserDao中的方法: QueryVo实体类: package com.zyb.pojo; import java.util.List; public class QueryVo { private User user; private List<Integer> ids; public QueryVo() { } public User getUser() { return user; } public void setUser(User user) { this.user = user; } public List<Integer> getIds() { return ids; } public void setIds(List<Integer> ids) { this.ids = ids; } } 对应mapper

三、动态SQL

本秂侑毒 提交于 2019-12-05 08:51:32
动态SQL MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑。 动态SQL的元素 元素 作用 备注 if 判断语句 单条件分支判断 choose、when、otherwise 相当于Java中的switch case when语句 多条件分支判断 trim、where、set 辅助元素 用于处理一些SQL拼装问题 foreach 循环语句 在in语句等列举条件常用 if if元素相当于Java中的if语句,它常常与test属性联合使用。现在我们要根据name去查找学生,但是name是可选的,如下所示: <select id="selectByName" resultType="com.zl.domain.StudentDomain"> SELECT * FROM student WHERE 1=1 <if test="name != null and name != ''"> AND name LIKE concat('%', #{name}, '%') </if> </select> choose、when、otherwise 有些时候我们还需要多种条件的选择,在Java中我们可以使用switch、case、default语句,而在映射器的动态语句中可以使用choose、when、otherwise元素。 <!--

BeetlSQL,简单和强大数据库访问工具(更新)

落爺英雄遲暮 提交于 2019-12-05 08:13:27
beetlsql 特点 BeetSql是一个全功能DAO工具, 同时具有Hibernate 优点 & Mybatis优点功能,适用于承认以SQL为中心,同时又需求工具能自动能生成大量常用的SQL的应用。 无需注解,自动生成大量内置SQL,轻易完成增删改查功能 数据模型支持Pojo,也支持Map/List这种快速模型,也支持混合模型 SQL 以更简洁的方式,Markdown方式集中管理,同时方便程序开发和数据库SQL调试。 SQL 模板基于Beetl实现,更容易写和调试,以及扩展 简单支持关系映射而不引入复杂的OR Mapping概念和技术。 具备Interceptor功能,可以调试,性能诊断SQL,以及扩展其他功能 内置支持主从数据库,通过扩展,可以支持更复杂的分库分表逻辑 支持跨数据库平台,开发者所需工作减少到最小 5 分钟例子 准备工作 为了快速尝试BeetlSQL,需要准备一个Mysql数据库,然后执行如下sql脚本 DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `id` int(11) NOT NULL, `name` varchar(64) DEFAULT NULL, `age` int(4) DEFAULT NULL, `userName` varchar(64) DEFAULT NULL, PRIMARY KEY

MyBatis踩坑之SQLProvider转义字符被删除问题

旧街凉风 提交于 2019-12-05 05:28:04
目录 踩坑背景 问题描述 原因追踪 解决方案 方法一 方法二 踩坑背景 项目架构:Spring Boot + MyBatis + MySQL。 使用MyBatis作为ORM框架,jdbc驱动使用的是 mariadb-java-client 。 <dependency> <groupId>org.mariadb.jdbc</groupId> <artifactId>mariadb-java-client</artifactId> <version>2.3.0</version> </dependency> 为了不使用xml形式的配置文件,MyBatis使用接口映射器,并使用映射器注解方式编写SQL语句。 @Mapper public interface TestDAO { @Select("select * from test where id = #{id}") public Test getById(@Param("id") long id); } 问题描述 在批量添加记录时通过SQLProvider动态拼装SQL,具体代码示例如下所示: @Repository @Mapper public interface TestDAO { // 使用SQLProvider拼装SQL实现批量插入 @InsertProvider(type = TestProvider.class,

mybatis的基本使用

我的未来我决定 提交于 2019-12-05 00:28:37
第一部分 基本概念 1.1 什么是MyBatis   MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。 1.2 经典配置 从 XML 中构建 SqlSessionFactory   每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为中心的。 而 SqlSessionFactory 本 身 是 由 SqlSessionFactoryBuilder 创建的,它可以从 XML 配置,注解或手动配置 Java 来创建 SqlSessionFactory。但是当Mybatis与一些依赖注入框架(如Spring或者Guice)同时使用时,SqlSessions将被依赖注入框架所创建,所以你不需要使用SqlSessionFactoryBuilder或者SqlSessionFactory   从 XML 文件中构建 SqlSessionFactory 的实例非常简单,建议使用类路径下的资源文件进行配置。MyBatis 包含一个名叫 Resources 的工具类

02-MyBatis执行Sql的流程分析

僤鯓⒐⒋嵵緔 提交于 2019-12-04 18:22:33
目录 获取Mapper 简单总结 重要类 参考 本博客着重介绍MyBatis执行Sql的流程,关于在执行过程中缓存、动态SQl生成等细节不在本博客中体现,相应内容后面再单独写博客分析吧。 还是以之前的查询作为列子: public class UserDaoTest { private SqlSessionFactory sqlSessionFactory; @Before public void setUp() throws Exception{ ClassPathResource resource = new ClassPathResource("mybatis-config.xml"); InputStream inputStream = resource.getInputStream(); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } @Test public void selectUserTest(){ String id = "{0003CCCA-AEA9-4A1E-A3CC-06D884BA3906}"; SqlSession sqlSession = sqlSessionFactory.openSession(); CbondissuerMapper