【MyBatis】MyBatis学习笔记之一(框架的概念与MyBatis的基础用法)
文章目录
1、框架概述
(1)三层架构及作用
-
界面层(User Interface Layer,表示层/视图层):主要功能是接收用户的数据,显示请求的处理结果。使用web页面和用户交互。
-
业务逻辑层(Business Logic Layer):接受表示传递过来的数据,检查数据,计算业务逻辑,调用数据访问层获取数据。
-
数据访问层(Data Access Layer):与数据库打交道。主要实现对数据库的增删改查。将存储在数据库中的数据提交给业务层,同时将业务层处理的数据保存到数据库。(常用框架MyBatis)
-
三层处理请求交互如图:
(2)三层架构的特点
- 结构清晰、耦合度底,各层分工明确
- 可维护性高,可扩展性高
- 有利于标准化
- 开发人员可以只关注整个结构中的其中某一层的功能实现
- 有利于各层逻辑的复用
(3)框架的定义
- 框架是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法;另一种认为,框架是可被应用开发者定制的应用骨架、模板。
- 简单地说,框架其实是半成品软件,就是一组组件,供你使用完成你自己的系统。从另一个角度来说框架是一个舞台,你在舞台上做表演。在框架基础上加入你要完成的功能。
- 框架是安全的,可复用的,不断升级的软件。
(4)框架解决的问题
- 框架要解决的最重要的一个问题是技术整合,在 J2EE 的 框架中,有着各种各样的技术,不同的应 用,系统使用不同的技术解决问题。需要从 J2EE 中选择不同的技术,而技术自身的复杂性,有导致更 大的风险。企业在开发软件项目时,主要目的是解决业务问题。 即要求企业负责技术本身,又要求解 决业务问题。这是大多数企业不能完成的。框架把相关的技术融合在一起,企业开发可以集中在业务领域方面。
2、MyBatis框架
(1)MyBatis简介
- MyBatis 是一个简化和实现了Java数据库持久化层的开源框架,它抽象了当量的JDBC冗余代码,并提供了一个简单易用的API和数据库交互。
- MyBatis 的前身为 iBATIS。
- MyBatis 流行的主要原因在于它的简单性和易用性。
- MyBatis 通过抽象底层的JDBC代码,自动化SQL结果集产生Java对象、Java对象的数据持久化数据库中的过程使得SQL的使用变得容易。
- MyBatis官方手册
(2)MyBatis的优点
- 它消除了大量的JDBC冗余代码
- 它有地的学习曲线
- 它能够更好的与传统数据库协同工作
- 它可以接受 SQL 语句
- 它提供了与 Spring 和 Guice 框架的集成支持
- 它提供了与第三方缓存类库的集成支持
- 它引入了更好的性能
3、MyBatis应用实例
(1)运行环境
- JDK 1.8+
- MyBatis 最新版本
- MySQL 8.0+
- IDEA 2021.3
- Apache Maven构建工具
(2)目录结构与基础数据
-
MySQL数据库中:springdb数据库 => student表
-
表数据
-
表结构
-
-
目录结构
(3)案例代码与解析
-
StudentDao.java
package com.Etui.dao; import com.Etui.domain.Student; public interface StudentDao { // 查询一条语句 Student selectStudentById(Integer id); // 添加一条记录 int insertStudent(Student student); }
-
StudentDao.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="com.Etui.dao.StudentDao"> <!-- 查询一个学生: <select>: 表示查询操作,里面是select语句 id: 要执行的SQL语句的唯一标识,是一个自定义字符串。推荐使用doa接口中的方法名称。 resultType: 告诉 mybatis,执行SQL语句,把数据赋值给哪个类型的java对象。resultType的值使用的是java对象的全限定名。 --> <select id="selectStudentById" resultType="com.Etui.domain.Student"> select id,name,email,age from student where id = #{id} </select> <select id="insertStudent" resultType="com.Etui.domain.Student"> insert into student(id, name, email, age) values(#{id}, #{name}, #{email}, #{age}) </select> <select id="selectStudents" resultType="com.Etui.domain.Student"> select id, name, email, age from student where id >= #{id} </select> <!-- 1.约束文件 http://mybatis.org/dtd/mybatis-3-mapper.dtd 约束文件作用:定义和限制当前文件中可以使用的标签和属性,以及标签出现的顺序。 2.mapper是跟标签 namespace: 命名空间,必须有值,不能为空(唯一值)。推荐使用Dao接口的全限定名称。 作用:参与识别SQL语句的作用。 3.在mapper里面可以写<select> <update> <delete> <select>等标签。 <insert> 里面是 insert 语句,表示执行的insert操作 ………… --> </mapper>
-
mybatis.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="logImpl" value="STDOUT_LOGGING"/> </settings> <!-- 配置mybatis环境 --> <environments default="development"> <!-- id: 数据源的名称--> <environment id="development"> <!-- 配置事物类型:使用JDBC事务(使用Connection的提交和回滚) --> <transactionManager type="JDBC"/> <!-- 数据源dataSource:创建数据库Connection对象。type:POOLED使用数据库的连接池 --> <dataSource type="POOLED"> <property name="driver" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/springdb?userUnicode=true&characterEncoding=utf-8&serverTimezone=UTC"/> <property name="username" value="root"/> <property name="password" value="Hzz15385252813"/> </dataSource> </environment> </environments> <!-- 指定其他mapper文件的位置: 其他mapper文件目的是找到其他文件SQL语句 --> <mappers> <!-- 告诉mybatis要执行的SQL语句的位置 使用mapper的resource属性指定mapper文件的路径。这个路径是从target/classes路径开始的。 使用注意: resource="mapper文件的路径,使用 / 分割路径" 一个 mapper resource 指定一个mapper文件 --> <mapper resource="com/Etui/dao/StudentDao.xml"/> </mappers> </configuration>
-
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>com.Etui</groupId> <artifactId>ch01-first</artifactId> <version>1.0-SNAPSHOT</version> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> <!-- 依赖的列表 --> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.21</version> </dependency> <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.6</version> </dependency> </dependencies> <build> <!-- 资源插件 --> <resources> <resource> <directory>src/main/java</directory><!--所在的目录--> <includes><!--包括目录下的.properties,.xml 文件都会扫描到--> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> </resources> <!-- <plugins>--> <!-- <plugin>--> <!-- <artifactId>maven-compiler-plugin</artifactId>--> <!-- <version>3.1</version>--> <!-- <configuration>--> <!-- <source>1.8</source>--> <!-- <target>1.8</target>--> <!-- </configuration>--> <!-- </plugin>--> <!-- </plugins>--> </build> </project>
(4)测试代码(MyBatis的具体用法)
-
MyTest.java
package com.Etui; import com.Etui.domain.Student; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.*; import org.junit.Test; import javax.xml.transform.Result; import java.io.IOException; import java.io.InputStream; import java.sql.SQLOutput; import java.util.List; public class MyTest { // @Test public void testSelectStudentById() throws IOException { // 调用mybatis某个对象的方法,执行mapper文件中的SQL语句 // mybatis核心类:SqlSessionFactory // 1、主配置文件, 定义mybatis主配置文件的位置,从类路径开始的相对路径 String config = "mybatis.xml"; // 2、读取主配置文件,使用mybatis框架中的resource类 InputStream inputStream = Resources.getResourceAsStream(config); // 3、创建SQLSessionFactory对象,使用SQLSessionFactoryBuilder类 SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream); // 4、获取SQLSession对象 SqlSession session = factory.openSession(); // 5、指定要执行的SQL语句 String sqlId = "com.Etui.dao.StudentDao.selectStudentById"; // 6、通过SqlSession对象执行SQL语句 Student student = session.selectOne(sqlId, 1006); // 查询数据 System.out.println("查询结果:" + student); // 7、释放SqlSession对象 session.close(); } // @Test public void testInsertStudent() throws IOException { InputStream resource = Resources.getResourceAsStream("mybatis.xml"); SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(resource); SqlSession session = ssf.openSession(); // mybatis默认执行sql语句是 手工提交事务,在做增删改操作后,需要手动提交事务 Integer result = session.insert("com.Etui.dao.StudentDao.insertStudent", new Student(1002, "王五", "wu@163.com", 12)); // 手动提交事务 session.commit(); System.out.println(result == 1 ? "插入成功!" : "插入失败!"); session.close(); } // @Test public void testAutocommitInsertStudent() throws IOException { InputStream resource = Resources.getResourceAsStream("mybatis.xml"); SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(resource); // SqlSession session = ssf.openSession(); // 创建一个自动提交事务的SqlSession对象 SqlSession session = ssf.openSession(true); // mybatis默认执行sql语句是 手工提交事务,在 // 做增删改操作后,需要手动提交事务 Integer result = session.insert("com.Etui.dao.StudentDao.insertStudent", new Student(null, "神里绫华", "linghua@163.com", 18)); System.out.println(result == 1 ? "插入成功!" : "插入失败!"); session.close(); } @Test // 查询多条语句 public void testSelectStudents() throws IOException { // 调用mybatis某个对象的方法,执行mapper文件中的SQL语句 // mybatis核心类:SqlSessionFactory // 1、主配置文件, 定义mybatis主配置文件的位置,从类路径开始的相对路径 String config = "mybatis.xml"; // 2、读取主配置文件,使用mybatis框架中的resource类 InputStream inputStream = Resources.getResourceAsStream(config); // 3、创建SQLSessionFactory对象,使用SQLSessionFactoryBuilder类 SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream); // 4、获取SQLSession对象 SqlSession session = factory.openSession(); // 5、指定要执行的SQL语句 String sqlId = "com.Etui.dao.StudentDao.selectStudents"; // 6、通过SqlSession对象执行SQL语句 List<Student> students = session.selectList(sqlId, 1003); // 查询数据 System.out.println("查询结果如下:"); for (Student student : students) { System.out.println(student); } // 7、释放SqlSession对象 session.close(); } }
(5)MyBatis 的内部执行原理
- Dao的实现类执行SQL的原理
- MyBatis的dao技术