一.什么是 MyBatis?
MyBatis 是一款优秀的持久层框架,原名叫ibatis,后来迁移到GitHub后改名为Mybatis。它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
1.框架是什么?
框架就是一个软件,完成了部分功能。框架是一种规则,保证开发者遵循相同的方式开发程序。框架提倡“不要重复造轮子”,对基础功能进行封装。框架是可以升级和改造的,框架是安全的。但是框架只对某一个方面有用,不是全能的。
框架的优点:
极大地提高了开发效率
统一的编码规则,利于团队管理
灵活的配置,拥有更好的维护性
Mybatis是持久层框架,使用XML将SQL与程序解耦,便于维护。底层基于JDBC。
2.MyBatis的开发流程
引入MyBatis的Maven依赖
创建核心配置文件
创建实体(entity)类
创建Mapper映射文件
初始化sqlSessionFactory
利用Sqlsession对象操作数据
3.JDBC的优缺点
优点
直观,好理解
缺点
创建很多的对象(比如:Connection,Preparedstatement,ResultSet等)。
注册驱动非常麻烦。
SQL语句和业务逻辑代码混在了一起,不好管理。
二.MyBatis的基础知识
后面的学习是通过案例实践来总结知识点的,这些案例要用到的资源有数据库的建库脚本,我把它上传上了我CSDN的资源文件了。链接: 数据建库脚本,我用的是MySQL数据库,关于脚本怎么使用,点开idea专业版右侧的database添加MySQL数据库后,右键选择run script后选择此文件来创建数据库。如果你不会使用,评论区或者私信联系我,我24小时在线答疑。
1.引入MyBatis的Maven依赖
使用 Maven 来构建项目,则需将下面的依赖代码配置于 pom.xml 文件中,还要导入jdbc驱动和其他的依赖,这里不列举:
<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>x.x.x</version> </dependency>
2.创建并编写核心配置文件
XML 配置文件中包含了对 MyBatis 系统的核心设置,包括获取数据库连接实例(DataSource)以及决定事务作用域和控制方式的事务管理器(TransactionManager)等。MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。
配置文件的详细讲解
在项目的Resource文件夹下,创建一个mybatis-config.xml的核心配置文件。配置文件的名字其实也可以去其他的名字。
下面就是这个配置文档的代码的一个案例,通过后面的学习,会有更多其他配置项的详细讲解。
<?xml version="1.0" encoding="UTF-8" ?> <!--这是xml的约束,根标签为configuration--> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <!--驼峰命名转换--> <settings> <setting name="mapUnderscoreToCamelCase" value="true"/> </settings> <!--environments里面可以创建很多environment的环境,default指定默认的环境配置(id)--> <environments default="dev"> <!--environment环境配置,不同的环境用不 同的id--> <environment id="dev"> <!--采用jdbc的方式对数据库的事务进行commit/rollback--> <transactionManager type="JDBC"/> <!--采用连接池的方式管理数据库连接--> <dataSource type="POOLED"> <property name="driver" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/babytun"/> <property name="username" value="root"/> <property name="password" value="zc20020106"/> </dataSource> </environment> </environments> <mappers> <mapper resource="mappers/goods.xml"/> </mappers> </configuration>
这里我们就创建好了一个最基本的mybatis配置文件了,当然,还有很多可以在 XML 文件中配置的选项,上面的示例仅罗列了最关键的部分。下面我来对里面的配置项依次解释:
首先,就是每个XML文件都有的声明:
<?xml version="1.0" encoding="UTF-8" ?>
然后定义了该配置文件的约束条件,约束了根标签为configuration和其他的一些配置项约束:
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
环境配置(environments)
MyBatis 可以配置多种环境,这种机制有助于将 SQL 映射应用于多种数据库之中, 现实情况下有多种理由需要这么做。例如,开发、测试和生产环境需要有不同的配置;或者想在具有相同 Schema 的多个生产数据库中使用相同的 SQL 映射。还有许多类似的使用场景。
不过要记住:尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境。如果忽略了环境参数,那么将会加载默认环境
所以,如果你想连接两个数据库,就需要创建两个 SqlSessionFactory 实例,每个数据库对应一个。而如果是三个数据库,就需要三个实例,依此类推.
默认使用的环境 ID(比如:default=“dev”)。
每个 environment 元素定义的环境 ID(比如:id=“dev”)。
事务管理器的配置(比如:type=“JDBC”)。
数据源的配置(比如:type=“POOLED”)。
默认环境和环境 ID 顾名思义。 环境可以随意命名,但务必保证默认的环境 ID 要匹配其中一个环境 ID。
事务管理器(transactionManager)
在 MyBatis 中有两种类型的事务管理器(也就是 type="[JDBC|MANAGED]")
JDBC – 这个配置直接使用了 JDBC 的提交和回滚设施,它依赖从数据源获得的连接来管理事务作用域。
MANAGED – 这个配置几乎没做什么。它从不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 J2EE 应用服务器的上下文)。 默认情况下它会关闭连接。然而一些容器并不希望连接被关闭,因此需要将 closeConnection 属性设置为 false 来阻止默认的关闭行为。
<transactionManager type="MANAGED"> <property name="closeConnection" value="false"/> </transactionManager>
[提示]:如果你正在使用 Spring + MyBatis,则没有必要配置事务管理器,因为 Spring 模块会使用自带的管理器来覆盖前面的配置。
数据源(dataSource)
有三种内建的数据源类型(也就是 type="[UNPOOLED|POOLED|JNDI]"):
UNPOOLED:这个数据源的实现会每次请求时打开和关闭连接。虽然有点慢,但对那些数据库连接可用性要求不高的简单应用程序来说,是一个很好的选择。
UNPOOLED 类型的数据源仅仅需要配置以下 5 种property属性:
POOLED: 这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来,避免了创建新的连接实例时所必需的初始化和认证时间。 这种处理方式很流行,能使并发 Web 应用快速响应请求。
除了上述提到 UNPOOLED 下的属性外,还有更多属性用来配置 POOLED 的数据源。可以根据自己以后的需求来进行配置:
对于配置文件的mappers标签,我们后面再解释。
3.创建实体类
上一步,创建并编写好了配置文件。现在要创建数据表所对应的实体类。我们在Java目录下建一个org.haiexijun.entity的一个包,用来放置所有与数据表对应的实体类。这里就以数据库中的t_goods这张表为例,创建一个实体类。我们给这个实体类取名为Goods.然后按照JavaBean的相关的规范来创建字段和get、set方法。
package org.haiexijun.entity; public class Goods { private Integer goodId;//商品编码 private String title;//标题 private String subTitle;//子标题 private Float originalCost;//原始的价格 private Float currentPrice;//当前的价格 private Float discount;//折扣率 private Integer isFreeDelivery;//是否包邮。1包邮,0不包邮 private Integer categoryId;//分类编号 public Integer getGoodId() { return goodId; } public void setGoodId(Integer goodId) { this.goodId = goodId; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getSubTitle() { return subTitle; } public void setSubTitle(String subTitle) { this.subTitle = subTitle; } public Float getOriginalCost() { return originalCost; } public void setOriginalCost(Float originalCost) { this.originalCost = originalCost; } public Float getCurrentPrice() { return currentPrice; } public void setCurrentPrice(Float currentPrice) { this.currentPrice = currentPrice; } public Float getDiscount() { return discount; } public void setDiscount(Float discount) { this.discount = discount; } public Integer getIsFreeDelivery() { return isFreeDelivery; } public void setIsFreeDelivery(Integer isFreeDelivery) { this.isFreeDelivery = isFreeDelivery; } public Integer getCategoryId() { return categoryId; } public void setCategoryId(Integer categoryId) { this.categoryId = categoryId; } }
4.创建Mapper XML映射器
MyBatis 的真正强大在于它的语句映射,这是它的魔力所在。由于它的异常强大,映射器的 XML 文件就显得相对简单。如果拿它跟具有相同功能的 JDBC 代码进行对比,你会立即发现省掉了将近 95% 的代码。MyBatis 致力于减少使用成本,让用户能更专注于 SQL 代码。我们的SQL语句就是再在里面编写的。
在Resource包下创建mappers文件夹,在里面创建一个名为goods.xml的文件,然后对goods.xml进行如下的配置:
<?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="goods"> <!--select语句,id表示select语句的名称,resultType表示返回查询结果为entity对象的结果--> <select id="selectAll" resultType="org.haiexijun.entity.Goods"> select * from t_goods order by goods_id desc limit 10 </select> </mapper>
我们首先引入了xml约束,规定了mapper为根标签。mapper根标签有一个属性叫做namespace,值我取为goods。在mapper里面,可以定义select语句等其他语句,我们用<select>标签进行定义查询语句,每个select标签都有一个id值,用来标识各语句。在select标签中要定义resultType属性为实体类的全类名。表示查询结果返回为指定的那一个实体entity。配置完后要在核心配置文件里面引用到这个mapper。在mybatis-config.xml根节点下面添加一个mappers节点:
<mappers> <mapper resource="mappers/goods.xml"/> </mappers>
这个节点里面,可以设置我们在goods.xml中定义好的mapper。
SQL 映射文件只有很少的几个顶级元素(按照应被定义的顺序列出
Mybatis的数据查询
查询语句是 MyBatis 中最常用的元素之一——光能把数据存到数据库中价值并不大,还要能重新取出来才有用,多数应用也都是查询比修改要频繁。 MyBatis 的基本原则之一是:在每个插入、更新或删除操作之间,通常会执行多个查询操作。
Select 元素的属性: