MyBatis框架学习(Maven构建)
假期的时候学学框架,总结一下
目录
什么是框架
什么是框架?网上大部分的人都是这样描述框架的
框架是一个半成品,已经对基础的代码进行了封装并且提供对应的API。开发者只需要调用API从而去书写自己的代码即可
可以这样理解,框架是一个框子和一个架子,框架具有两大特定
- 约束性(因为是框子)
- 支撑性(因为是架子)
请注意,框架和库不是同一个东西。库的英文名称为Library,缩写Lib,而框架的英文是Framework。库是将代码集合成的一个产品,供程序员调用。而框架则是为解决一个(一类)问题而开发的产品。
mybatis框架是什么
MyBatis框架是Apache的一个开源项目,是基于 Java 的持续层框架。它支持定制化 SQL、存储过程及高级映射。MyBatis避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解来配置和映射原生信息。也就是对 JDBC 的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等JDBC繁杂的过程代码。
back
为什么使用mybatis框架
JDBC连接
当你使用传统的JDBC进行连接的时候,你可能是需要进行以下的流程
// 1 加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");
// 2 获取连接
Connection connection=DriverManager.getConnection("jdbc:mysql://localhost:3306/library?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true","root","root");
// 3 创建PreparedStatement对象,预编译sql
PreparedStatement prep=connection.prepareStatement("select * from user");
// 4 执行sql语句,获取结果集
ResultSet rs=prep.executeQuery();
// 5 处理结果集
while(rs.next()){
String name=rs.getString("user_name");
String id=rs.getString("user_id");
String sex=rs.getString("user_sex");
System.out.println(id+" "+name+" "+sex);
}
// 6 关闭连接,释放资源
rs.close();
prep.close();
connection.close();
就这样,巴拉巴拉,你的一堆时间就没了。如果你有多个想要查询的语句,那么你就要经过好几个这样的过程。
上面的过程相当复杂,主要有一些的问题
- sql是在程序中写死的,一旦sql语句需要修改,那么就需要重新编译。
- sql语句在代码中硬编译。
- 数据库频繁连接频繁释放。
- 如果你的PrepareStatement需要设置,那么就会存在预设的问题。
- 返回的ResultSet对象需要进行手动处理,比较麻烦。
mybatis连接
看过了JDBC的连接之后,你会发现JDBC其实是非常的复杂的。如果使用了mybatis框架,会有什么好处呢?
好处:
- 使得sql与代码分离,存放在xml配置文件中,这样降低了sql与程序代码的耦合。
- 使用关系类进行映射,可以使得获取到的结果按照一个类来进行处理。
- 加入了一个连接池,可以提高程序的效率。
- mybatis是将SQL配置在mapper文件中,修改sql只是修改配置文件,类不需要重新编译。
back
mybatis基本连接、映射操作
如果使用了mybatis,大概会经理以下的过程
备注:此项目利用maven构建,使用的编译器是IDEA Communicity 2020.3.1版本,jdk14,windows10
创建一个新项目,创建好项目之后,大体的项目路径是这样的
接下来编辑pom.xml
文件,添加以下内容
<?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>org.example</groupId>
<artifactId>MybatisDemo</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>14</maven.compiler.source>
<maven.compiler.target>14</maven.compiler.target>
</properties>
<dependencies>
<!--下面是新添加的内容-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.4</version>
</dependency>
<!--mysql连接-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.19</version>
</dependency>
<!--进行日志记录-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
<!--进行单元测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.2</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
然后这样,就引进了mybatis框架以及jdbc。
编写持久层接口如下
package com.mybatisdemo.dao;
import com.mybatisdemo.dbclass.User;
import java.util.List;
public interface UserDao {
/**
* 查询所有user
* @return 返回user的集合
*/
List<User> findAllUser();
}
编写实体类如下
package com.mybatisdemo.dbclass;
import java.io.Serializable;
public class User implements Serializable {
private Integer id;
private String name;
private String password;
private String sex;
private String tel;
private String address;
private Integer power;
public Integer getId() {
return id;
}
public Integer getPower() {
return power;
}
public String getAddress() {
return address;
}
public String getName() {
return name;
}
public String getPassword() {
return password;
}
public String getSex() {
return sex;
}
public String getTel() {
return tel;
}
public void setAddress(String address) {
this.address = address;
}
public void setId(Integer id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setPassword(String password) {
this.password = password;
}
public void setPower(Integer power) {
this.power = power;
}
public void setSex(String sex) {
this.sex = sex;
}
public void setTel(String tel) {
this.tel = tel;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", password='" + password + '\'' +
", sex='" + sex + '\'' +
", tel='" + tel + '\'' +
", address='" + address + '\'' +
", power=" + power +
'}';
}
}
创建对应的映射文件如下
<?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="com.mybatisdemo.dao.UserDao">
<!--配置查询所有 方法名称-->
<select id="findAllUser" resultType="com.mybatisdemo.dbclass.User">
select * from user;
</select>
</mapper>
编写MySQL的配置文件如下
<?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">
<!--mybatis的主配置文件-->
<configuration>
<!--配置环境-->
<environments default="mysql">
<!--配置mysql环境-->
<environment id="mysql">
<!--事务类型-->
<transactionManager type="JDBC"/>
<!--配置数据源(连接池)-->
<dataSource type="POOLED">
<!--连接基本信息-->
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/library?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true"/>
<!--?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true-->
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="dao/UserMapper.xml"/>
</mappers>
</configuration>
编写测试方法类如下
package com.mybatisdemo.util;
import com.mybatisdemo.dao.UserDao;
import com.mybatisdemo.dbclass.User;
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 java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class MybatisUtils {
static String resource= "mybatis-config.xml";
public static void main(String[] args) throws IOException {
InputStream inputStream= Resources.getResourceAsStream(resource);
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession=factory.openSession();
UserDao userDao=sqlSession.getMapper(UserDao.class);
List<User> userList=userDao.findAllUser();
for(User u:userList){
System.out.println(u);
}
inputStream.close();
}
}
整体的项目结构如下图
总结
使用映射
<resultMap id="随便取名称" type="这是个什么类型的变量">
<id column="表名称" property="java代码的属性名称"/> <!--主键-->
<result column="表名称" property="java代码的属性名称"/> <!--其他属性-->
</resultMap>
mybatis框架比普通的jdbc更有优势,建议使用mybatis框架。
mybatis提供了丰富的映射器元素,可以实现非常多的功能
元素名称 | 描述 |
---|---|
select | 映射查询语句 |
insert | 映射插入语句 |
update | 映射更新语句 |
delete | 映射删除语句 |
sql | 可以被其他语句引用的可重用语句块 |
resultMap | 用来描述如何从数据库结果集中来加载对象 |
cache | 给定命名空间的缓存配置 |
cache-ref | 其他命名空间缓存配置的引用 |
back
参考
- 知乎(什么是框架)
- 简书(mybatis框架)
- Web轻量级框架Spring+Spring MVC+MyBatis整合开发实战(第二版)
- MyBatis官网
- 简书(Mybatis架构与原理)