MyBatis是一款能自定义sql和映射的持久层框架,摒除了大量的JDBC代码、手工设置参数和结果集封装,提高了开发效率。
1、SqlSessionFactory
SqlSessionFactory类是获取SqlSession对象的工厂类,实现代码如下:
String resource = config文件的路径(由开发人员编写);
Reader reader =Resources.getResourceAsReader(resource);
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(reader);
config文件的内容如下所示,当然只是举个例子,开发人员必须根据自己的开发环境编写对应的数据
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
---- 此处主要是为了获取Configuration对象
<configuration>
--- 表示默认采用id="development"的environment 配置
<environments default="development">
<environment id="development">
---事务管理
<transactionManager type="JDBC"/>
---采用数据库连接池操作DB
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
---预定义要加载的映射文件
<mappers>
<mapper resource="org/mybatis/example/mapper1.xml"/>
</mappers>
</configuration>
获取SqlSessionFactory的源码对应SqlSessionFactoryBuilder类中的build()方法:
public SqlSessionFactory build(Reader reader, String environment, Properties properties) {
try {
//将config配置文件的信息封装到XMLConfigBuilder对象
XMLConfigBuilder parser = new XMLConfigBuilder(reader, environment, properties);
return build(parser.parse());
} catch (Exception e) {
throw ExceptionFactory.wrapException("Error building SqlSession.", e);
} finally {
ErrorContext.instance().reset();
try {
reader.close();
} catch (IOException e) {
// Intentionally ignore. Prefer previous error.
}
}
}
其中parser.parse()方法的源码如下所示:
public Configuration parse() {
if (parsed) {
throw new BuilderException("Each MapperConfigParser can only be used once.");
}
parsed = true;
parseConfiguration(parser.evalNode("/configuration")); //这句很重要
return configuration;
}
private void parseConfiguration(XNode root) {
try {
---读取config文件中<properties></properties>标签里的内容
propertiesElement(root.evalNode("properties")); //issue #117 read properties first
---读取config文件中<typeAliases></typeAliases>标签里的内容
typeAliasesElement(root.evalNode("typeAliases"));
---读取config文件中<plugins></plugins>标签里的内容
pluginElement(root.evalNode("plugins"));
---读取config文件中<objectFactory></objectFactory>标签里的内容
objectFactoryElement(root.evalNode("objectFactory"));
---读取config文件中<objectWrapperFactory></objectWrapperFactory>标签里的内容
objectWrapperFactoryElement(root.evalNode("objectWrapperFactory"));
----读取config文件中<settings></settings>标签里的内容
settingsElement(root.evalNode("settings"));
---读取config文件中的<environments></environments>标签里的内容
environmentsElement(root.evalNode("environments"));
---读取config文件中的<databaseIdProvider ></databaseIdProvider >标签里的内容
databaseIdProviderElement(root.evalNode("databaseIdProvider"));
---读取config文件中的<typeHandlers ></typeHandlers >标签里的内容,用于自定义数据类型转换
typeHandlerElement(root.evalNode("typeHandlers"));
---读取config文件中的< mappers></mappers >标签里的内容,获取配置的映射文件
mapperElement(root.evalNode("mappers"));
} catch (Exception e) {
throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: " + e, e);
}
}
2、获取SqlSession对象
如果你有一个SqlSessionFactory,你就可以来获取一个SqlSession实例,SqlSession包含了针对数据库执
行语句的每一个方法。你可以直接使用SqlSession执行已经映射的每一个SQL语句。比如:
SqlSession session =ssf.openSession();
try {
Blog blog = session.select("org.mybatis.example.BlogMapper.selectBlog ", 101);
} finally {
session.close();
}
除此之外,还可以通过接口的方式操纵数据库,代码如下:
SqlSession session =sqlSessionFactory.openSession();
try {
BlogMapper mapper = session.getMapper(BlogMapper.class);
Blog blog = mapper.selectBlog(101);
} finally {
session.close();
}
接下来就是编写BlogMapper对应的mapper文件,如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.mybatis.example.BlogMapper">
<select id="selectBlog" parameterType="int" resultType="Blog">
select * from Blog where id = #{id}
</select>
</mapper>
在上面的代码中在方法调用完后,必须关闭openSession对象,避免数据库资源一直被占用。
3、高级结果查询
(1)、一对一查询简单查询(association)
<!-- Very Complex Result Map -->
<resultMap id="detailedBlogResultMap" type="Blog">
<constructor>
<idArg column="blog_id" javaType="int"/>
</constructor>
<result property="title" column="blog_title"/>
---blog表和author表关联查询,将author表中的查询结果封装到Author对象,同时将Author对象赋值给blog对 ---象的author属性,也可在association标签中设置select=”selectAuthor”属性,表示结果集从selectAuthor ---方法读取
<association property="author" column="blog_author_id" javaType="Author">
<id property="id" column="author_id"/>
<result property="username" column="author_username"/>
<result property="password" column="author_password"/>
<result property="email" column="author_email"/>
</association>
</resultMap>
constructor–用来将结果反射给一个实例化好的类的构造器
idArg –ID参数;将结果集标记为ID,以方便全局调用
arg –反射到构造器的通常结果
id –ID结果,将结果集标记为ID,以方便全局调用
result –反射到JavaBean属性的普通结果
association –复杂类型的结合;多个结果合成的类型
(2)、识别器查询(discriminator)
将上述的配置
<resultMap id="vehicleResult" type="Vehicle">
<id property=”id”column="id" />
<result property="vin" column="vin"/>
<result property="year" column="year"/>
<result property="color" column="color"/>
<discriminator javaType="int" column="vehicle_type">
<case value="1" resultMap="carResult"/>
<case value="2" resultMap="truckResult"/>
<case value="3" resultMap="vanResult"/>
<case value="4" resultMap="suvResult"/>
</discriminator>
</resultMap>
MyBatis将会从数据集中获取每条记录,并比较vehicletype的值。如果它匹配了识别器的条件,就会使用相对应的resultMap。
(3)、一对多查询(collection )
<resultMap id="blogResult" type="Blog">
<id property=”id”column="blog_id" />
<result property="title" column="blog_title"/>
<collection property="posts" ofType="Post">
<id property="id" column="post_id"/>
<result property="subject" column="post_subject"/>
<result property="body" column="post_body"/>
</collection>
</resultMap>
collection标签表示:一组名为posts的ArrayList集合,它的类型是Post。javaType 属于完全可以省略,MyBatis会为你自动识别。
4、foreach动态SQL语句(参数为list、array等集合类型)
<select id="selectPostIn" resultType="domain.blog.Post">
SELECT * FROM POST P WHERE ID in
<foreach item="item" index="index" collection="list" open="(" separator="," close=")">
#{item}
</foreach>
</select>
foreach元素非常强大,允许你指定一个集合,申明一个项和一个索引变量,用在这个元素的方法体内。也允许你指定开始和结束的字符,也可以在两个迭代器之间加入一个分隔符。它的智能之处在于它不会偶尔追加额外的分隔符。
注意:你可以传入一个List实例或者一个数组给MyBatis作为一个参数对象。如果你这么做,MyBatis会自动将它包装成一个Map,使用它的名称做为key。List实例将使用“list”做为键,数组实例以“array”作为键。
5、@InsertProvider使用
这是可选的SQL注解,允许你在运行的过程中,指定类名和方法名返回SQL来执行。。属性:type,method。type属性指定类的全名,method方法属性指定方法名称。
6、@InsertProvider结合SqlBuilder
mapper接口类的代码如下:
@InsertProvider(method = "insert", type = MySqlBuilder.class)
public Integer insert(UserType entity);
MySqlBuilder类的代码如下:
import static org.apache.ibatis.jdbc.SelectBuilder.BEGIN;
import static org.apache.ibatis.jdbc.SqlBuilder.*;
public class
MySqlBuilder {
public String insert() {
BEGIN();
INSERT_INTO(TABLE_NAME);
VALUES("value", "#{value}");
return SQL();
}
}
分享到:
相关推荐
在"SpringMVC+MyBatis开发从入门到实践源码"这个项目中,你将会找到各个章节的代码示例,这些示例涵盖了从基本的配置到复杂的业务场景。例如,如何设置SpringMVC的DispatcherServlet,如何编写Controller,如何配置...
这个资源"Mybatis开发实战讲解(源代码)"提供了一套完整的Mybatis实践教程,帮助开发者深入理解和掌握Mybatis的使用。通过源代码分析,我们可以从以下几个方面学习Mybatis的核心知识点: 1. **配置文件解析**:...
Mybatis开发所需的文件,其中包含的mybatis.jar,mysql-connector-java-bin.jar,mybatis-3-config.dtd,mybatis-3-mapper.dtd。
基于SpringBoot+Mybatis开发的分布式校园租赁系统 基于SpringBoot+Mybatis开发的分布式校园租赁系统 基于SpringBoot+Mybatis开发的分布式校园租赁系统 基于SpringBoot+Mybatis开发的分布式校园租赁系统 基于...
毕设项目:基于SpringMVC+MyBatis开发学生管理系统 毕设项目:基于SpringMVC+MyBatis开发学生管理系统 毕设项目:基于SpringMVC+MyBatis开发学生管理系统 毕设项目:基于SpringMVC+MyBatis开发学生管理系统 毕设项目...
Mybatis是一款广受欢迎的Java持久层框架,它简化了数据...通过阅读《Mybatis开发手册》和《MyBatis_3_User_Guide_Simplified_Chinese.pdf》,开发者能全面理解Mybatis的各个方面,熟练运用到实际项目中,提升开发效率。
### MyBatis 开发文档概览 #### 一、MyBatis 概述 MyBatis 是 Apache 的一个开源项目 iBatis,在 2010 年该项目由 Apache Software Foundation 迁移到了 Google Code,并更名为 MyBatis。随后在 2013 年 11 月迁移...
ASP.NET 搭建 MyBatis 开发环境详解 在.NET开发领域,ASP.NET一直以其高效、稳定的特点受到广大开发者青睐。而MyBatis作为Java领域广泛应用的持久层框架,其实现灵活,易于理解,也逐渐被.NET社区所接受。本篇文章...
Spring+MyBatis开发实战
在"Mybatis开发示例"中,我们通常会遇到以下几个关键知识点: 1. **核心配置文件**:MyBatis的核心配置文件(mybatis-config.xml)是整个MyBatis框架的入口,它包含了数据源、事务管理器、环境配置等重要信息。配置...
基于idea + springboot + maven + mybatis 开发的拍卖行系统 项目经过严格测试,确保可以运行! 基于idea + springboot + maven + mybatis 开发的拍卖行系统 项目经过严格测试,确保可以运行! 基于idea + ...
本科毕设-课设-基于SpringMVC+MyBatis开发学生管理系统.zip本科毕设-课设-基于SpringMVC+MyBatis开发学生管理系统.zip本科毕设-课设-基于SpringMVC+MyBatis开发学生管理系统.zip本科毕设-课设-基于SpringMVC+MyBatis...
在Java开发中,MyBatis作为一款轻量级的数据访问框架,因其灵活性和高效性,被广泛应用。以下是一些关于MyBatis的核心知识点: 1. **动态SQL**:MyBatis的一大亮点是支持动态SQL,通过在Mapper XML文件中使用`<if>`...
基于spring+springMvc+mybatis 开发的企业门户网站基于spring+springMvc+mybatis 开发的企业门户网站,适合具有一定编程基础,比如计算机专业的大学生或者1-3年工作经验的开发人员。手写简化版 Spring 框架,了解 ...
在本案例中,我们关注的是"Mybatis开发插件",这是一款专门为MyEclipse设计的,用于简化MyBatis框架集成和使用的工具。 MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎...
基于Spring+SpringMVC+MyBatis开发的员工管理系统+源码,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~ 基于Spring+SpringMVC+MyBatis开发的员工管理系统+源码,...
基于java+springboot+mybatis开发的学生选课系统+源码,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~ 基于java+springboot+mybatis开发的学生选课系统+源码,...
【标题解析】:“mybatis开发通用mapper共9页.pdf.zip”这个标题暗示了文档内容是关于MyBatis框架中通用Mapper的开发指南,且共有9页。通用Mapper是MyBatis的一个扩展,它提供了一些预定义的SQL映射,使得在实际开发...
在进行MyBatis开发时,基础的jar包是必不可少的,这些jar包提供了MyBatis框架的核心功能,使得开发者能够方便地将数据库操作与应用程序逻辑相结合。下面将详细介绍这个压缩包中的关键知识点。 首先,MyBatis的jar包...