第3章 MyBatis使用进阶(理论)
嵌套结果的使用
关联映射的嵌套结果
<resultMap type="author" id="authorResult"> <id property="id" column="author_id"/> <result property="username" column="username"/> <result property="password" column="password"/> <result property="email" column="email"/> <result property="address" column="address"/> <result property="phone" column="phone"/> </resultMap>
resultMap对象
关联配置
配置与性能优化
在前面的配置中(关联配置,集合映射配置)都会出现一个N+1查询问题
每次执行一次查询都会伴随着另一个查询语句来加载关联的对象或集合,如果加载的关联数据较多,则执行的查询语 句次数会增加。
使用嵌套结果来提高查询效率
在select中指定一个查询语句来获取查询结果,此查询语句使用连接查询来配置:
关联配置多方
多方
<resultMap type="comment" id="commentResult"> <id property="id" column="author_id"/> <result property="createDate" column="date"/> <result property="......." column="..."/> <association property="blog" column="blog_id" javaType="blog" select="findBloyById"></association> </resultMap> <select id="findUserTypeById" parameterType="int" resultType="blog"> select * from blog where id=#{id} </select> //注意,当实体类与列名不同时,请用resultMap应用该表的自定义
总结
在mybatis中,可以通过关联映射与集合映射来实现多对一和一对多 的关系,这样即可很方便地通过一个对象找到关联的其他对象或通 过一个对象找到关联的多个对象,以便于获取数据。 关联映射用于实现对象之间一对一、多对一的情况,通过配置 association标签来实现关联。 集合映射用于实现对象之间一对多的关联,通过配置collection标签 来实现。 在关联中加载对象,mybatis使用了两种不同的方式:
集合嵌套结果
嵌套的集合也可以写成如下样式:
<!--集合嵌套结果映射--> <collection property="comments" ofType="comment" column="id" javaType="ArrayList"> <id property="id" column="id"/> <result property="content" column="comment_content"/> <result property="postDate" column="postDate"/> </collection>
(1)嵌套查询。嵌套查询会出现“N+1”查询问题,多次执行SQL语句影 响程序的效率。 (2)嵌套结果。嵌套结果可以使用连接查询来完成对象之间结果的嵌套, 避免了嵌套查询出现的问题。
第3章 MyBatis关联配置
本章内容
高级关联 集合映射 关联优化
本章目标
掌握关联结果的配置与使用 掌握集合映射的配置与使用 掌握关联的嵌套结果
关联
关联关系是一种结构化的关系,指一种对象和另一种对象有联系。给 定关联的两个类,可以从其中的一个类的对象访问到另一个类的相关 对象。在UML图中,关联关系用一条实线来表示。 关联可以有方向,表示该关联在某方向被使用。只在一个方向上存在 的关联,称为单向关联(Unidirectional Association),在两个方向 上都存在的关联,称为双向关联(Bidirectional Associ最常见的关系莫过于主外键的一对多关联了,例如,一篇博客有多个评论,一个老师管理多个学生这样的关 联映射。 通常的做法是在一方配置collection节点,在多方配置association 节点。 一方: <resultMap type="blog" id="blogResult"> <id column="id" property="id"/> <result column="title" property="title"/> <result column="content" property="content"/> <result column="create_time" property="createTime"/> <result column="type" property="type"/> <collection property="comments" column="id" javaType="ArrayList" ofType="comment" select="selectComments"/> //ofType为集合中保存的类型 </resultMap> <select id="selectComments" parameterType="int" resultType="comment"> select * from comment where blog_id = #{id} </select> //注意,当实体类与列名不同时,请用resultMap应用该表的自定义resultMap对象 <select id="selectBlogs" resultMap="blogResult" >select * from blog</select>//常规查询
<collection property="comment" column="blog_id" javaType="java.util.Set" ofType="comment" resultMap="commentResult"></collection> commentResult是关联表的字段声明,需要注意的是只包含基本类型的字段,也就是说 这种嵌套 map只能用于单向关联
<select id="selectBlogById" resultMap="blogResult" parameterType="int"> select B.*, C.id, C.content as comment_content, C.postDate from Blog B left outer join Comment C on b.id = c.blog_id where B.id = #{id} </select>
mybaits工作原理
mybaits工作原理
MyBatis是一种Java持久层框架,其工作原理是通过XML或注解方式将SQL语句映射到Java对象中,从而实现数据库的访问和操作。
MyBatis的工作原理可以分为三个步骤:配置、映射和执行。
1. 配置:MyBatis的配置文件包括数据源、事务管理器、映射器等信息。
其中,数据源配置是必须的,它定义了数据库的连接信息,使得MyBatis能够连接到数据库。
事务管理器配置则是为了确保数据操作的一致性和完整性。
映射器配置则是为了将Java对象与SQL 语句进行映射。
2. 映射:映射是将Java对象与SQL语句进行绑定。
通过XML或注解方式,MyBatis可以将Java对象的属性与SQL语句的参数进行绑定,从而实现数据库的访问和操作。
同时,MyBatis还支持动态SQL,可以根据不同的条件生成不同的SQL语句。
3. 执行:执行是将映射好的SQL语句进行执行。
MyBatis将SQL 语句发送到数据库中执行,并将返回结果转换为Java对象。
在执行过程中,MyBatis还支持缓存机制,可以将执行结果进行缓存,提高查询效率。
除此之外,MyBatis还支持插件机制,可以通过插件来扩展
MyBatis的功能。
插件可以在执行SQL语句前或后进行拦截,从而实现自定义的功能。
总的来说,MyBatis的工作原理是通过配置、映射和执行三个步骤实现数据库的访问和操作。
通过XML或注解方式将SQL语句映射到Java对象中,从而实现数据库的操作。
同时,MyBatis还支持动态SQL、缓存机制和插件机制等功能,可以满足不同场景的需求。
MyBatis核心技术全解与项目实战读书笔记
《MyBatis核心技术全解与项目实战》读书笔记1. 第一章 MyBatis简介本章主要介绍了MyBatis的基本概念、特点和优势,以及其在Java企业级应用开发中的重要作用。
MyBatis是一个优秀的持久层框架,它将SQL语句与Java对象映射(POJO)相结合,使得开发人员可以更加方便地操作数据库。
MyBatis的主要目标是简化数据库操作,提高开发效率,同时也提供了良好的数据封装和安全性。
SqlSessionFactory:用于创建SqlSession对象,SqlSession是MyBatis中执行SQL语句的核心接口。
SqlSession:用于执行SQL语句的会话对象,可以通过它来执行增删改查等操作。
Mapper:映射器接口,用于定义SQL语句和Java对象之间的映射关系。
Configuration:MyBatis的全局配置类,用于配置各种属性,如缓存策略、事务管理等。
插件:MyBatis的插件机制,允许开发者自定义拦截器、类型处理器等组件,以实现对MyBatis的功能扩展。
灵活性:MyBatis支持多种存储结构,如JDBC、ODBC、JNDI等,同时还支持自定义类型处理器和插件,使得MyBatis能够满足各种复杂的数据库操作需求。
易用性:MyBatis提供了简洁的XML映射文件来描述SQL语句和Java对象之间的映射关系,使得开发者无需编写复杂的SQL语句即可完成数据库操作。
性能优化:MyBatis通过一级缓存和二级缓存机制来提高查询性能,同时还支持动态SQL、分页查询等功能,使得MyBatis能够在高并发环境下保持良好的性能表现。
安全性:MyBatis提供了严格的权限控制机制,可以限制不同用户对数据库的操作权限,保证数据的安全性。
1.1 MyBatis概念及特点MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。
相比于传统的数据访问技术,MyBatis让开发者能够更加直接地与数据库交互,从而有效地避免了大量繁琐的SQL语句编写工作。
MyBatisPlus入门使用详细教程
MyBatisPlus⼊门使⽤详细教程⼀、MyBatis Plus 介绍MyBatis Plus 是国内⼈员开发的 MyBatis 增强⼯具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提⾼效率⽽⽣。
MyBatis Plus 的核⼼功能有:⽀持通⽤的 CRUD、代码⽣成器与条件构造器。
通⽤ CRUD:定义好 Mapper 接⼝后,只需要继承BaseMapper<T>接⼝即可获得通⽤的增删改查功能,⽆需编写任何接⼝⽅法与配置⽂件条件构造器:通过EntityWrapper<T>(实体包装类),可以⽤于拼接 SQL 语句,并且⽀持排序、分组查询等复杂的SQL代码⽣成器:⽀持⼀系列的策略配置与全局配置,⽐ MyBatis 的代码⽣成更好⽤BaseMapper<T>接⼝中通⽤的 CRUD ⽅法:⼆、MyBatis Plus 集成 Spring数据表结构DROP TABLE IF EXISTS `tbl_employee`;CREATE TABLE `tbl_employee` (`id` int(11) NOT NULL AUTO_INCREMENT,`last_name` varchar(50) DEFAULT NULL,`email` varchar(50) DEFAULT NULL,`gender` char(1) DEFAULT NULL,`age` int(11) DEFAULT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;pom⽂件<dependencies><!-- MP --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus</artifactId><version>2.3</version></dependency><!-- 测试 --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency><!-- 数据源 --><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.10</version></dependency><!-- 数据库驱动 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.39</version></dependency><!-- Spring 相关 --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>4.3.9.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-orm</artifactId><version>4.3.9.RELEASE</version></dependency></dependencies>MyBatis 全局配置⽂件mybatis-config.xml<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configurationPUBLIC "-////DTD Config 3.0//EN""/dtd/mybatis-3-config.dtd"><!-- 不作任何配置 --><configuration />数据源db.propertiesjdbc.url=jdbc:mysql://localhost:3306/mpername=rootjdbc.password=1234Spring 配置⽂件applicationContext.xml<!-- 数据源 --><context:property-placeholder location="classpath:db.properties"/><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"><property name="url" value="${jdbc.url}"></property><property name="username" value="${ername}"></property><property name="password" value="${jdbc.password}"></property></bean><!-- MP 提供的 MybatisSqlSessionFactoryBean --><bean id="sqlSessionFactoryBean"class="com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean"><!-- 数据源 --><property name="dataSource" ref="dataSource"></property><!-- mybatis 全局配置⽂件 --><property name="configLocation" value="classpath:mybatis-config.xml"></property><!-- 别名处理 --><property name="typeAliasesPackage" value="com.jas.bean"></property><!-- 注⼊全局MP策略配置 --><property name="globalConfig" ref="globalConfiguration"></property><!-- 插件注册 --><property name="plugins"><list><!-- 注册分页插件 --><bean class="com.baomidou.mybatisplus.plugins.PaginationInterceptor" /><!-- 注⼊ SQL 性能分析插件,建议在开发环境中使⽤,可以在控制台查看 SQL 执⾏⽇志 --> <bean class="com.baomidou.mybatisplus.plugins.PerformanceInterceptor"><property name="maxTime" value="1000" /><!--SQL 是否格式化默认false--><property name="format" value="true" /></bean></list></property></bean><!-- 定义 MybatisPlus 的全局策略配置--><bean id ="globalConfiguration" class="com.baomidou.mybatisplus.entity.GlobalConfiguration"> <!-- 在 2.3 版本以后,dbColumnUnderline 默认值是 true --><property name="dbColumnUnderline" value="true"></property><!-- 全局的主键策略 --><property name="idType" value="0"></property><!-- 全局的表前缀策略配置 --><property name="tablePrefix" value="tbl_"></property></bean><!-- 配置mybatis 扫描mapper接⼝的路径 --><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="com.jas.mapper"></property></bean>三、快速体验 MyBatis Plus实体类Employee@TableName(value = "tbl_employee")public class Employee {@TableId(value = "id", type = IdType.AUTO)private Integer id;@TableField(value = "last_name")private String lastName;private String email;private Integer gender;private Integer age;public Employee() {super();}public Employee(Integer id, String lastName, String email, Integer gender, Integer age) {this.id = id;stName = lastName;this.email = email;this.gender = gender;this.age = age;}// 省略 set、get 与 toString() ⽅法mapper 接⼝/*** 不定义任何接⼝⽅法*/public interface EmployeeMapper extends BaseMapper<Employee> {}在测试类中⽣成测试的 mapper 对象private ApplicationContext context =new ClassPathXmlApplicationContext("classpath:applicationContext.xml");private EmployeeMapper employeeMapper =context.getBean("employeeMapper", EmployeeMapper.class);简单查询测试@Testpublic void getEmpByIdTest() {Employee employee = employeeMapper.selectById(1);System.out.println(employee);}分页查询测试@Testpublic void getEmpByPage() {Page<?> page = new Page<>(1, 5);List<Employee> list = employeeMapper.selectPage(page, null);System.out.println("总记录数:" + page.getTotal());System.out.println("总页数" + page.getPages());System.out.println(list);}条件构造器测试@Testpublic void getEmpByName() {EntityWrapper<Employee> wrapper = new EntityWrapper<>();// 'last_name' 与 'age' 对应数据库中的字段wrapper.like("last_name", "张");wrapper.eq("age", 20);List<Employee> list = employeeMapper.selectList(wrapper);System.out.println(list);}控制台输出的 SQL 分析⽇志上⾯⼏个例⼦中,并没有在EmployeeMapper接⼝中定义任何⽅法,也没有在配置⽂件中编写 SQL 语句,⽽是通过继承BaseMapper<T>接⼝获得通⽤的的增删改查⽅法,复杂的 SQL 也可以使⽤条件构造器拼接。
mybatis 的工作原理
mybatis 的工作原理
MyBatis是一个持久层框架,用于将Java对象映射到数据库中的表。
它的工作原理如下:
1. 配置文件:MyBatis使用XML或注解进行配置。
配置文件包含数据库连接信息、SQL语句和映射规则等。
2. SqlSessionFactory:通过配置文件创建SqlSessionFactory对象。
SqlSessionFactory负责创建SqlSession对象,它是MyBatis与数据库交互的核心类。
3. SqlSession:SqlSession是具体执行SQL操作的地方。
通过SqlSession可以执行SQL语句、提交事务、关闭连接等。
4. 映射文件:映射文件定义了Java对象与数据库表的映射关系,包含了SQL语句以及参数映射等信息。
5. 执行SQL:当调用SqlSession的方法时,MyBatis会根据映射文件中的配置,将SQL语句解析成对应的数据库操作,并执行之。
6. 结果映射:执行完SQL语句后,MyBatis会将数据库返回的结果映射到Java对象中,并返回给调用方。
通过以上的步骤,MyBatis实现了将Java对象与数据库表进行交互的功能。
它的优势在于灵活的配置和强大的SQL映射能力,使开发人员能够更加轻松地操作数据库。
mybatis基本工作原理
mybatis基本工作原理Mybatis是一款Java持久层框架,是著名的SqlMap框架的升级版。
Mybatis的本质是一个ORM框架,是一种半自动化的框架,将数据库中的数据与Java对象建立映射关系,使Java对象与关系型数据库中的表结构进行映射,从而实现数据的持久化存储及后续的CRUD操作。
一、Mybatis工作流程Mybatis的工作流程主要可以分为三个步骤:准备工作、执行工作和结果处理。
1. 准备工作在执行SQL之前,Mybatis需要先加载并解析配置文件,并通过配置文件中的信息构建出SqlSessionFactory对象。
然后,SqlSessionFactory会创建SqlSession对象,并且在此过程中会设置数据库连接,以及配置一些参数信息用于后续的SQL执行。
2. 执行工作执行SQL语句时,SqlSession对象会将SQL语句、参数和对应的映射文件(即配置文件)传递给Executor对象,由Executor对象实际执行SQL语句。
Executor对象根据SQL类型的不同,调用相应的Statement和ResultSet来执行和处理SQL语句。
3. 结果处理当Executor对象执行完SQL语句后,会返回一个包含查询结果的ResultSet对象,SqlSession对象会根据ResultMap对象把ResultSet中的数据映射成Java对象。
最后,将映射好的Java对象返回给应用层。
二、Mybatis配置文件Mybatis的配置文件主要包括两个文件:mybatis-config.xml和映射文件(*.xml)。
1. mybatis-config.xmlmybatis-config.xml是Mybatis的核心配置文件,其中包括数据源等信息。
mybatis-config.xml的配置最核心的是配置数据源,即配置数据库信息。
其中,数据源的配置主要包括连接数据库需要的地址、用户名、密码等信息。
mybatis的几种用法
mybatis的几种用法MyBatis是一种优秀的ORM框架,被广泛运用于Java项目中,它可以使开发者更加简便地与数据库交互。
以下是MyBatis的几种用法:1. XML方式MyBatis最早的使用方式是通过XML来配置SQL语句和映射关系。
在这种方式下,我们需要提供一个Mapper.xml文件来定义SQL语句和对应数据模型的映射关系。
这种方式的优点是灵活性高,但是需要编写大量的XML代码。
2. 注解方式MyBatis支持使用注解来配置SQL语句和映射关系,这种方式不需要像XML方式那样编写大量的XML代码。
在这种方式下,我们需要在接口的方法上使用@Select、@Update、@Insert、@Delete等注解来指定SQL语句,并且通过@ResultMap、@Results等注解来声明数据模型的映射关系。
这种方式的优点是简单易用,但是缺点是可读性差。
3. Mapper动态代理方式使用Mapper动态代理方式,我们可以直接调用Mapper接口中的方法来进行CRUD操作,而不需要编写任何的SQL语句和映射关系。
Mapper动态代理方式的优点是使代码更加清晰简洁,但是对于一些复杂的SQL操作,可能需要编写多个Mapper接口方法,从而增加了代码量。
4. 通用Mapper插件通用Mapper插件是MyBatis提供的一个插件,它能够帮助我们自动生成Mapper接口和SQL语句。
在使用通用Mapper插件时,我们需要在MyBatis配置文件中配置mapper接口和映射关系。
使用通用Mapper插件可以减少大量的重复代码,但是对于一些定制化的SQL操作,可能需要在Mapper接口中手动注入SQL。
总之,MyBatis提供了多种使用方式,开发者可以根据自己的需求选择最适合的方式。
MyBatis3用户指南中文版
mybatis 实现原理
MyBatis实现原理一、概述MyBatis是一款优秀的持久层框架,其核心原理是基于数据访问对象(DAO)模式,通过将数据库操作与业务逻辑进行分离,提供了一种简洁、灵活的方式来访问数据库。
本文将从以下几个方面详细介绍MyBatis的实现原理。
二、MyBatis架构MyBatis的架构可以分为三层:SQL映射层、数据源层和事务层。
其中,SQL映射层负责处理SQL语句的解析和映射;数据源层负责对数据库进行操作;事务层则负责处理业务操作的事务。
2.1 SQL映射层2.1.1 SQL解析MyBatis通过XML配置或注解的方式来定义SQL语句,其中XML配置方式是主要的方式。
在解析XML配置文件时,MyBatis使用了XPath来定位SQL语句的位置,并利用Java的反射机制将SQL语句与对应的DAO接口方法绑定。
2.1.2 SQL映射在SQL映射过程中,MyBatis将SQL语句分为静态SQL和动态SQL。
静态SQL是指在XML配置文件中定义的固定的SQL语句,而动态SQL则是根据业务需求在运行时生成的SQL语句。
2.2 数据源层MyBatis使用数据源来管理数据库连接。
在数据源层,MyBatis提供了多种数据源的实现,包括JDBC数据源、连接池数据源等。
通过数据源,MyBatis可以很方便地获取数据库连接,并在数据操作完成后释放连接。
2.3 事务层事务管理是企业级应用中非常重要的一环。
MyBatis提供了对事务的支持,可以用于对数据库操作进行事务管理。
在事务层,MyBatis使用JDBC的事务机制或声明式事务来管理事务的提交和回滚,保证数据的原子性、一致性、隔离性和持久性。
三、MyBatis执行流程MyBatis的执行流程可以分为四个阶段:配置解析阶段、初始化阶段、SQL执行阶段和结果映射阶段。
3.1 配置解析阶段在配置解析阶段,MyBatis会读取XML配置文件或注解,解析出数据源配置、SQL 语句配置等信息,并将其加载到内存中。
idea2024mybatisx使用方法
idea2024mybatisx使用方法MyBatisX是一个基于MyBatis的增强工具库,它提供了一些方便开发的功能和工具,同时也简化了一些常用操作的编写。
下面是关于MyBatisX使用方法的详细介绍,包含了基本的使用流程和一些常见的功能示例。
总字数约为1200字以上。
一、MyBatisX的安装和配置:1.3将安装文件复制到项目中的合适位置,并在项目的配置文件中进行相应的配置。
二、MyBatisX的基本使用流程:2.1 创建实体类,定义实体类的属性和对应的getter和setter方法。
2.3 创建Mapper.xml文件,配置SQL语句和参数的映射关系。
2.4 在MyBatis的配置文件中加载Mapper接口和Mapper.xml文件。
2.5 在代码中使用MyBatisX提供的工具和方法来进行数据库操作。
三、MyBatisX的常见功能示例:下面是一些常见功能的示例,用于演示MyBatisX的用法。
3.1分页查询:实现分页查询的方法有多种,这里介绍使用MyBatisX提供的拦截器实现分页查询的方法。
首先在Mapper接口中定义一个分页查询的方法,如:然后在Mapper.xml文件中配置SQL语句和参数的映射关系,如:<select id="getUsersByPage" resultType="User">select * from userlimit #{pageNum}, #{pageSize}</select>最后在代码中调用该方法即可实现分页查询。
3.2动态SQL查询:动态SQL查询是指根据不同的条件来生成不同的SQL语句,MyBatisX提供了一些工具和方法来方便地实现动态SQL查询。
首先在Mapper接口中定义一个动态SQL查询的方法,如:然后在Mapper.xml文件中配置动态SQL语句和参数的映射关系,如:<select id="getUsersByCondition" resultType="User">select * from user where 1=1<if test="name!=null">and name = #{name}</if><if test="age!=0">and age = #{age}</if></select>最后在代码中调用该方法并传入相应的参数即可实现动态SQL查询。
mybatis的执行原理
Mybatis的执行原理一、介绍Mybatis是一款轻量级的持久层框架,它的执行原理是如何实现的呢?本文将会详细介绍Mybatis的执行原理,帮助读者深入理解这个框架。
二、解析配置文件Mybatis的执行原理首先涉及到配置文件的解析。
配置文件是Mybatis的核心,通过配置文件可以配置数据库连接信息、SQL映射关系等。
2.1 加载配置文件Mybatis在启动时,会加载配置文件到内存。
配置文件的加载是通过SqlSessionFactoryBuilder类来实现的,它会读取配置文件中的内容,并将其解析为Configuration对象。
2.2 解析配置文件解析配置文件的过程中,Mybatis会使用一些解析器对配置文件进行解析。
2.2.1 XMLConfigBuilderXMLConfigBuilder类负责解析配置文件的根元素<configuration>,并通过调用其他解析器来解析具体的配置内容。
2.2.2 XMLMapperBuilderXMLMapperBuilder类负责解析配置文件中的SQL映射关系,包括SQL语句、参数映射、结果映射等。
2.2.3 XMLStatementBuilderXMLStatementBuilder类负责解析具体的SQL语句,包括SQL的类型(查询、更新、删除等)、参数的设置、结果的映射等。
三、创建SqlSession解析配置文件完成后,Mybatis会根据配置信息创建SqlSessionFactory对象,然后通过它来创建SqlSession对象。
3.1 SqlSessionFactorySqlSessionFactory是Mybatis的核心接口,它负责创建SqlSession对象。
SqlSessionFactory的创建需要依赖Configuration对象和Executor对象。
3.2 SqlSessionSqlSession是Mybatis的会话对象,在应用程序和数据库之间起到桥梁的作用。
