mybatis动态sql

MyBatis 的 DAO 接口跟 XML 文件里面的 SQL 是如何建立关系的

与世无争的帅哥 提交于 2020-03-16 12:49:22
MyBatis 会先 解析这些 XML 文件 ,通过 XML 文件里面的 命名空间 (namespace)跟 DAO 建立关系 ;然后 XML 中的每段 SQL 会有一个id 跟 DAO 中的接口进行关联。 首先我们要知道每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为中心的, SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。 但 SqlSessionFactory 是一个接口,它里面其实就两个方法: openSession 、 getConfiguration 其中, openSession 方法是为了获取一个 SqlSession 对象,完成必要数据库增删改查功能。但是, SqlSessionFactory 属性太少了,所以需要 getConfiguration 的配合;来配置 mapper 映射文件、SQL 参数、返回值类型、缓存等属性。 /** * Creates an {@link SqlSession} out of a connection or a DataSource * * @author Clinton Begin */ public interface SqlSessionFactory { SqlSession openSession();

2.3 Mybati框架 --动态SQL

*爱你&永不变心* 提交于 2020-03-12 14:00:06
动态SQL作用:Mybatis3采用了OGNL的表达式来完成动态SQL拼装。避免开发人员在进行数据库开发时,手动拼装SQL; 动态SQL主要元素: <if> :判断语句,用于单条件分支判断; <choose> ( <when> 、 <otherwise> ):相当于java的 switch、case、default语句,用于多条件分支判断; <where>、<trim>、<set> :辅助元素,用于处理一些SQL拼装,特殊字符问题; <bind> :从OGNL表达式创建一个变量,并将其绑定到上下文,常用语模糊查询的sql中; 1. <if> 应用 demo : 2. <choose> <when> <otherwise> 应用 demo : 这三个元素相当于java中的 switch case default 语句 3. <where> 元素的应用 demo : where元素需要与if 或者是 choose 元素配合使用,当内部子元素条件至少有一个满足时候,会在sql语句中自动插入 where 关键字。目的在于避免一定要在SQL语句中 提前写 where 条件,让SQL语句更加灵活 ps:但是这个时候 where 后 会直接是 and ……,效果是这样的 select …… where and …… 很明显的语法错误对不对,所以没有完美解决这个问题,是一个隐患 4. <trim>

MyBatis框架动态sql语句

瘦欲@ 提交于 2020-03-12 04:03:32
动态 SQL的作用:可以很方便地根据不同条件拼接 SQL 语句 准备: 在里面定义所需要用到的方法 一、if以及where 我们要调用select方法,通过name、mobile字段查询表中数据,但是这两个参数都有可能传入null,这时我们需要在xml文件中判断传入的参数是否为null,如果不为null则将其拼接成SQL语句,在test属性中设置判断条件,where 元素只会在至少有一个子元素的条件返回 SQL 子句的情况下才去插入“where”子句;而且,若语句的开头为“and”或“or”,where 元素也会将它们去除,: for ( UserInfo ui : userInfoDao . select ( "1" , "" ) ) { System . out . println ( ui ) ; } 二、for each foreach元素用于对一个集合进行遍历,构建 IN 条件语句时常用该元素;foreach 元素允许指定一个集合,声明可以在元素体内使用的集合项(item)和索引(index)变量,也允许指定开头与结尾的字符串以及在迭代结果之间放置分隔符。注意:可以将任何可迭代对象(如 List、Set 等)、Map 对象或者数组对象传递给 foreach 作为集合参数;当使用可迭代对象或者数组时,index 是当前迭代的次数,item 的值是本次迭代获取的元素;当使用

MyBatis 源码分析-项目总览

筅森魡賤 提交于 2020-03-12 02:43:33
MyBatis 源码分析-项目总览 1.概述 本文主要大致介绍一下MyBatis的项目结构。 引用参考资料《MyBatis技术内幕》 此外, https://mybatis.org/mybatis-3/zh/index.html MyBatis官方也提供了很不错的中文文档。对于使用中有碰到一些问题,可以参考一下。 2.模块划分 MyBatis在项目模块划分还是很清晰的。各个模块层次以及具体作用,如下: 模块 层次 定义 session 接口层 提供给外部使用的接口API scripting 核心处理层 解析映射文件中的动态SQL节点。并形成数据库可执行的SQL语句。 mapping 核心处理层 映射 builder 核心处理层 配置解析 executor 核心处理层 执行器模块,串联整个执行流程。 plugin 核心处理层 插件模块:提供插件接口,通过自定义插件方式对MyBatis进行拓展 cursor 核心处理层 游标模块 reflection 基础支持层 反射模块:mybatis专门对反射模块进行封装。提供更加简单易用的API type 基础支持层 类型转换模块:Mybatis为简化配置提供了别名机制。提供java类型与JDBC类型转换 logging 基础支持层 日志模块:主要是集成第三方日志 io 基础支持层 资源加载模块:对类加载器进行了封装。确定类加载器顺序

SQL注入详解

↘锁芯ラ 提交于 2020-03-11 17:02:08
今天跟大家分享SQL注入的知识。 前言 先来看一副很有意思的漫画: 相信大家对于学校们糟糕的网络环境和运维手段都早有体会,在此就不多做吐槽了。今天我们来聊一聊SQL注入相关的内容。 1 何谓SQL注入? SQL注入是一种非常常见的数据库攻击手段,SQL注入漏洞也是网络世界中最普遍的漏洞之一。大家也许都听过某某学长通过攻击学校数据库修改自己成绩的事情,这些学长们一般用的就是SQL注入方法。 SQL注入其实就是恶意用户通过在表单中填写包含SQL关键字的数据来使数据库执行非常规代码的过程。简单来说,就是数据「越俎代庖」做了代码才能干的事情。 这个问题的来源是,SQL数据库的操作是通过SQL语句来执行的,而无论是执行代码还是数据项都必须写在SQL语句之中,这就导致如果我们在数据项中加入了某些SQL语句关键字(比如说SELECT、DROP等等),这些关键字就很可能在数据库写入或读取数据时得到执行。 多言无益,我们拿真实的案例来说话。下面我们先使用SQLite建立一个学生档案表。 SQL数据库操作示例: import sqlite3 连接数据库: conn = sqlite3 . connect ( 'test.db' ) 建立新的数据表: conn . executescript ( '' 'DROP TABLE IF EXISTS students ; CREATE TABLE

MyBatis面试题(三)

China☆狼群 提交于 2020-03-11 02:21:38
说说对ORM的理解? 答:ORM就是所谓的对象关系映射,通过这门技术,可以让程序中的实体对象和数据库的记录做到互相映射,对象可以借此持久化到数据库记录,数据库记录也能借此转化为实体对象。 为什么说Mybatis是半自动ORM映射工具?它与全自动的区别在哪里? 答:Hibernate就属于全自动ORM映射工具,因为使用Hibernate查询关联对象或者关联集合对象时,可以根据对象关系模型直接获取,所以它是全自动的。而 Mybatis在查询关联对象或关联集合对象时,需要手动编写sql来完成,所以,称之为半自动ORM映射工具。 你对MyBatis的一级缓存和二级缓存有了解吗,说一下? 答:MyBatis默认只开启一级缓存,一级缓存是对同一个SqlSession起作用,在使用SqlSession第一次查询后,MyBatis会将结果缓存起来,如果下次再使用同一个SqlSession调用Mapper方法,sql的参数也完全相同,如果没有声明需要刷新,同时缓存也没有超时,那SqlSession都会取出当前缓存的数据,而不会再次发送SQL到数据库做查询。 MyBatis的二级缓存是Application级别的缓存,它可以提高对数据库查询的效率,以提高应用的性能。SqlSessionFactory层面上的二级缓存默认是不开启的,二级缓存的开启需要进行配置,实现二级缓存的时候

Mybatis4 Mybatis动态sql的实现

感情迁移 提交于 2020-03-10 20:14:37
1.什么是动态SQL SQL语句不固定, 会根据前台用户的操作而进行变化的SQL语句, 可以被称之为动态SQL. 在MyBatis中, 提供了一组标签, 用于方便的实现动态SQL, 不需要通过java代码拼接字符串了. ###2.动态sql中的标签 1. <if> 用于条件判断, test属性表示判断结果, 要求是一个boolean. 2.<where> 用于维护where子句, 通常配合一起使用. 如下功能: a)当没有条件时, 不会创建WHERE关键字; b)当有条件时, 会自动生成WHERE关键字; c)会自动去掉第一个条件的and/or关键字. 3.<choose><when><otherwise> 功能类似于switch…case…default, 表示多分支判断, 只能成立一个条件 <mapper namespace="com.bjsxt.mapper.UserMapper"> <select id="selByCondition" resultType="user"> select * from tb_user <where> <if test="id != null"> and id=#{id} </if> <if test="username != null and username != ''"> and username=#{username} </if>

课时7:动语态SQL、foreach、输入参数为类中的集合属性、集合、数组、动态数组

末鹿安然 提交于 2020-03-10 19:01:06
.1)if和where标签的使用   1.第一种方式来来实现动态的sql <!-- 是用if标签实现动态sql语句 1--> <select id="queryAllStudentByNameAndAgeSql" resultType="student" parameterType="student"> select stuno,stuname,stusex from student where 1=1 <if test="stuSex!=null and stuSex!=''"> and stusex=#{stuSex} </if> <if test="stuName!=null and stuName!=''"> and stuname=#{stuName} </if>   2.第二种方式来实现动态sql方式 <select id="queryAllStudentByNameAndAgeSql" resultType="student" parameterType="student"> select stuno,stuname,stusex from student <where> <if test="stuSex!=null and stuSex!=''"> and stusex=#{stuSex} </if> <if test="stuName!=null and

(四)Mybatis 面试题

房东的猫 提交于 2020-03-10 13:52:51
Mybatis 86、Mybatis是什么? mybatis是一个持久层ORM框架。它内部封装了jdbc,使得开发更简洁,更高效。 Mybatis使开发者只需要关注sql语句本身,简化JDBC操作,不需要在关注加载驱动、创建连接、处理SQL语句等繁杂的过程。 MyBatis可以通过xml或注解完成ORM映射关系配置。 87、Mybatis和JDBC的关系? (标红) JDBC是Java提供的一个操作数据库的API; MyBatis是一个持久层ORM框架,底层是对JDBC的封装。 MyBatis对JDBC操作数据库做了一系列的优化: (1)mybatis使用已有的连接池管理,避免浪费资源,提高程序可靠性。 (2)mybatis提供插件自动生成DAO层代码,提高编码效率和准确性。 (3)mybatis 提供了一级和二级缓存,提高了程序性能。 (4)mybatis使用动态SQL语句,提高了SQL维护。(此优势是基于XML配置) (5)mybatis对数据库操作结果进行自动映射 88、什么是ORM?(标红) ORM的全称是Object Relational Mapping,即对象关系映射。 描述的是对象和表之间的映射。操作Java对象,通过映射关系,就可以自动操作数据库。 在ORM关系中,数据库表对应Java中的类,一条记录对应一个对象,一个属性对应一个列。 常见的ORM框架

MyBatis动态sql

随声附和 提交于 2020-03-08 18:53:41
利用动态 SQL可以很方便地根据不同条件拼接 SQL 语句 if 常用于根据条件拼接where 子句。 示例: <select id="find" resultType="Blog"> SELECT * FROM BLOG WHERE state = ‘ACTIVE’ <if test="title != null"> AND title like #{title} </if> </select> 说明:如果没有传入“title”,只返回处于“ACTIVE”状态的BLOG;反之,返回处于“ACTIVE”状态且对“title” 进行一列模糊查找的BLOG 结果。 示例: <select id="find" resultType="Blog"> SELECT * FROM BLOG WHERE state = ‘ACTIVE’ <if test="title != null"> AND title like #{title} </if> <if test="author != null and author.name != null"> AND author_name like #{author.name} </if> </select> where where 元素只会在至少有一个子元素的条件返回 SQL 子句的情况下才去插入“WHERE”子句;而且,若语句的开头为“AND”或“OR