开发三层架构,ORM, MyBatis入门
什么是框架?
简单来说,框架就是别的程序员完成了对某些功能的封装并生成了结果性的文件,也就是一堆的jar包,里面有些许多的类,我们可以通过下载这些jar包,来使用这个框架,以完成某些功能。
什么是三层架构?
在说什么是MyBatis之前,先简单的了解一下什么是三层架构。
三层架构是所有后端开发分层的一种思想,是把整个业务应用分为三层,分别是:表示层、业务逻辑层、 数据持久化层。
顾名思义:
- 表示层:直接与客户进行互动,提供了与用户交互的界面。
- 业务逻辑层:主要体现了业务对数据的相关要求与处理,处于表示层和数据持久化层之间,可以处理用户提交的数据提交给下一层,并且处理数据持久化层返回的数据响应给上一层。
- 数据持久化层:通过接收上一层传递的数据对数据进行持久化操作,也就是操作数据库。
什么是MyBatis?为什么要使用MyBatis?
MyBaits就是一个数据持久化层的一个框架,也就是说,MyBatis完成了对数据库一系列操作的封装,我们可以通过这个框架很方便的操作数据库。
JDBC同样也可以完成对数据,那我们为什么要使用这个框架?
首先我们看一段JDBC的代码:
import java.sql.*;
import pojo.Student;
public class JDBCTest {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/xxxx";
String username = "root";
String password = "111111";
conn = DriverManager.getConnection(url, username, password);
String sql = "select name, age, height, weight from t_student where province=?";
String province="ShanXiSheng";
ps = conn.prepareStatement(sql);
ps.setString(1, province);
rs = ps.executeQuery();
while (rs.next()){
String name = rs.getString("name");
int age = rs.getInt("age");
double height = rs.getDouble("height");
double weight = rs.getDouble("weight");
Student student = new Student();
student.setName(name);
student.setHeight(height);
student.setAge(age);
student.setWeight(weight);
}
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
} catch (SQLException e) {
throw new RuntimeException(e);
}finally {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
if (ps != null) {
try {
ps.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
}
}
我们可以发现,里面的代码非常冗余,书写非常麻烦,而且对于处理事务也是非常麻烦。因此我们使用MyBatis框架,它可以很方便的将一个我们封装好的一个java对象转换为数据库中的一条记录,同样也可以将数据库中的一条记录映射为一个java对象。
什么是ORM?
ORM(Object Relation Mapping):
- Object:就是一个符合java规范的一个普通的java类。
- Relation:关系型数据库。
- Mapper:上面两者的映射
例如:我们有一个简单的学生类:
public class Student{
private int id;
private String name;
private int age;
.....
}
public class Test{
public static void main(String[] args){
// 实例化对象
User user1 = new User(1,"zs",20);
User user2 = new User(2,"ls",30);
}
}
同时我们有一个数据库表:学生表:
id | name | age |
---|---|---|
1 | zs | 20 |
2 | ls | 30 |
数据库中一张表对应java中一个类。
表中的一个字段对应类中的一个属性。
表的一条记录对应一个实例。
这个对应关系就是Mapping映射。
据上面所说,MyBatis可以实现这个映射,因此MyBatis就是一个ORM框架。
如何使用MyBatis?(这里使用Maven)
使用Maven需要在pom文件中加入MyBatis依赖。
<dependencies>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.13</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.mysql/mysql-connector-j -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.1.0</version>
</dependency>
<!--方便后面的测试,引入junit依赖-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
</dependencies>
加入这些依赖就可以使用MyBatis了,这里的数据库驱动自己根据情况指定。
接下里我们开发第一个简单的MyBatis程序。
介绍一个MyBatis的中文网,https://mybatis.net.cn/
第一个入门的程序
- 第一步:引入依赖。上面已经介绍了。
- 第二步:编写mybatis核心配置文件:mybatis-config.xml
- 第一:这个文件名不是必须mybatis-config
- 第二:位置也是随意的,一般都放在资源根目录下(也就是resources目录)
<?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>
<properties resource="">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/xxx"/>
<property name="username" value="root"/>
<property name="password" value="111111"/>
</properties>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<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="xxx.xml"/>
</mappers>
</configuration>
- 第四步:编写XxxxMapper.xml文件。
- 在这个配置文件当中编写sql语句。
- 同样,文件名不固定,位置不固定。
- 一般放到类的资源根目录下。
<?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="afasdfs">
<!-- id是这个sql语句的唯一标识,这个id就代表了这条sql语句-->
<insert id="insertXxx">
insert into t_student(id, name, age)
values(null, 'zs', 20)
</insert>
</mapper>
-
第五步:在mybatis-config.xml文件中指定XxxxMapper.xml文件的路径:
- resource属性会自动从类的资源根路径下查找资源。 -
第六步:编写mybatis程序。(使用mybatis类库,编写程序,连接数据库,做增删改查就行了。)
我们需要知道在mybatis当中,负责执行sql语句的对象叫做:SqlSessionSqlSession是Java程序和数据库之间的一次会话。 要想获取SqlSession对象,需要先获取SqlSessionFactory对象,通过SqlSessionFactory工厂来生产SqlSession对象。 怎么获取SqlSessionFactory对象呢? 需要先获取SqlSessionFactoryBuilder对象。 通过SqlSessionFactoryBuilder的build方法,来获取SqlSessionFactory对象。 mybatis的核心对象包括: SqlSessionFactoryBuilder SqlSessionFactory SqlSession
测试方法如下:(需要Maven的测试类, 并引入junit依赖)
@Test
public void testInsertCarByUtil(){
SqlSession sqlSession = SqlSessionUtil.openSession();
// 参数需要填写在mapper文件中insert语句的id
int count = sqlSession.insert("xxx");
// 注意需要自己手动提交
sqlSession.commit();
sqlSession.close();
}