一、了解什么是Mybatis
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO)。MyBatis 是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。每个MyBatis应用程序主要都是使用SqlSessionFactory实例的,一个SqlSessionFactory实例可以通过SqlSessionFactoryBuilder获得。SqlSessionFactoryBuilder可以从一个xml配置文件或者一个预定义的配置类的实例获得。用xml文件构建SqlSessionFactory实例是非常简单的事情。推荐在这个配置中使用类路径资源 (classpath resource),但你可以使用任何Reader实例,包括用文件路径或file://开头的url创建的实例。MyBatis有一个实用类 ----Resources,它有很多方法,可以方便地从类路径及其它位置加载资源。
二、前期准备
下载jar包或者使用maven加入依赖,如果使用maven,可加入以下依赖:
<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.3.0</version> </dependency>
三、配置整体Mybatis配置文件(Configuration.xml)
基本配置文件xml如下:
<?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> <!-- 这些先暂时不用 <settings> //有很多属性可以设置,比如是否使用自动生成的主键,等等。。。 <setting name="useGeneratedKeys" value="false"/> <setting name="useColumnLabel" value="true"/> </settings> --> <!--定义别名,方便别处引用,不是必须的--> <typeAliases> <typeAlias alias="UserAlias" type="com.gusi.demo.chat.pojo.User"/> </typeAliases> <!--设置数据库相关的连接信息等--> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"> <property name="" value=""/> </transactionManager> <dataSource type="UNPOOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://127.0.0.1:3306/autochat"/> <property name="username" value="root"/> <property name="password" value="root"/> </dataSource> </environment> </environments> <!--设置实体类的映射配置文件xml--> <mappers> <mapper resource="com/gusi/demo/chat/pojo/User.xml"/> </mappers> </configuration>
四、书写实体类以及映射配置文件( User.java, User.xml)
User.java 省略
User.xml:
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="User">//命名空间,需要唯一 <resultMap type="com.gusi.demo.chat.pojo.User" id="UserResult">//将查询结果映射成JavaBean <id column="id" jdbcType="INTEGER" property="id"/>//数据库中主键映射 <result column="username" jdbcType="VARCHAR" property="username"/>//column表示sql查询返回的列名 <result column="password" jdbcType="VARCHAR" property="password.encrypted"/>//property表示JavaBean中属性名 <result column="administrator" jdbcType="BOOLEAN" property="administrator"/>//jdbcType表示数据库字段类型 </resultMap> //该语句通过命名空间和ID唯一标识,在java代码中调运该语句即可执行该语句对应的sql //parameterType是参数类型,可以是基本类型,也可是JavaBean类型 //resultMap表示使用定义的哪个映射关系将结果集合转换为JavaBean <select id="find" parameterType="long" resultMap="UserResult"> SELECT * FROM user WHERE id = #{id:INTEGER} </select> //如果返回的是基本数据类型,就不用resultMap,直接使用resultType指定返回数据类型 <select id="version" parameterType="long" resultType="int"> SELECT version FROM user WHERE id = #{id,jdbcType=INTEGER} </select> //如果没有返回结果,resultMap和resultType都不需要 <delete id="delete" parameterType="com.gusi.demo.chat.pojo.User"> DELETE FROM user WHERE id = #{id:INTEGER} </delete> //在此可以使用别名,方便书写,比如下面的UserAlise是在整体的配置文件中声明的别名 <insert id="insert" parameterType="UserAlias" useGeneratedKeys="false"> INSERT INTO user ( id, username, password, administrator ) VALUES ( #{id}, #{username,jdbcType=VARCHAR}, #{password.encrypted:VARCHAR}, #{administrator,jdbcType=BOOLEAN} ) </insert> <update id="update" parameterType="UserAlias"> UPDATE user SET username = #{username,jdbcType=VARCHAR}, password = #{password.encrypted,jdbcType=VARCHAR}, administrator = #{administrator,jdbcType=BOOLEAN} WHERE id = #{id,jdbcType=INTEGER} </update> <!-- Unique constraint check --> <select id="isUniqueUsername" parameterType="map" resultType="boolean"> SELECT (count(*) = 0) FROM user WHERE ((#{userId,jdbcType=BIGINT} IS NOT NULL AND id != #{userId,jdbcType=BIGINT}) OR #{userId,jdbcType=BIGINT} IS NULL) <!-- other than me --> AND (username = #{username,jdbcType=VARCHAR}) </select> </mapper>
五、通过Mybatis获取的数据库的会话session
// 1通过配置文件获取数据库连接信息 InputStream inputStream = Resources.getResourceAsStream("Configuration.xml"); //创建SessionFactoryBuilder SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); //通过SessionFactoryBuilder获得SessionFactory SqlSessionFactory sqlSessionFactory = builder.build(inputStream); //通过SessionFactory获得session SqlSession sqlSession = sqlSessionFactory.openSession();
六、通过session,对数据库操作(编写dao类)
SqlSession sqlSession = sessionFactory.openSession();//获得session List list = sqlSession.selectList("Namespace.sqlId", paramObj);//查询列表集合 Object obj = sqlSession.selectOne("Namespace.sqlId", paramObj);//查询一条记录 sqlSession.insert("Namespace.sqlId", paramObj);//插入记录 sqlSession.update("Namespace.sqlId", paramObj);//修改记录 sqlSession.delete("Namespace.sqlId", paramObj);//删除记录 sqlSession.commit();//默认事物是不提交的,需要手动自动提交
七、编写测试
@Test public void shouldInsertNestedPasswordFieldOfComplexType() throws Exception { SqlSession sqlSession = sqlSessionFactory.openSession(); try { //Create User User user = new User(); user.setId(500000L); user.setPassword(new EncryptedString("secret")); user.setUsername("johnny" + Calendar.getInstance().getTimeInMillis());//random user.setAdministrator(true); sqlSession.insert("User.insert", user); //Retrieve User user = (User) sqlSession.selectOne("User.find", user.getId()); assertNotNull(user.getId()); sqlSession.rollback(); } finally { sqlSession.close(); } }
到此基本流程完毕!接下来重点说明配置文件User.xml等
配置文件xml详细解释:
整个框架的核心就是实体映射配置文件xxx.xml(User.xml)文件中。通过配置该文件,实现数据库中的数据和JavaBean的交互(读写)。每一个和数据库交互的语句都被放在一个select、insert、update、delete标签内。每个这样的标签有一个唯一标识,java代码就是通过该唯一标识去执行特定的语句,比如上面的sqlSession.selectList("Namespace.sqlId",parameObj)中的“NameSapce.sqlId”就是一条sql语句的唯一标识。标签内的语句可以接受java代码传递的参数,比如上面parameObj就是传递和接收的参数,该参数可以是具体的java基本类型和String类型,也可以是复杂的对象类型或者集合类型,如果是基本类型或者String类型那么在配置文件中通过#{_parameter}获取,如果是集合类型那么在配置文件中通过#{list}获取,如果是复杂对象类型那么在配置文件中通过#{obj的attribute}直接获取。然后根据条件以及接收的参数动态拼装sql,动态拼装sql的时候,会使用的ognl表达式一个各种条件标签如<if><foreach><where><set><trim>等标签。通过上面一系列的操作,最终会得到一个sql语句,Mybatis执行该sql语句以后如果有返回结果,返回结果是基本类型就直接用returnType限定,如果是复杂类型或者集合类型,就通过returnMap转换,然后将转化的结果返回给java代码中的调运结果。整个流程简单总结就是:参数映射->sql解析->sql执行->结果映射,对于数据写入和读取都是同样流程。
配置文件xml标签总结:
标签类型 |
标签 |
说明 |
定义sql语句 |
select |
查询语句 |
|
insert |
插入语句 |
|
update |
更新语句 |
|
delete |
删除语句 |
结果映射 |
resultMap |
结果集合和javaBean映射配置 |
|
collection |
一对多中多方集合映射 |
|
association |
多对一中一放对象映射 |
动态sql拼接 |
if |
条件标签 |
|
choose/when/otherwise |
条件选择标签 |
|
foreach |
循环迭代标签 |
格式化输出 |
where |
查询时候快捷拼接条件 |
|
set |
更新时候快捷拼接值 |
|
trim |
指定前缀后缀等,可达到where/set效果 |
常量定义使用 |
sql |
定义一段常量 |
常量引用使用
|
include |
引用一段常量 |
resultMap |
结果集合映射到JavaBean中,返回的结果是JavaBean |
resultType |
结果返回的是一个Java基础类型或者String类型,不需要映射 |
parameterMap |
请求参数的JavaBean映射,不推荐使用 |
parameterType |
定义请求参数的class类型,可以是JavaBean类型,也可以是基础java类型或者String |
#{}/${} |
#{}表示的是问好(?)占位符,更常用。${}表示的是直接用参数代替,不会加引号,一般在排序的时候可能会用到。 |
#{}/ognl内容取值 |
简单类型参数用#{_parameter},集合类型用#{list},JavaBean类型直接用#{attribute} |
到此,Mybatis已经基本能完成日常使用,但是一个优秀的ORM框架怎么可能只有这么点东西?
相关推荐
《SpringMVC与MyBatis整合初探》 在当今的Java Web开发领域,SpringMVC和MyBatis是两大主流框架,它们分别负责控制层和数据访问层的处理。SpringMVC作为Spring框架的一部分,提供了强大的MVC设计模式实现,而...
在IT行业中,Spring和MyBatis是两个非常重要的框架,它们在Java开发中扮演着核心角色。Spring是一个全面的开源应用框架,而MyBatis则是一个优秀的持久层框架。本篇文章将深入探讨这两个框架的基本概念、工作原理以及...
关于mybatis的spring boot可执行代码,对应的解说博客地址在:https://blog.csdn.net/heidashou/article/details/105812796,含有全过程截图和解说。
code1教程MyBatis学习(一)之初探MyBatis大体结构与简单实现:" 这段描述表明该项目是一个逐步学习的过程,首先从基础开始,涵盖了MyBatis的基本结构和简单实现。MyBatis的架构主要包括三大部分:...
在本书的在阅读MyBatis源码的过程中,本书使用了运行初探,模块归类,合理猜测,类比阅读,网格阅读等多种原始码阅读方法,逐步这些原始码阅读方法进行了进一步的总结整理。 本书适合架构师,程序员提升自己的源码...
【初探微服务与Spring Boot】 微服务架构是一种软件开发方法,它将应用程序设计为一组小型、独立的服务,每个服务都专注于一个特定的业务功能,且可以独立部署、扩展和维护。这种架构模式有助于提高软件的可伸缩性...
而Spring Data则为与各种数据库交互提供了统一的接口,如JPA和MyBatis。 对于并发编程,Java提供了丰富的线程API,包括Thread类和Runnable接口,以及ExecutorService和Future等高级并发工具。通过合理使用这些工具...
很抱歉,根据您提供的信息,"pring初探共18页.pdf.zip" 和 "pring初探共18页.pdf." 看起来像是一个关于Spring框架的教程文档,但是具体的文件列表只提到了 "赚钱项目",这与Spring框架的学习内容不直接相关。...
这个资源集合可能包含了从基础到高级的Spring技术应用,特别强调了Spring Boot的初探。 描述中的“采用 Spring Boot + MyBatis”表明该项目采用了MyBatis作为持久层框架。MyBatis是一个优秀的SQL映射框架,它能够将...
开发初探部分详细介绍了微服务工程的新建过程,包括模块介绍、子工程的创建、版本依赖设置和工程配置等。开发者通过这些步骤可以构建自己的API,以及进行API的安全框架配置、鉴权、统一API响应结果处理等。这一章节...
在Java中,我们经常使用Mybatis、Hibernate等ORM框架来实现数据访问层。然而,在C#中,我们可以使用反射机制来实现简单的ORM框架。 什么是反射?反射是指程序可以访问、检测和修改它本身状态或行为的一种能力,并能...
第七篇:整合Mybatis] 第八篇:通用Mapper与分页插件的集成] 第九篇:整合Lettuce Redis] 第十篇:使用Spring Cache集成Redis] 第十一篇:集成Swagger在线调试] 第十二篇:初探RabbitMQ消息队列] 第十...
整合Mybatis 通用Mapper与分页插件的集成 整合Lettuce Redis 使用Spring Cache集成Redis 集成Swagger在线调试 初探RabbitMQ消息队列 RabbitMQ延迟队列 actuator 服务监控与管理 actuator与spring-boot-admin 定时...
JEECG框架初探** **2.1 演示系统** JEECG提供在线演示系统,让开发者在实际环境中体验平台的各项功能,包括表单生成、报表设计、权限管理等,以便快速理解和学习平台的使用。 **2.2 示例代码** 平台上提供丰富...
《基于jpcap的网络数据包捕获与分析系统初探》 在信息技术领域,网络数据包捕获是一项至关重要的任务,它可以帮助我们洞察网络流量,进行故障排查、安全审计和性能优化。本文将深入探讨如何利用Java平台的jpcap库来...
开发流程方面,介绍了SpringMVC、Swagger、Mybatis、Mybatis-Plus等后端开发常用框架和工具的集成和使用方法。其中,新建微服务、API的创建与鉴权、Redis缓存的集成、CRUD操作的实现等都是开发初探阶段需要掌握的...
SpringBlade是由一个商业级项目优化升级而来的Spring Cloud微服务架构,其后端使用Spring Boot 2、Spring Cloud Greenwich、Mybatis等技术栈。BladeX致力于创造一种新的开发模式,并对开发中遇到的问题和生产中的...
1. **Spring初探** 在这一章中,我们将从Spring框架的基础出发,介绍其诞生背景和主要目标。我们会讲解Spring如何简化Java应用的开发,以及它提供的依赖注入(Dependency Injection, DI)机制,这是Spring的核心...