以图书管理目录为例的数据流转分析
新增功能
views \ modules \ book \ bookCatalogueList.html
[11]
<a href="${ctx}/book/bookCatalogue/form" class="btn btn-default btnTool" title="${text('新增book_catalogue')}"><i class="fa fa-plus"></i> ${text('新增')}</a>
step 01 点击此处【新增】按钮跳转到表单页面
views \ modules \ book \ bookCatalogueForm.html
<!--form标签内-->
[29]
<span class="required hide">*</span> ${text('book_name')}:<i class="fa icon-question hide"></i></label>
console.log(${text('book_name')})
[69]
<% if (hasPermi('book:bookCatalogue:edit')){ %>
<button type="submit" class="btn btn-sm btn-primary" id="btnSubmit">
<i class="fa fa-check"></i> ${text('保 存')}
</button>
<% } %>
<button type="button" class="btn btn-sm btn-default" id="btnCancel" onclick="js.closeCurrentTabPage()"> <i class="fa fa-reply-all"></i> ${text('关 闭')}
</button>
点击保存,将数据进行提交
点击关闭,触发关闭函数
<script>
$("#inputForm").validate({
submitHandler: function(form){
js.ajaxSubmitForm($(form), function(data){
js.showMessage(data.message);
if(data.result == Global.TRUE){
js.closeCurrentTabPage(function(contentWindow){
contentWindow.page();
});
}
}, "json");
}
});
</script>
web \ BookCatalogueController.java
[80]
/**
* 获取数据
*/
@ModelAttribute
public BookCatalogue get(String id, boolean isNewRecord) {
return bookCatalogueService.get(id, isNewRecord);
}
System.out.println("----------------我是控制层的获取数据1--------------------------------------");
System.out.println(bookCatalogueService);
[77]
/**
* 保存数据
*/
@RequiresPermissions("book:bookCatalogue:edit")
@PostMapping(value = "save")
@ResponseBody
public String save(@Validated BookCatalogue bookCatalogue) {
bookCatalogueService.save(bookCatalogue);
return renderResult(Global.TRUE, text("保存book_catalogue成功!"));
}
System.out.println("----------------我是控制层的获取数据2--------------------------------------");
System.out.println(bookCatalogueService);
service \ BookCatalogueSerivce.java
[44]
/**
* 保存数据(插入或更新)
* @param bookCatalogue
*/
@Override
@Transactional(readOnly=false)
public void save(BookCatalogue bookCatalogue) {
super.save(bookCatalogue);
}
entity \ BookCatalogue.java
// 创建图书管理目录(BookCatalogue)类
程序结构{
属性
get和set方法
数据约束和数据格式
}
dao \ BookCatalogueDao.java
book_catalogueDAO接口
@MyBatisDao
public interface BookCatalogueDao extends CrudDao<BookCatalogue> { null }
控制台分析
从登录页面到点击新增到保存数据的控制台记录(后续信息在此不表)
登录到点击列表
![今日份的学习笔记:2021.08.16_sql](https://s2.51cto.com/images/blog/202108/17/8aecd205798f2860916a1dbd82ad81b1.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184)
![今日份的学习笔记:2021.08.16_数据库_02](https://s2.51cto.com/images/blog/202108/17/8fece73c08de780a39beeb4b37b3b3d9.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184)
![今日份的学习笔记:2021.08.16_java_03](https://s2.51cto.com/images/blog/202108/17/9e8bdbeb2352069d8ce6fe43d66c62f5.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184)
![今日份的学习笔记:2021.08.16_mysql_04](https://s2.51cto.com/images/blog/202108/17/5e3851c6747de2b8573f71352e623eaf.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184)
点击新增
![今日份的学习笔记:2021.08.16_sql_05](https://s2.51cto.com/images/blog/202108/17/ff5b5995a91bdad201566921fd071103.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184)
录入数据并保存
![今日份的学习笔记:2021.08.16_java_06](https://s2.51cto.com/images/blog/202108/17/ec3b9cdd31f703ca0aca0b36c4daeacc.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184)
![今日份的学习笔记:2021.08.16_数据库_07](https://s2.51cto.com/images/blog/202108/17/8942c8dbde23b10740a4e961990e9bc6.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184)
由此可以得出,
点击新增按钮跳转页面时,
【我是控制层的获取数据】——>【我是控制层的查看编辑表单】
录入信息到点击保存的过程,可以看出:
【我是控制层的获取数据】——>【我是业务层的保存数据】——>【我是控制层的保存数据】——>
也验证了SpringMVC的三层架构
点击保存的同时触发了到目录列表的页面跳转,由此,
【我是控制层的获取数据】——>【我是控制层的查询列表数据】——>【我是业务层的查询分页数据】
简单地说,
用户录入一个数据,数据从View被发送到表现层(Controller)
Controller获取到数据后,将数据发配给Service层的对应处理方法
数据在service层进行一定的业务逻辑处理(调用相关方法处理数据)
处理后的数据被返回提交给Controller对应的部门,执行Controller相应的方法,
然后返回给页面
查询功能
![今日份的学习笔记:2021.08.16_mysql_08](https://s2.51cto.com/images/blog/202108/17/f6d597f51b16297b7e305e99f6267847.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=/resize,m_fixed,w_1184)
MyBatis绪论
SSM框架:配置文件的
The best way is to browse official documents
官网:mybatis – MyBatis 3 | 简介
MyBatis环境
JDK 1.8
MySQL 5.7 / 8.0(经典!)
maven 3.6+
IDEA
MyBatis前序
JDBC
MySQL
Java基础
Maven
Junit
MyBatis简介
什么是MyBatis
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。(定义来源官方文档)
持久层框架
如何获得MyBatis
maven仓库
GitHub
持久化与持久层
01 持久化
数据持久化
持久化就是将程序的数据在持久状态和瞬时状态转化的过程
内存:断电即失
数据库(jdbc)、IO文件持久化
生活:冷藏、罐头
为什么需要持久化?
有一些对象不能丢失
内存成本高
02 持久层
列举:Dao层,Service层,Controller层......
- 完成持久化工作的代码块
- 层的界限十分明显
为什么需要Mybatis?
帮助程序员将数据存入到数据库中;方便;简化、框架、自动化
第一个Mybatis程序
思路:搭建环境 ——> 导入Mybatis ——> 编写代码 ——> 测试
搭建环境
step 01 搭建数据库
在navicat中对于mysql的操作
create database `mybatis`;
use `mybatis`;
create table `user`(
`id` int(20) primary key,
`name` varchar(30) default null,
`pwd` varchar(30) default null
)engine=innodb default charset=utf8;
insert into `user`(`id`,`name`,`pwd`) values
(1,'小新','123456'),
(2,'美伢','123456'),
(3,'广志','123456')
step 02 新建项目
新建一个普通的maven项目 ——>
删除src目录文件夹(作为父工程)——>
导入依赖(依赖需要mysql驱动、mybatis和junit)——>
<!--从maven仓库给出某版本示例-->
<!-------------------------->
<!--mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.22</version>
</dependency>
<!--mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
<!--junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
创建一个模块
以刚才创建的maven项目为父工程创建一个new maven module,此处命名为mybatis-01,以下操作均是在子模块中进行的
01 编写mybatis的核心配置文件
在 src \ main \ resource 下新建名为 mybatis-config.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核心配置文件-->
<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?useSSL=true&useUnicode=true&characterEncoding=UTF8&serverTimezone=Asia/Shanghai"/>
<property name="username" value="root"/><!--数据库用户名-->
<property name="password" value="root"/><!--数据库密码-->
</dataSource>
</environment>
</environments>
<!--每一个mapper.xml都需要在mybatis的核心配置文件注册-->
<mappers>
<mapper resource="com/learn/dao/UserMapper.xml"/>
</mappers>
</configuration>
注意事项
url value = jdbc:mysql://localhost:3306 + ? + 数据库名称 & ......
jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF8&serverTimezone=Asia/Shanghai
com.mysql.jdbc.Driver和mysql-connector-java 5一起用
com.mysql.cj.jdbc.Driver和mysql-connector-java 6 一起用
02 编写mybatis的工具类
每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为核心的。SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先配置的 Configuration 实例来构建出 SqlSessionFactory 实例。
从 XML 文件中构建 SqlSessionFactory 的实例非常简单,建议使用类路径下的资源文件进行配置。 但也可以使用任意的输入流(InputStream)实例,比如用文件路径字符串或 file:// URL 构造的输入流。MyBatis 包含一个名叫 Resources 的工具类,它包含一些实用方法,使得从类路径或其它位置加载资源文件更加容易。
factory 工厂模式
builder 建造者模式