Chapter1 框架概述
1.1 软件开发常用结构
1.1.1 三层架构
- 架构简介
- 界面层(表示层,视图层):接受用户的数据,显示请求的处理结果。
- 业务逻辑层:接收表示传递过来的数据,检查数据,计算业务逻辑,调用数据访问层获取数据。
- 数据访问层: 与数据库打交道。主要实现对数据的增、删、改、查。将存储在数据库中的数据提交给业务层,同时将业务层处理的数据保存到数据库
- 对应的包
- 界面层:controller包
- 业务逻辑层:service包
- 数据访问层:dao包
- 三层交互
用户使用界面层—>业务逻辑层—>数据访问层(持久层)—>DB 数据库(mysql)1.1.2 常用框架
- 界面层:servlet–springmvc
- 业务逻辑层:service–spring
- 数据访问层:dao–mybatis
1.2 框架
1.2.1 定义
- 框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法;另一种认为,框架是可被应用开发者定制的应用骨架、模板
- 框架是半成品软件,是一组组件,供开发者使用完成需要的系统
1.2.2 框架优点
- 解决了技术整合问题
- 提高了开发效率
1.3 JDBC
缺点123…(车轱辘话)
所以不用
1.4 MyBatis 框架概述
开源项目,原名ibatis
1.4.1 mybatis框架功能
- 注册数据库的驱动,例如 Class.forName(“com.mysql.jdbc.Driver”)
- 创建 JDBC 中必须使用的 Connection , Statement, ResultSet 对象
- 从 xml 中获取 sql,并执行 sql 语句,把结果转换 java 对象
- 关闭资源
1.4.2 什么是mybatis
- mybatis是一个sql映射框架,提供的数据库的操作能力,相当于增强的JDBC
- 使用mybatis让开发人员专注与sql,不必关心Connection,Statement,ResultSet
的创建,销毁等工作。
1.5 mybatis入门
1.5.1 准备工作
创建mysql数据库和表
create database mybatis; use mybatis; create table student ( id int not null, name varchar(80), email varchar(100), age int, primary key (id) ); insert into student values (1001, 'Harry Potter', 'potter@jk.com',13), (1002,'Hermione','granger@jk.com',14), (1003,'Ron','weasley@jk.com',13);
创建maven工程
- 依赖
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.5</version> </dependency> <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.19</version> </dependency> </dependencies>
- 插件
不加这个编译的时候会忽略配置文件<build> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> </resource> </resources> </build>
- 依赖
添加日志功能
- 日志可以在控制台输出执行的 sql 语句和参数
- mybatis.xml
<configuration> <settings> <setting name="logImpl" value="STDOUT_LOGGING"/> </settings>
- 必须加在configuration标签的最前面,否则会报错
1.5.2 查询操作
- 创建实体类及Dao接口
- Student.java
public class Student { private Integer id; private String name; private String email; private Integer age; public Integer getId() {return id;} public String getName() {return name;} public String getEmail() {return email;} public Integer getAge() {return age;} public void setId(Integer id) {this.id = id;} public void setName(String name) {this.name = name;} public void setEmail(String email) { this.email = email;} public void setAge(Integer age) { this.age = age;} @Override public String toString() { return "Student{" + "id=" + id + ", name='" + name + '\'' + ", email='" + email + '\'' + ", age=" + age + '}'; } }
- Dao接口StudentDao.java
public interface StudentDao { // 查询所有学生数据 public List<Student> selectStudents(); }
- 接口映射文件 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.powernode.dao.StudentDao"> <select id="selectStudent" resultType="com.powernode.domain.Student"> select * from student order by id </select> </mapper>
- 约束文件:限制,检查在当前文件中出现的标签,属性必须符合mybatis的要求。
- mapper标签:当前文件的根标签
- namespace属性:命名空间,唯一值的, 可以是自定义的字符串。一般使用dao接口全类名
- 使用特定的标签,表示数据库的特定操作
<select>
: 表示执行查询,select语句<update>
: 表示更新数据库的操作, 就是在标签中 写的是update sql语句 <insert>
: 表示插入, 放的是insert语句<delete>
: 表示删除, 执行的delete语句
- select标签:
id
: 你要执行的sql语法的唯一标识,可以自定义,一般使用接口中的方法名。resultType
:结果类型,sql语句执行后得到ResultSet,遍历这个ResultSet得到java对象。值写的类型的全限定名称
- 与接口同一个包下且同名
- Student.java
- mybatis主配置文件
- resources目录下
- 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> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC"/> <property name="username" value="root"/> <property name="password" value="xxxxx"/> </dataSource> </environment> </environments> <!--指定映射文件位置--> <mappers> <mapper resource="com/powernode/dao/StudentDao.xml"/> </mappers> </configuration>
- 这里用的是mysql8.0,所有url比较复杂
- 测试类
public static void main( String[] args ) throws IOException { // 访问mybatis读取student数据 // 1. 定义mybatis主配置文件名称,从类路径根开始 String config = "mybatis.xml"; // 2. 读取文件 InputStream in = Resources.getResourceAsStream(config); // 3. 创建SqlSessionFactoryBuilder对象 SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); // 4. 创建SqlSessionFactory对象 SqlSessionFactory factory = builder.build(in); // 5. 获取SqlSession对象 SqlSession sqlSession = factory.openSession(); // 6. 指定要执行的sql语句的标识:sql映射文件中的namespace+"."+标签id值 String sqlId = "com.powernode.dao.StudentDao"+"."+"selectStudents"; // 7. 执行sql语句,通过sqlId找到语句 List<Student> studentList = sqlSession.selectList(sqlId); // 8. 输出结果 studentList.forEach(stu->System.out.println(stu)); // 9. 关闭对象 sqlSession.close(); }
1.5.3 插入操作
- 接口、接口映射文件
- StudentDao.java
public int insertStudent(Student student);
- StudentDao.xml
<insert id="insertStudent" > insert into student values(#{id},#{name},#{email},#{age}) </insert>
- StudentDao.java
- 测试类
- Test
@Test public void insertTest() throws IOException { // 访问mybatis读取student数据 // 1. 定义mybatis主配置文件名称,从类路径根开始 String config = "mybatis.xml"; // 2. 读取文件 InputStream in = Resources.getResourceAsStream(config); // 3. 创建SqlSessionFactoryBuilder对象 SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); // 4. 创建SqlSessionFactory对象 SqlSessionFactory factory = builder.build(in); // 5. 获取SqlSession对象 SqlSession sqlSession = factory.openSession(); // 6. 指定要执行的sql语句的标识:sql映射文件中的namespace+"."+标签id值 String sqlId = "com.powernode.dao.StudentDao"+"."+"insertStudent"; // 7. 执行sql语句,通过sqlId找到语句 Student student = new Student(); student.setAge(14); student.setEmail("Weasley@jk.com"); student.setId(1004); student.setName("Ginny"); int nums = sqlSession.insert(sqlId,student); sqlSession.commit(); // 需要提交事务 // 8. 输出结果 System.out.println("执行insert的结果:"+nums); // 9. 关闭对象 sqlSession.close(); }
- Test
1.5.4 其他操作
- 更新及删除操作流程同上:
- 在接口中增加相应方法
- 在映射文件中加入相关语句
- 调用sqlSession的相关方法
- 示例
- StudentDao.java
int deleteStudent(int id);//删 int updateStudent(Student student); //改
- StudentDao.xml
<update id="updateStudent"> update student set age = #{age} where id=#{id} </update> <delete id="deleteStudent"> delete from student where id=#{studentId} </delete>
- Test
int rows = session.delete(sqlId,id); //删除 int rows = session.update(sqlId,student);// 插入
- StudentDao.java