mybatis动态sql

MyBatis 源码篇-SQL 执行的流程

生来就可爱ヽ(ⅴ<●) 提交于 2019-12-02 18:19:51
本章通过一个简单的例子,来了解 MyBatis 执行一条 SQL 语句的大致过程是怎样的。 案例代码如下所示: public class MybatisTest { @Test public void selectByPrimaryKey() throws IOException { // 3 StudentDao studentDao = getSqlSession().getMapper(StudentDao.class); // 4 Student student = studentDao.selectByPrimaryKey(1L); System.out.println(student); } /** * 获取SqlSession * * @return */ private SqlSession getSqlSession() throws IOException { // 1 InputStream in = Resources.getResourceAsStream("mybatis-config.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in); // 2 return sqlSessionFactory.openSession(true);

MyBatis 源码篇-整体架构

混江龙づ霸主 提交于 2019-12-02 18:18:09
MyBatis 的整体架构分为三层, 分别是 基础支持层 、 核心处理层 和 接口层 ,如下图所示。 基础支持层 反射模块 该模块对 Java 原生的反射进行了良好的封装,提供了更加简洁易用的 API ,方便上层使调用,并且对反射操作进行了一系列优化,例如缓存了类的元数据,提高了反射操作的性能。 类型转换模块 类型转换模块提供了两个主要功能,一个功能是别名机制,MyBatis 为了简化配置文件提供了别名机制;另一个功能是实现 JDBC 类型与 Java 类型之间的转换,该功能在为 SQL 语句绑定实参以及映射查询结果集时都会涉及。 日志模块 提供详细的日志输出信息,并且能够集成多种日志框架,其日志模块的一个主要功能就是集成第三方日志框架。 资源加载模块 资源加载模块主要是对类加载器进行封装,确定类加载器的使用顺序,并提供了加载类文件以及其他资源文件的功能。 解析器模块 解析器模块主要提供两个功能,一个功能是对 XPath 进行封装,为 MyBatis 初始化时解析 mybatis-config.xml 配置文件以及映射配置文件提供支持;另一个功能是为处理动态 SQL 语句中的占位符提供支持。 数据源模块 MyBatis 自身提供了相应的数据源实现,也提供了与第三方数据源集成的接口。 事务管理 MyBatis 对数据库中的事务进行了抽象,其自身提供了相应的事务接口和简单实现

MyBatis 示例-动态 SQL

我是研究僧i 提交于 2019-12-02 18:16:07
MyBatis 的动态 SQL 包括以下几种元素: 详细的使用参考官网文档: http://www.mybatis.org/mybatis-3/zh/dynamic-sql.html 本章内容简单描述这些动态 SQL 在使用的过程中需要注意的地方。 choose, when, otherwise 比如我们要实现如下功能: 当学生姓名不为空,则只用学生姓名作为条件查询 当学生性别不为空,则只用学生性别作为条件查询 当学生姓名和学生性别都为空,则要求学生学生证件号不为空 针对这种情况,MyBatis 提供了 choose 元素,它有点像 Java 中的 switch 语句。 <select id="listByConditions" parameterType="studentQuery" resultMap="BaseResultMap"> select <include refid="Base_Column_List" /> from t_student <where> <choose> <when test="name != null and name != ''"> AND name LIKE CONCAT('%', #{name}, '%') </when> <when test="sex != null"> AND sex = #{sex} </when>

MyBatis 概念

早过忘川 提交于 2019-12-02 18:13:13
简介 什么是 MyBatis? MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。 使用方式 编程式:通过代码手动注入配置,创建 SqlSessionFactory、SqlSession、Mapper 等对象。 集成式:集成 Spring 等容器 Mapper 的 XML 和 Annotation 形式 Mapper 的使用形式要统一,不要既使用 XML 形式又使用 Annotation 形式,容易出错。建议项目中使用 XML 形式,项目中肯定会出现复杂 SQL,而 XML 对复杂 SQL 的可读性更好。 兼容形式 Mapper 的 XML 和 Annotation 是互补的兼容形式,同一个方法名不能既存在 XML 又存在 Annotation。 优缺点 核心组件 概述 SqlSessionFactoryBuilder(构造器) :它会根据配置信息或者代码来生成 SqlSessionFactory(工厂接口)。 SqlSessionFactory :依靠工厂来生成 SqlSession

Mybatis面试题汇总

老子叫甜甜 提交于 2019-12-02 16:32:56
1、什么是Mybatis? Mybatis是一个半ORM(对象关系映射)框架,它内部封装了JDBC,开发时只需要关注SQL语句本身,不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。程序员直接编写原生态sql,可以严格控制sql执行性能,灵活度高。 MyBatis 可以使用 XML 或注解来配置和映射原生信息,将 POJO映射成数据库中的记录,避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。 通过xml 文件或注解的方式将要执行的各种 statement 配置起来,并通过java对象和 statement中sql的动态参数进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射为java对象并返回。(从执行sql到返回result的过程)。 2、Mybaits的优点: 基于SQL语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,SQL写在XML里,解除sql与程序代码的耦合,便于统一管理;提供XML标签,支持编写动态SQL语句,并可重用。 与JDBC相比,减少了50%以上的代码量,消除了JDBC大量冗余的代码,不需要手动开关连接; 很好的与各种数据库兼容(因为MyBatis使用JDBC来连接数据库,所以只要JDBC支持的数据库MyBatis都支持) 能够与Spring很好的集成; 提供映射标签

mybatis学习笔记02-动态sql

雨燕双飞 提交于 2019-12-02 11:31:38
动态sql sql insert <insert id="addUser" parameterType="User"> <selectKey resultType="Integer" keyColumn="id" order="AFTER" keyProperty="id"> select last_insert_id(); </selectKey> insert into t_user(id, `name`, age) values (#{id},#{name},#{age}); </insert> id: 唯一值, 一般对应mapper接口中的方法名 parameterType: 传入的参数, 因为在核心配置文件里面配置了别名, 所以直接写的类名 #{val}: 中间的字符串可以是任意值, 但是如果参数是对象的话, 必须是属性值 selectKey 中, keyColumn是列名, keyProperty是属性名 order表示的是数据库是先生成 id 再插入数据还是先插入数据再生成 id, mysql写AFTER就好 update <update id="modifyUserById" parameterType="User"> update t_user set name = #{name}, age = #{age} where id = #{id}; </update>

MyBatis 之源码浅读

拜拜、爱过 提交于 2019-12-02 11:06:51
环境简介与入口 记录一下尝试阅读Mybatis源码的过程,这篇笔记是我一边读,一遍记录下来的,虽然内容也不多,对Mybatis整体的架构体系也没有摸的很清楚,起码也能把这个过程整理下来,这也是我比较喜欢的一种学习方式吧 单独Mybatis框架搭建的环境,没有和其他框架整合 入口点的源码如下: @Test public void test01() { try { this.resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml"); // 2. 创建SqlSessionFactory工厂 this.factory = new SqlSessionFactoryBuilder().build(resourceAsStream); // 3. 创建sqlSession // todo 怎么理解这个sqlSession? 首先它是线程级别的,线程不安全, 其次它里面封装了大量的CRUD的方法 this.sqlSession = factory.openSession(); IUserDao mapper = this.sqlSession.getMapper(IUserDao.class); List<User> all = mapper.findAll(); for (User user : all) {

MyBatis 开发手册

自闭症网瘾萝莉.ら 提交于 2019-12-02 07:52:54
摘自: https://www.cnblogs.com/ZhuChangwu/p/11734347.html MyBatis 开发手册 这一遍看Mybatis的原因是怀念一下去年的 10月24号我写自己第一个项目时使用全配置文件版本的MyBatis,那时我们三个人刚刚大二,说实话,当时还是觉得MyBatis挺难玩的,但是今年再看最新版的Mybatis3.5.3, 还是挺有感觉的 Mybatis的官网一级棒... Mybatis的核心组件及其生命周期 # SqlSessionFactoryBuider: # 作用 : 构建器,根据配置信息生成SqlSessionFactory 生命周期 : 这个类可以被实例化、使用和丢弃,一旦创建了 SqlSessionFactory,就不再需要它了。 因此 SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域(也就是局部方法变量)。 你可以重用 SqlSessionFactoryBuilder 来创建多个 SqlSessionFactory 实例,但是最好还是不要让其一直存在,以保证所有的 XML 解析资源可以被释放给更重要的事情。 SqlSessionFactory # 作用 : 生成sqlSession 生命周期 : SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在

Mybatis(上)

大兔子大兔子 提交于 2019-12-02 03:27:02
Mybatis 一、MyBatis 简介 1. MyBatis作用 MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。 MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。 MyBatis可以使用简单的XML用于配置和原始映射,将接口和Java的POJO类映射成数据库中的记录,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。 2. 历史 原是apache的一个开源项目iBatis,2010年6月这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。 iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。 3. 为什么要使用MyBatis? JDBC SQL夹在Java代码块里,耦合度高导致硬编码内伤,维护不易且实际开发需求中sql是有变化,频繁修改的情况多见。 要自已创建connection、创建statement、手动设置参数、结果集检索等 Hibernate 长难复杂SQL,对于Hibernate而言处理也不容易,内部自动生产的SQL,不容易做特殊优化。 基于全映射的全自动框架

技术

谁说胖子不能爱 提交于 2019-12-02 03:22:41
前端控制器配置:第一种:*.action,访问以.action结尾 由DispatcherServlet进行解析第二种:/,所以访问的地址都由DispatcherServlet进行解析,对于静态文件的解析需要配置不让DispatcherServlet进行解析 使用此种方式可以实现 RESTful风格的url 处理器映射器: 对标记@Controller类中标识有@RequestMapping的方法进行映射。在@RequestMapping里边定义映射的url。使用注解的映射器不用在xml中配置url和Handler的映射关系。 注解处理器适配器和注解的处理器映射器是配对使用。理解为不能使用非注解映射器进行映射。 <mvc:annotation-driven><mvc:annotation-driven>可以代替下边的配置: <!--注解映射器 --> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/> <!--注解适配器 --> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/> 实际开发使用