Mybatis简介
Mybatis,Apache公司的一个开源项目ibatis,2010年项目迁到Google code改名mybatis,2013年迁到github。
Mybatis是一个优秀的持久层框架,它可以在实体类和sql语句间建立映射,是一种半自动化的ORM(Object Relational Mapping,对象关系映射)
Mybatis与JDBC
平时用JDBC访问数据库,除了写sql语句外,还必须操作Connection、Statement、ResultSet等辅助类,在访问不同的表时还需写许多雷同的代码,步骤繁琐且枯燥;
在大型企业项目中,程序和数据库交互次数多、数据读写量大,用传统的jdbc操作数据库无法满足性能需求,同时,jdbc的使用也会带来代码冗余、复用性低等问题;
jdbc劣势:
1.频繁的创建、释放数据库连接造成系统资源浪费,从而影响系统性能。
2.slq语句硬编码、PreparedStatement向占位符传参硬编码、ResultSet解析硬编码;
而在实际开发中,sql语句变动可能性大,用jdbc操作数据库的话,当sql变动要改变java代码,查询条件where改变需要改动PreparedStatement,结果集改变则需要改动ResultSet。sql的变动需要修改大量的java代码,这样一来,不仅违反了开闭原则,而且代码会非常难以维护。
Mybatis优势
mybatis对jdbc操作数据库的过程做了一定程度的封装,用了batis之后,我们只需提供sql语句,而不需要花费大量精力去处理注册驱动Driver、创建Connection对象、创建Statemen/PreparedStatement对象、手动设置参数、结果集检索、异常处理等JDBC繁杂的过程代码。
Mybatis的环境搭建
DB环境: mysql 8.0.27 Community Server
工具: maven
IDE: idea 2021.2.3
辅助网址:maven中央仓库:https://mvnrepository.com/
Mybatis入门程序
运行结果:
用mybatis框架访问数据库,打印sql语句执行返回的结果
项目目录:
说明:
基于框架运行的程序,对于jar版本、配置文件的正确性要求非常严苛,任何地方出错都会导致编译错误,但完成配置后的框架,能极大地提高开发速度
1.创建数据库和数据准备
1.win+r—输入"cmd"回车—输入"mysql -uroot -p"回车—输入密码—出现版本信息(若无版本信息则先安装配置mysql环境)
2.create datebase firstbatis;回车
mysql> create database firstmybatis;
Query OK, 1 row affected (0.01 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| firstmybatis | |
+--------------------+
10 rows in set (0.00 sec)
数据准备(idea中集成了mysql的图形控制,可随后在idea中完成这一步)
mysql> use firstmybatis
Database changed
mysql> create table user(
-> id int primary key auto_increment,
-> name varchar(16),
-> age int
-> );
Query OK, 0 rows affected (0.03 sec)
mysql> insert into user(id,name,age) values(null,'Cozar',22),(null,'Celine',20);
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
2.创建工程
打开idea,file-new-project/Maven,输入
name,点击下拉按钮Artifact Coordinates,输入GroupId(通常为公司或个人倒置的网络域名,如com.Apache或person.cozar,创建完成后groupID信息也可在pom.xml中修改),ArtifactId与项目同名,Version默认即可
3.引入相关依赖
pom.xml文件中引入依赖,联网状态下,maven会根据依赖自动导入jar包
使用maven首先你大概要知道在项目中需要用到哪些jar包,然后访问maven中央仓库官网 :https://mvnrepository.com/,直接搜索寻找相应jar包的依赖,将需要的jar版本依赖信息复制到pom.xml即可。
前面说过框架对jar版本和配置文件的正确性敏感,所以要注意某些jar的版本跟程序环境是否匹配,比如mysql和mysql-connector-java.jar版本是否匹配。这里我们导入了mybatis、mysql-connector-java 以及测试用的junit。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>person.cozar</groupId>
<artifactId>firstMybatis</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.27</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<scope>test</scope>
</dependency>
</dependencies>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
</project>
4.创建数据库连接信息文件(db.properties)
在src/main/resource目录下创建db.properties文件
mysql.driver=com.mysql.cj.jdbc.Driver
mysql.url=jdbc:mysql://localhost:3306/firstmybatis?serverTimezone=UTC&\
characterEncoding=utf8&useUnicode=ture&useSSL=false
mysql.username=root
mysql.password=123456
5.创建mybatis的核心配置文件(mybatis-config.xml)
在src/main/resource目录下创建mybatis-config.xml文件(核心配置文件可随意命名,但不建议)
核心配置文件主要完成两大块内容:数据库连接环境的配置和映射文件的加载
<?xml version="1.0" encoding="UTF-8" ?><!--xml文件声明-->
<!--核心配置文件mybatis-config.xml的约束条件,格式固定-->
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 加载数据库连接信息配置文件-->
<properties resource="db.properties" />
<!-- 环境搭建-->
<environments default="development">
<environment id="development">
<!-- transactionManager(事务管理器),类型JDBC-->
<transactionManager type="JDBC" />
<!-- 数据源,类型连接池-->
<dataSource type="POOLED">
<!-- 配置数据库连接参数-->
<property name="driver" value="${mysql.driver}"/>
<property name="url" value="${mysql.url}"/>
<property name="username" value="${mysql.username}"/>
<property name="password" value="${mysql.password}"/>
</dataSource>
</environment>
</environments>
<!-- 加载映射文件,每个映射文件对应一个POJO实体类和一张表-->
<mappers>
</mappers>
</configuration>
6.创建POJO实体
在src/main/java中创建person.cozar.pojo(你的groupId.pojo,groupId)包,在pojo包中创建对应数据库中表的实体类
package person.cozar.pojo;
public class User {
private int id;
private String name;
private int age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}
7.创建mapper文件
在src/main/resources目录下创建mapper包,在mapper包中创建实体类映射文件UserMapper.xml
mapper文件完成了sql方法的封装(定义了方法名,参数类型,返回类型;sql语句),mybatis会根据mapper文件中定义的方法操作数据库,并自动完成java和数据库中数据类型的同步映射,而无需像使用jdbc那样,用大量的代码来进行java和数据库之间的参数匹配。这样一来,mybatis不但简化了jdbc的使用,也使得sql语句和java代码分离,当sql语句变动时我们仅需在mapper文件中对sql语句做简单维护即可,而不需要改动大量的java代码
(mapper文件和pojo类可以有多个:数据库中每个表都可以有对应的pojo类和mapper文件)
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--mapper为映射的根节点,namespace指定Dao接口的完整类名,mybatis会依据这个接口动态创建一个实现类去实现这个接口,而这个实现类是一个Mapper对象-->
<mapper namespace="person.cozar.pojo.User">
<!-- id:接口中的方法名(在多个select中区分方法,java代码通过id属性值找到对应的sql语句块),parameterType:传入的参数类型,resultType:返回实体类对象,使用包的全限定类名-->
<select id="findById" parameterType="int" resultType="person.cozar.pojo.User">
select * from firstmybatis.user where id = #{id}
</select>
<select id="findByName" parameterType="String" resultType="person.cozar.pojo.User">
select * from firstmybatis.user where name =#{name}
</select>
<!-- mapper标签中可包含用于CURD的insert、delete、update和select标签-->
</mapper>
8.将mapper加载到mybatis核心配置文件
将代码<mapper resource="mapper/UserMapper.xml"/>加入到核心配置文件mybatis-config.xml的mappers标签中
<?xml version="1.0" encoding="UTF-8" ?><!--xml文件声明-->
<!--核心配置文件mybatis-config.xml的约束条件,格式固定-->
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 加载数据库连接信息配置文件-->
<properties resource="db.properties" />
<!-- 环境搭建-->
<environments default="development">
<environment id="development">
<!-- transactionManager(事务管理器),类型JDBC-->
<transactionManager type="JDBC" />
<!-- 数据源,类型连接池-->
<dataSource type="POOLED">
<!-- 配置数据库连接参数-->
<property name="driver" value="${mysql.driver}"/>
<property name="url" value="${mysql.url}"/>
<property name="username" value="${mysql.username}"/>
<property name="password" value="${mysql.password}"/>
</dataSource>
</environment>
</environments>
<!-- 加载映射文件,每个映射文件对应一个POJO实体类和一张表-->
<mappers>
<mapper resource="mapper/UserMapper.xml"/>
</mappers>
</configuration>
9.编写junit测试类
在src/test/java目录下创建类UserTest
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import person.cozar.pojo.User;
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
public class UserTest {
@Test
public void userFindById() throws IOException {
String resource = "mybatis-config.xml";
//创建流
Reader reader = null;
reader = Resources.getResourceAsReader("mybatis-config.xml");//将mybatis-config。xml读取到reader对象中
SqlSessionFactory sqlMapper = new SqlSessionFactoryBuilder().build(reader);//由SqlSession工厂构造器创建SqlSession工厂
SqlSession session = sqlMapper.openSession();//由SqlSession工厂对象创建SqlSession会话对象,该对象中包含所有mapper中封装的执行sql语句的所有方法
//由session对象中封装的方法selectOne执行mapper封装的sql语句,封装映射信息并返回结果映射
User user1 = session.selectOne("findById",1);
User user2 = session.selectOne("findByName","Celine");
System.out.println(user1);
System.out.println(user2);
session.close();
}
}
运行UserTest
Mybatis的运行步骤(参考UserTest)
1.mybatis读取核心配置文件mybatis-config.xml
2.加载映射文件mapper
3.构建Sql会话工厂
4.创建Sql会话对象
5.用Sql会话对象包含的selectOne()等方法,通过各个mapper文件中定义的sql方法来操作数据库,并将结果直接映射到java的数据类型
总结:
mybatis是一个优秀的持久层框架,它对jdbc进行了一定程度的封装,是一种半自动化(自定义sql语句)的ORM(对象关系映射,Object Relational Mapping)实现。
mybatis在实体类和sql语句之间建立了映射关系,完成了java对象属性和关系数据库表字段之间数据类型的匹配,能让我们像操作java对象那样的方式来操纵数据库,为我们省略了jdbc中许多繁杂的传参代码,也解决了传参硬编码的问题。
通过mapper文件,mybatis完成了sql语句和java代码的分离,解决了sql语句硬编码的问题,当sql语句需要变动时,使得程序更易于维护,也加强了程序的灵活性。