# Java ## Java技术体系 ``` 1. Java基础: 变量 选择结构(if) 循环结构(for) 数组 ============================================================================ 2. Java面向对象 类 方法 属性 对象 创建类的语法: 访问修饰符(public/private) class 类名{ // 类名首字母大写 } 创建方法的语法: 访问修饰符 返回值类型(void/基本数据类型/对象/集合) 方法名称(有参/无参){ } 类中包含的内容: a.属性 b.方法 对象创建的语法: 类名 对象名=new 类名(); 字符串的常用方法 ============================================================================ 3. Java高级部分 Java面向对象的三大特性: a. 封装: (1).属性私有化 (2).生成get和set方法 b. 继承: Java支持单根继承 extends 好处: 父类有的,子类完全可以使用 c. 多态: 子类指向父类对象 d. 接口: interface 接口用法: (1)接口中所有的方法都是抽象方法 (2) 方法没有方法体 (3)方法重写(implements) e. IO流: InputStream OutputStream f. 线程: h. 集合: List集合 set集合 Map集合 size() 泛型集合: 存储有相同类型的数据 ==============================Java控制台项目================================ 4. Javaweb a. JDBC:java连接数据库的技术 b. Servlet: 后端与前端进行数据交互和页面传递 ? servlet中跳转页面(方法:转发 重定向) c. JSP: 动态网页(html代码+java代码) ? <%%> d. HTML5:静态网页 e. css: 页面样式 f. javaScript: g. JavaQuery: 封装js h. layui: 前端框架 vue.js elementUI i. 数据库:Sqlserver mysql oracle 关系型数据库 非关系型数据库(redis) ===============================Javaweb项目(前端+后端)====================== 5. 企业级框架SSM MyBatis框架: 数据访问(操作数据库)====JDBC角色 Spring框架: 胶水框架(主要跟其他框架组合) Spring全家桶(Springmvc springboot springcloud) SpringMVC框架: web框架 =============Servlet角色 Thymeleaf:模板引擎 =============================Javaweb企业级项目(前端+后端)===================== 6.前后端分离 a.springboot + vue 7.微服务: springcloud+ES+Redis =====架构师 ``` ### Java基础、高级(控制台项目) #### 新建类 ![image-20220116152649260](张博凯的Java学习笔记.assets/image-20220116152649260.png) (可以和包一起建) `org.example.entity.User` 或 `org.example.pojo.User` > 类名首字母大写;包名首字母小写 ![image-20220116153103336](张博凯的Java学习笔记.assets/image-20220116153103336.png) ##### 创建main方法 `main + <回车>` ![image-20220116153728996](张博凯的Java学习笔记.assets/image-20220116153728996.png) ![image-20220116153844861](张博凯的Java学习笔记.assets/image-20220116153844861.png) #### 新建接口 ![image-20220116153417709](张博凯的Java学习笔记.assets/image-20220116153417709.png) > 接口没有方法体,不可以new对象 #### 实现接口 UserDao ![image-20220116154126155](张博凯的Java学习笔记.assets/image-20220116154126155.png) ![image-20220116154238246](张博凯的Java学习笔记.assets/image-20220116154238246.png) ![image-20220116154415712](张博凯的Java学习笔记.assets/image-20220116154415712.png) ![image-20220116154448653](张博凯的Java学习笔记.assets/image-20220116154448653.png) #### 集合与数组 ```java /* * 数组:存储相同数据类型的一组数据 * 集合:可以存储不同数据类型的数据 * 泛型集合:存储有相同类型的数据 */ // 集合 List list = new List(); list.add("aa"); list.add(1); list.add(new Person()); list.add(2.34); // 泛型集合 List a = new ArrayList(); ``` #### 导入依赖 ##### 传统jar包 1. 下载jar包 2. 将下载的jar包拷贝到项目中 > web项目放在web中, 3. 选择jar文件,右键 Add as Library > 存在的问题 > > 1. 步骤多(相对) > 2. 在不同项目中如果需要使用同一jar包,需要分别存储这个jar文件,导致项目体积大 > 3. 在不同的环境下可能因为jar版本不一致导致项目无法运行 ##### Maven导入依赖 > Maven是一个**基于项目对象模型(pom)用于进行项目的依赖管理**的工具软件 ###### 核心功能 1. 依赖聚合 2. 聚合工程 > javaweb三层架构:Dao层、Service层 Servlet jsp (可以每一层放在一工程里面) ###### 官网 Maven官网:https://maven.apache.org/ ![image-20220117103539600](张博凯的Java学习笔记.assets/image-20220117103539600.png) ###### 安装和配置 **1. 安装及目录介绍** 下载:https://maven.apache.org/download.cgi > tar.gz是linux下的,zip是windows下的 > > 注意:Maven使用前JDK需要先安装配置好 > > - 解压 > > - 目录结构 > > - bin目录:存储指令文件(Maven提供了一个mvn指令) > > - boot目录:包含了一个类加载框架的jar文件 > > - conf目录 > > - settings.xml:核心配置文件 > > - 配置本地存储库 `` > > ![image-20220117114331099](张博凯的Java学习笔记.assets/image-20220117114331099.png) > > - 配置镜像 > > ```xml > > > aliyunmaven > * > 阿里云公共仓库 > https://maven.aliyun.com/repository/public > > > ``` > > - lib目录:存放了Maven运行所需的jar文件 **2. 配置环境变量** > | 环境变量 | 说明 | > | ---------- | ------------------------------------------------------------ | > | MAVEN_HOME | 压缩包解压出来的地址,例如:`D:\Program\Java\apache-maven-3.6.3` | > | PATH | `%MAVEN_HOME%\bin` | **3. 测试** `mvn -version` 或 `mvn -v` ![image-20220117105823106](张博凯的Java学习笔记.assets/image-20220117105823106.png) **4. 依赖管理流程** ![Maven.drawio](张博凯的Java学习笔记.assets/Maven.drawio.png) 本地仓库:就是本地计算机上的某个文件夹(可以自定义的任何文件夹) 远程仓库:就是远程主机上的jar文件仓库 ### Java项目打包三种方式 1. pom(Maven项目) 2. jar(Java普通项目) 3. war(Javaweb项目) ## IntelliJ IDEA开发 ### 配置 #### 主题配置 Settings > Appearance & Behavior > Appearance ![image-20220116150937119](张博凯的Java学习笔记.assets/image-20220116150937119.png) #### 编码设置 Settings > Editor > File Encodings 改成UTF-8 ![image-20220116150815030](张博凯的Java学习笔记.assets/image-20220116150815030.png) #### 设置IDEA启动时不自动打开上次打开的项目 Settings > Appearance & Behavior > System Settings ![image-20220118002219620](张博凯的Java学习笔记.assets/image-20220118002219620.png) #### 查看JDK版本 ```bash java -version ``` ![image-20220116151812896](张博凯的Java学习笔记.assets/image-20220116151812896.png) #### 配置idea中的JDK File > Project Structure ![image-20220116161629613](张博凯的Java学习笔记.assets/image-20220116161629613.png) ![image-20220116161555885](张博凯的Java学习笔记.assets/image-20220116161555885.png) #### 配置idea中的Maven Settings > Build, Execution, Deployment > Build Tools > Maven ![image-20220117142419973](张博凯的Java学习笔记.assets/image-20220117142419973.png) #### IDEA创建自定义模板 [点击文档内跳转](#IDEA自定义模板) ### 快捷键 > 有些快捷键在其他部分顺带提到了,这里仅写其他部分没有提到的快捷键 - main+回车 创建main方法 ```java public static void main(String[] args) { } ``` - xxxx.var+回车 生成赋值语句 ```java "apple".var // 👇 String apple = "apple"; ``` - sout+回车 输出语句 ```java System.out.println(); ``` - Alt+Enter 添加try catch ... - Alt+Insert 生成构造器、Getter and Setter等 ![image-20220118005611780](张博凯的Java学习笔记.assets/image-20220118005611780.png) - ### 创建项目 #### 创建简单Java项目(控制台项目) ![image-20220116152139474](张博凯的Java学习笔记.assets/image-20220116152139474.png) 不使用模板,直接Next ![image-20220116152438232](张博凯的Java学习笔记.assets/image-20220116152438232.png) 设置项目名称和路径,点击完成 ![image-20220116152545188](张博凯的Java学习笔记.assets/image-20220116152545188.png) #### 创建Javaweb项目 2021.3与2019版本不同 ##### 2021.3版本idea 参考了:https://blog.csdn.net/znufe_newer/article/details/113115002 **2021.3版本不是选左边的Java Enterprise,而是选Java!!!** ![image-20220116163216848](张博凯的Java学习笔记.assets/image-20220116163216848.png) ![image-20220116163237365](张博凯的Java学习笔记.assets/image-20220116163237365.png) ![image-20220116163251053](张博凯的Java学习笔记.assets/image-20220116163251053.png)![image-20220116163341532](张博凯的Java学习笔记.assets/image-20220116163341532.png) ![image-20220116163519894](张博凯的Java学习笔记.assets/image-20220116163519894.png) ##### 2019版本idea 步骤如下 **图中要勾上Create web.xml!!!** ![image-20220116163623140](张博凯的Java学习笔记.assets/image-20220116163623140.png) ![image-20220116163649763](张博凯的Java学习笔记.assets/image-20220116163649763.png) #### 创建普通Maven项目(控制台项目) ![image-20220117142625153](张博凯的Java学习笔记.assets/image-20220117142625153.png) ![image-20220117142728008](张博凯的Java学习笔记.assets/image-20220117142728008.png) ##### 项目目录介绍 ![image-20220117145353469](张博凯的Java学习笔记.assets/image-20220117145353469.png) ``` src/main/java # Java后端代码 src/main/resources # 配置文件 src/test/java pom.xml # Maven依赖 ``` ##### Maven的pom.xml配置 > **artifactId配置中不可以有中文!**artifictid的正则表达式为`[A-Za-z0-9_\-.]` ```xml 4.0.0 org.example maven_project 1.0-SNAPSHOT 8 8 ``` 在 `` 标签中添加依赖(如果需要的话),依赖可以在 https://mvnrepository.com/ 这个网站上找到 ![image-20220117143830281](张博凯的Java学习笔记.assets/image-20220117143830281.png) 依赖添加后需要点击图中 Load Maven Changes 按钮 ![image-20220117144038244](张博凯的Java学习笔记.assets/image-20220117144038244.png) 如果没有的话可以右键 Maven > Reload Project ![image-20220118110133670](张博凯的Java学习笔记.assets/image-20220118110133670.png) #### 创建Mavenweb项目 > 有两种方式 > > 1. 创建项目时,选择Maven,勾上Create from archtype > > 不建议使用这种方式,因为会生成很多依赖和没有用的东西在项目中 > > ![image-20220118002503343](张博凯的Java学习笔记.assets/image-20220118002503343.png) > > 2. 手动操作(见下方步骤) ![image-20220118002605490](张博凯的Java学习笔记.assets/image-20220118002605490.png) ![image-20220118002804532](张博凯的Java学习笔记.assets/image-20220118002804532.png) 配置打包方式:war包 pom.xml中添加 `war` ,如下: ```xml 4.0.0 org.example mavenweb项目 1.0-SNAPSHOT war ``` 添加 web.xml 文件 ![image-20220118003605867](张博凯的Java学习笔记.assets/image-20220118003605867.png) ![image-20220118003711365](张博凯的Java学习笔记.assets/image-20220118003711365.png) 在 `WEB-INF` 前添加 `src\main\webapp\` ![image-20220118003805398](张博凯的Java学习笔记.assets/image-20220118003805398.png) 删除 Web Resource Directory 重新加载 ![image-20220118004012885](张博凯的Java学习笔记.assets/image-20220118004012885.png) ![image-20220118004227647](张博凯的Java学习笔记.assets/image-20220118004227647.png) 即可 ![image-20220118004559833](张博凯的Java学习笔记.assets/image-20220118004559833.png) #### 创建SpringIOC Maven项目 ##### 创建项目 ![image-20220118002605490](张博凯的Java学习笔记.assets/image-20220118002605490.png) ![image-20220119185937940](张博凯的Java学习笔记.assets/image-20220119185937940.png) ##### 添加依赖 ###### 添加Spring依赖 core(核心依赖)、beans(组件)、aop(AOP处理)、context(context组件) Spring Context https://mvnrepository.com/artifact/org.springframework/spring-context/5.2.19.RELEASE ```xml org.springframework spring-context 5.2.19.RELEASE ``` 导入Spring Context依赖相当于同时导入了 `pring-aop`,`spring-beans`,`spring-core`,`spring-expression` 依赖,所以**只需要导入Spring Context即可** ![image-20220119201948073](张博凯的Java学习笔记.assets/image-20220119201948073.png) ###### 添加lombok依赖 [传送门](#Lombok依赖) ##### 创建Spring核心配置文件 > Spring核心配置文件“告诉Spring容器创建什么对象”,给对象属性赋什么值 在resources目录下创建applicationContext.xml文件(备注:名称可以自定义,但是建议一般使用applicationContext.xml) ![image-20220119213008054](张博凯的Java学习笔记.assets/image-20220119213008054.png) > 第一次需要新建模板,如图 > > ![image-20220119212825415](张博凯的Java学习笔记.assets/image-20220119212825415.png) src/main/resources/applicationContext.xml ```xml ``` ![image-20220119215150497](张博凯的Java学习笔记.assets/image-20220119215150497.png) ![image-20220119215211686](张博凯的Java学习笔记.assets/image-20220119215211686.png) #### 创建SpringMVC Maven web项目 ![image-20220118002605490](张博凯的Java学习笔记.assets/image-20220118002605490.png) ![image-20220120143744218](张博凯的Java学习笔记.assets/image-20220120143744218.png) ##### Mavenweb配置 参照[创建Mavenweb项目](#创建Mavenweb项目),将项目配置为Mavenweb项目 ##### idea与Tomcat集成 ![image-20220120152419754](张博凯的Java学习笔记.assets/image-20220120152419754.png) ![image-20220120153146124](张博凯的Java学习笔记.assets/image-20220120153146124.png) >4:自定义名称 > >5:Tomcat本地路径 > >6:选择浏览器 > >7:默认访问的路径 > >8:JDK 再次编辑 Run/Debug Configuration ![image-20220120153712846](张博凯的Java学习笔记.assets/image-20220120153712846.png) ![image-20220120153639117](张博凯的Java学习笔记.assets/image-20220120153639117.png) > 选择第1个或者第2个都行 ![image-20220120153830065](张博凯的Java学习笔记.assets/image-20220120153830065.png) >`/` 表示从根目录启动 ##### 项目结构 > ![image-20220120154144701](张博凯的Java学习笔记.assets/image-20220120154144701.png) > > - java:后端代码 > - resources:配置文件 > - webapp:静态资源(html, css, 图片等) ##### 启动 在 webapp 目录下创建 index.jsp ,然后运行就可以看到了。 > Tomcat控制台输出乱码解决方案 > > ![image-20220120155801302](张博凯的Java学习笔记.assets/image-20220120155801302.png) > > 在这两个地方添加下方配置 > > ``` > -Dfile.encoding=UTF-8 > ``` > > 1. idea > > ![image-20220120160009256](张博凯的Java学习笔记.assets/image-20220120160009256.png) > > > > ![image-20220120160041194](张博凯的Java学习笔记.assets/image-20220120160041194.png) > > 2. tomcat > > ![image-20220120160127852](张博凯的Java学习笔记.assets/image-20220120160127852.png) > > 添加完后,重启idea即可 接下来,[配置SpringMVC](#配置SpringMVC) ### 连接数据库 ##### IDEA连接MySQL ![image-20220116172510338](张博凯的Java学习笔记.assets/image-20220116172510338.png) ![image-20220116172545108](张博凯的Java学习笔记.assets/image-20220116172545108.png) 注意: ![image-20220116172803614](张博凯的Java学习笔记.assets/image-20220116172803614.png) 填写用户名&密码 ![image-20220116172859540](张博凯的Java学习笔记.assets/image-20220116172859540.png) 连接之后默认值会显示一个数据库 ![image-20220117100543999](张博凯的Java学习笔记.assets/image-20220117100543999.png) 选择其他数据库 ![image-20220117100636687](张博凯的Java学习笔记.assets/image-20220117100636687.png) ![image-20220117100732206](张博凯的Java学习笔记.assets/image-20220117100732206.png) ## Java、Javaweb ### Lombok > Lombok是简化javabean(实体类),可以使用注解简化代码 #### 导入依赖 https://mvnrepository.com/artifact/org.projectlombok/lombok ```xml org.projectlombok lombok 1.18.22 provided ``` #### IDEA中使用 > IDEA中使用必须安装lombok插件,才可以生效 ![image-20220118005337949](张博凯的Java学习笔记.assets/image-20220118005337949.png) #### 常用注解 1. @Data > 相当于实体类封装的get和set方法 2. @Setter > 相当于实体类封装的set方法 3. @Getter > 相当于实体类封装的get方法 4. @NoArgsConstructor > 相当于无参构造函数 5. @AllArgsConstructor > 相当于有参构造函数 ### JDBC(以MySQL为例) > Java连接数据库的技术 #### 导入MySQL依赖包 从网上下载MySQL的jar包:https://mvnrepository.com/artifact/mysql/mysql-connector-java > MySQL 5.x版本导入5.1.x版本jar包,8.x版本导入8.0.x版本jar包 ![image-20220116164807251](张博凯的Java学习笔记.assets/image-20220116164807251.png) 下载后放入项目web/lib文件夹下: ![image-20220116164942847](张博凯的Java学习笔记.assets/image-20220116164942847.png) 添加jar包 ![image-20220116165411807](张博凯的Java学习笔记.assets/image-20220116165411807.png) 创建User.java,并编写Java代码: 全限定名com.mysql.jdbc.Driver是这样复制出来的 ![image-20220116165755225](张博凯的Java学习笔记.assets/image-20220116165755225.png) ![image-20220116165818350](张博凯的Java学习笔记.assets/image-20220116165818350.png) ```java package org.exmple.entity; import java.sql.*; /** * JDBC链接数据库的操作 */ public class UserJdbc { public static void main(String[] args) { // 1. 加载驱动(全限定名com.mysql.jdbc.Driver是复制进来的,也可以一个一个 . 出来) try { // 2. Alt + Enter 抛出异常 Class.forName("com.mysql.jdbc.Driver"); // 3. 创建连接对象(Connection是java.sql下的) Connection connection= DriverManager.getConnection("jdbc:mysql://localhost:3306/dormitory","root","111111"); // 4. Alt + Enter 抛出异常 // 5. 写SQL语句 String sql = "select * from d_student"; // 6. 创建对象 PreparedStatement PreparedStatement preparedStatement = connection.prepareStatement(sql); // 7. 执行命令 ResultSet resultSet = preparedStatement.executeQuery(); // 8. 循环遍历 while (resultSet.next()){ System.out.println(resultSet.getInt("s_id")+"\t"+resultSet.getString("s_name")); } } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } } } ``` 执行结果 ![image-20220117101802262](张博凯的Java学习笔记.assets/image-20220117101802262.png) #### Maven 从网上下载MySQL的jar包:https://mvnrepository.com/artifact/mysql/mysql-connector-java > MySQL 5.x版本选择5.1.x版本,8.x版本选择.0.x版本 下面以MySQL 5.7版本为例: ![image-20220117143510876](张博凯的Java学习笔记.assets/image-20220117143510876.png) ![image-20220117143541787](张博凯的Java学习笔记.assets/image-20220117143541787.png) ```xml mysql mysql-connector-java 5.1.49 ``` ### Tomcat #### 配置Tomcat服务器 > Tomcat官网:https://tomcat.apache.org/ > > 下载:https://tomcat.apache.org/download-90.cgi > > ![image-20220120144746154](张博凯的Java学习笔记.assets/image-20220120144746154.png) ##### 目录结构 > bin:启动或停止Tomcat服务器 > > conf:核心配置文件,可以修改端口号等信息 > > lib:所需的jar文件 > > logs:日志信息 > > temp > > webapps:项目部署 > > work ![image-20220120144935976](张博凯的Java学习笔记.assets/image-20220120144935976.png) ##### 启动 | | Windows | Linux | | -------- | ---------------- | --------------- | | 启动服务 | bin/startup.cmd | bin/startup.sh | | 停止服务 | bin/shutdown.cmd | bin/shutdown.sh | ##### Tomcat核心文件讲解 conf/server.xml 配置或修改端口号(建议添加 `URIEncoding="utf-8")` ```xml ``` #### idea与Tomcat集成 [idea与tomcat集成](#idea与tomcat集成) ### Servlet > 后端与前端进行数据交互和页面传递 跳转页面的方式 - forward 转发 - redirect 重定向 ### JSP > 动态网页 JSP中Java代码需要用 `<% %>` 包起来 ### Thymeleaf > 模板引擎 ### HTML5 > 静态网页 ### CSS > 页面样式 ### JavaScript #### JavaQuery(jQuery) ### 前端框架 #### Layui #### Vue.js #### elementUI ### 数据库 #### 关系型数据库 SQL Server MySQL Oracle #### 非关系型数据库 redis ## 企业级框架SSM > 框架:框架,就是软件的半成品,完成了软件开发过程中的通用操作,程序员只需很少或者不用进行加工就能实现特定的功能,从而简化开发人员在开发过程中的开发步骤,提高开发效率。 > > 常用框架 > > - MVC框架:简化了Servlet的开发步骤 > - struts > - struts2 > - SpringMVC > - 持久层框架:完成数据库操作的框架 > - Apache DBUtils > - Hibernate > - MyBatis > - 胶水框架:Spring > > SSM:Spring SpringMVC MyBatis > > SSH:Spring Structs2 Hibernate ### MyBatis框架 > 数据访问(操作数据库),JDBC角色 > > MyBatis是一个半自动的ORM框架 > > ORM:Object Relational Mapping,对象关系映射,将Java中的一个对象与数据表中的一行记录一一对应。(表映射为类,类名一般是表名首字母大写,类中的属性就是表中的字段名) > > ORM框架提供了实体类与数据表的映射关系,通过映射文件的配置,实现对象的持久化 > MyBatis的前身是iBatis,是Apache提供 的一个开源项目 > > 对JDBC进行了封装,几乎消除了所有的JDBC代码 > > 支持xml和注解配置方式完成ORM操作 官网:https://mybatis.org/mybatis-3/ #### MyBatis框架部署及CRUD > MyBatis操作数据库进行增加、删除、修改、查询操作 首先创建Maven项目(Maven普通或Mavenweb) 添加mybatis依赖(目前官网最新版是3.5.9) https://mvnrepository.com/artifact/org.mybatis/mybatis ```xml org.mybatis mybatis 3.5.9 ``` 同时还需要添加 - MySQL依赖:[点击文档内跳转](#mysql依赖) - Lombok依赖:[点击文档内跳转](#Lombok依赖) ##### 创建MyBatis配置文件 在resources目录下创建mybatis-config.xml文件 ```xml ``` ###### IDEA创建自定义模板 ![image-20220118103532515](张博凯的Java学习笔记.assets/image-20220118103532515.png) Name: `mybatis-config` Extension: `xml` File Name: `mybatis-config.xml` 勾选 Enable Live Templates 激活当前模板 模板代码👇 ```xml ``` 出现如图问题解决方案 ![image-20220118104342493](张博凯的Java学习笔记.assets/image-20220118104342493.png) ![image-20220118104541497](张博凯的Java学习笔记.assets/image-20220118104541497.png) ###### 在mybatis-config.xml中进行数据库连接信息配置 > environments标签中可以定义多个environment,每个environment标签可以定义一套连接配置default属性,用来指定使用哪个environment标签 > > transactionManager标签用于配置数据库管理方式(默认是JDBC > > dataSource标签用于配置数据库的连接信息 配置模板(idea中Maven配置好后输入 ` ``` 配置信息 ```xml ``` > 还可以将数据库密码写在配置文件中,避免直接将数据库配置信息写在mybatis-config.xml文件中,[传送门](#使用db.properties文件进行数据库配置) > 如果出现了中文乱码,在jdbc:mysql://localhost:3306/mydb后面添加 `characterEncoding=utf-8` ##### MyBatis框架使用 > 案例:学生信息的数据库操作 ###### 创建数据库表 创建一个数据库,创建student数据表,并插入数据 ```sql CREATE DATABASE `mydb` CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_unicode_520_ci'; CREATE TABLE `student` ( `stuId` int(11) NOT NULL AUTO_INCREMENT, `stuName` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, `stuGender` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, `stuAge` int(255) NOT NULL, PRIMARY KEY (`stuId`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_520_ci; INSERT INTO `mydb`.`student` (`stuName`, `stuGender`, `stuAge`) VALUES ('admin', '男', 18); INSERT INTO `mydb`.`student` (`stuName`, `stuGender`, `stuAge`) VALUES ('tom', '男', 19); ``` ###### 创建实体类 > ORM映射关系:类名就是表名的首字母大写,类中的属性就是表中的字段名 > > @Data:类要进行封装: 1. 属性私有化(private); 2. 生成get和set方法 src/main/java/org/example/entity/Student.java ```java package org.example; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; /** * 学生实体类 */ @Data @NoArgsConstructor @AllArgsConstructor public class Student { private int stuId; private String stuName; private String stuGender; private int stuAge; } ``` ###### 创建Dao接口,定义操作方法 src/main/java/org/example/dao/StudentDao.java ```java package org.example.dao; import org.example.entity.Student; /** * 接口 */ public interface StudentDao { /** * 添加学生 * @param student * @return */ public int insertStu(Student student); /** * 删除学生 * @param stuId * @return */ public int deletetStu(int stuId); /** * 查询 * @param stuName * @param stuGender * @return */ public Student login(String stuName, String stuGender); /** * 查询所有学生信息 * @return */ public List showStudent(); } ``` ###### 创建Dao接口的映射文件 在resources目录下创建mapper文件 > 可以在IDEA中自定义一个模板,mapper文件模板如下,[参考](#IDEA自定义模板) > > ```xml > > PUBLIC "-//mybatis.org//DTD Config 3.0//EN" > "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> > > > > ``` - **创建StudentMapper.xml文件** src/main/resources/mappers/StudentMapper.xml > 使用上方的mapper文件模板创建 - **StudentDao.java与StudentMapper.xml保持一致,将StudentDao.java接口改为StudentMapper.java** ###### 在映射文件中对DAO中的方法进行实现 ```xml insert into student(stuName, stuGender, stuAge) VALUES (#{stuName}, #{stuGender}, #{stuAge}); delete from student where stuId=#{stuId}; ``` > [多参数使用] > > **当传入参数大于或等于2个时,有三种方式实现**,上方代码使用的是第1种实现方式 > > 1. `arg0`, `arg1`, `arg2`, `...` 实现 > > 如上方代码中的实现方式 > > ```xml > > ``` > > 2. `param1`, `param2`, `param3`, `...` 实现 > > ```xml > > ``` > > 3. 使用注解配置(推荐) > > 首先在Dao接口中添加注解如下 > > ```java > /** > * 查询 > * @param stuName > * @param stuGender > * @return > */ > public Student login(@Param("name") String stuName, @Param("pwd") String stuGender); > ``` > > 然后在xml文件中如下配置 > > ```xml > > ``` 目前为止,项目的结构应该如下 ![image-20220118161808106](张博凯的Java学习笔记.assets/image-20220118161808106.png) ###### 将映射文件添加到主配置文件中 在mybatis-config.xml中配置 src/main/resources/mybatis-config.xml ``` ``` ##### 单元测试 > JUnit单元测试 ###### 添加单元测试的依赖 https://mvnrepository.com/artifact/junit/junit/4.12 ```xml junit junit 4.12 test ``` ###### 创建测试 创建TestStudent.java文件 src/test/java/org/example/test/TestStudent.java ```java package org.example.test; 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 org.example.dao.StudentMapper; import org.example.entity.Student; import org.junit.Test; import java.io.IOException; import java.io.InputStream; public class TestStudent { @Test public void add() { try { // 1. 加载mybatis的主配置文件 // 选择 org.apache.ibatis 包下的 InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml"); // 2. 创建会话工厂 SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream); // 3. 获取会话 SqlSession sqlSession = factory.openSession(); // 4. 通过会话获取dao对象 StudentMapper mapper = sqlSession.getMapper(StudentMapper.class); // 5. 调用方法 Student student = new Student(); student.setStuName("bb"); student.setStuGender("男"); student.setStuAge(18); int i = mapper.insertStu(student); if (i > 0) { // 增删改会涉及到事务 // 进行事务提交 sqlSession.commit(); System.out.println("成功"); } else { System.out.println("失败"); } } catch (IOException e) { e.printStackTrace(); } } @Test public void delete() { // 此处省略 } @Test public void login() { try { // 1. ~ 4. 同 add() InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml"); SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream); SqlSession sqlSession = factory.openSession(); StudentMapper mapper = sqlSession.getMapper(StudentMapper.class); // 5. 调用方法 Student student = mapper.login("admin","男"); System.out.println(student); } catch (IOException e) { e.printStackTrace(); } } @Test public void showStudent() { try { // 1. ~ 4. 同 add() InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml"); SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream); SqlSession sqlSession = factory.openSession(); StudentMapper mapper = sqlSession.getMapper(StudentMapper.class); // 5. 调用方法 List students = mapper.showStudent(); System.out.println(students); /** * 可以这样遍历输出每一个元素 * for (Student stu:students) { * System.out.println(stu); * } */ } catch (IOException e) { e.printStackTrace(); } } } ``` 测试: 添加成功 ![image-20220118172524278](张博凯的Java学习笔记.assets/image-20220118172524278.png) ![image-20220118172654675](张博凯的Java学习笔记.assets/image-20220118172654675.png) 查询成功 ![image-20220118182635014](张博凯的Java学习笔记.assets/image-20220118182635014.png) 查询所有成功 ![image-20220118190921546](张博凯的Java学习笔记.assets/image-20220118190921546.png) > [输出] > > ```java > [Student(stuId=1, stuName=admin, stuGender=男, stuAge=18), Student(stuId=2, stuName=tom, stuGender=男, stuAge=19), Student(stuId=3, stuName=bb, stuGender=男, stuAge=18)] > ``` #### MyBatis文件 ##### MyBatis核心配置文件 > mybatis-config.xml是MyBatis框架的主配置文件,只要用于配置MyBatis的数据源及属性信息 >mybatis-config.xml中 `` 中的标签配置顺序如下: > >properties,settings,typeAliases,typeHandlers,objectFactory,objectWrapperFactory,plugins,environments,mappers ###### properties标签 > 用于设置键值对,或者加载属性文件 在resources目录下创建db.properties文件,配置键值对 src/main/resources/db.properties ```properties driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/mydb username=root password=111111 ``` 在mybatis-config.xml的 `` 标签中添加 `` ,然后后面的数据库配置信息可以直接使用 `${配置项名称}` 取得 > [注意] `` 标签要写在 `` 之前 ```xml ``` ###### typeAliases标签 > typeAliases用于给实体类取别名,在映射文件中可以直接使用别名来替换实体类的全限定名 ```xml ``` 配置后,可以如下修改 ``` ... ... ``` ###### plugin插件 > 插件标签:向分页插件的使用 ```xml ``` ###### mappers标签 > 加载映射文件配置 ```xml ``` ##### 映射文件 ###### mapper标签 > mapper文件相当于Dao接口的实现类,namespace属性指定实现Dao接口的全限定名 ###### insert、update、delete、select标签 > 增加、修改、删除、查询 #### 分页插件 > Mybaits提供了一个PageHelper > > PageHelper官网:https://pagehelper.github.io/ > > GitHub:https://github.com/pagehelper/Mybatis-PageHelper > > 中文使用方法:https://github.com/pagehelper/Mybatis-PageHelper/blob/master/wikis/zh/HowToUse.md ##### 分页SQL语句 > 分页 关键字 limit > > 需要提供:当前页 一页显示的数据(页面容量) > > 查询表中共有多少条数据:`select count(*) from student;` > > 分页:`select count(*) from student limit (pageNum-1)*pageSize, pageSize;` ##### 导入PageHelper依赖 https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper/5.3.0 ```xml com.github.pagehelper pagehelper 5.3.0 ``` ##### 配置PageHelper拦截器 在mybatis-config.xml中配置 ```xml ``` ##### 插件使用 ``` // 分页前 List students = mapper.showStudent(); System.out.println(students); // 分页后 PageHelper.startPage(1, 2); List students = mapper.showStudent(); PageInfo pageInfo = new PageInfo(students); System.out.println(pageInfo); // 输出信息 System.out.println("当前页:" + pageInfo.getPageNum()); System.out.println("页面容量:" + pageInfo.getSize()); System.out.println("总条数:" + pageInfo.getTotal()); System.out.println("总页数:" + pageInfo.getPages()); System.out.println("显示的数据:"); for (Student student:pageInfo.getList() ) { System.out.println( student.getStuId() + "\t" + student.getStuName() + "\t" + student.getStuGender() + "\t" + student.getStuAge() ); } ``` 查询结果 ![image-20220118232516699](张博凯的Java学习笔记.assets/image-20220118232516699.png) #### log4j日志打印 > 查看日志信息 ##### log4j依赖 https://mvnrepository.com/artifact/log4j/log4j/1.2.17 ```xml log4j log4j 1.2.17 ``` ##### 导入log4j.propertites文件 [log4j.properties](张博凯的Java学习笔记.assets\file\log4j.properties) src/main/resources/log4j.properties ``` # Set root category priority to INFO and its only appender to CONSOLE. #log4j.rootCategory=INFO, CONSOLE debug info warn error fatal log4j.rootCategory=debug, CONSOLE, LOGFILE # Set the enterprise logger category to FATAL and its only appender to CONSOLE. log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE # CONSOLE is set to be a ConsoleAppender using a PatternLayout. log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n # LOGFILE is set to be a File appender using a PatternLayout. log4j.appender.LOGFILE=org.apache.log4j.FileAppender log4j.appender.LOGFILE.File=D:\axis.log log4j.appender.LOGFILE.Append=true log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n ``` #### 数据表关联映射 > 至少两张表,表与表之间有关系 > > 映射关系:一对一,一对多,多对一,多对多 ##### 一对一关系 > 实例:用户表—用户详情表 > > **查询用户的姓名、密码、年龄、地址、电话号码** > > ```sql > # 两种方式: > select * from user u,details d where u.user_id=d.user_id; > select * from user u inner join details d on u.user_id=d.user_id; > ``` ###### 数据库设计 用户信息表 ```sql CREATE TABLE `user` ( `user_id` int(11) NOT NULL AUTO_INCREMENT, `user_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL, `user_pwd` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL, `user_realname` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL, `user_age` int(11) DEFAULT NULL, PRIMARY KEY (`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci; ``` 用户详情表 ```sql CREATE TABLE `details` ( `detail_id` int(11) NOT NULL AUTO_INCREMENT, `user_address` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL, `user_desc` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL, `user_phone` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL, `user_id` int(11) NOT NULL, PRIMARY KEY (`detail_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci; ``` ###### 创建实体类 用户信息类 src/main/java/org/example/entity/User.java ```java package org.example.entity; import lombok.Data; import lombok.NoArgsConstructor; import lombok.AllArgsConstructor; /** * 对应表 用户信息表 * 类要封装: 1. 私有化 2.生成get和set方法 */ @Data @NoArgsConstructor @AllArgsConstructor public class User { private int userId; private String userName; private String userPwd; private String userRealname; private int userAge; private Details details; // 一对一关系 } ``` 用户详细信息类 src/main/java/org/example/entity/Details.java ```java package org.example.entity; import lombok.Data; import lombok.NoArgsConstructor import lombok.AllArgsConstructor; /** * 用户详情表 */ @Data @NoArgsConstructor @AllArgsConstructor public class Details { private int detailId; private String userAddress; private String userDesc; private String userPhone; private int userId; } ``` ###### mapper接口 src/main/java/org/example/dao/UserMapper.java ```java package org.example.dao; import org.example.entity.User; import java.util.List; /** * 接口 */ public interface UserMapper { /** * 查询信息 * @return */ public List showUser(); } ``` ###### mapper.xml文件 src/main/resources/mappers/UserMapper.xml ```xml ``` > 记得在mybatis-config.xml中配置 `` > > ```xml > > > > > > ``` ###### 测试类 src/test/java/org/example/test/UserTest.java ```java ... UserMapper mapper = sqlSession.getMapper(UserMapper.class); List users = mapper.showUser(); for(User user:users) { System.out.println( user.getUserName() + "\t" + user.getUserPwd() + "\t" + user.getUserAge() + "\t" + user.getDetails().getUserAddress() + "\t" + user.getDetails().getUserPhone() ); } ... ``` ##### 一对多关系 >案例:班级(1)—学生(n) > >**通过班级id查询该班级的信息及班级下的所有学生的信息** > >```sql >select * from classes c inner join student s on c.cid=s.scid and c.cid=1; >select * from classes c,student s where c.cid=s.scid and c.cid=1; >``` ###### 创建数据库表 班级表 ```sql CREATE TABLE `classes` ( `cid` int(11) NOT NULL AUTO_INCREMENT, `cname` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, `cdesc` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, PRIMARY KEY (`cid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci; ``` 学生表 ```sql CREATE TABLE `student` ( `sid` int(11) NOT NULL AUTO_INCREMENT, `sname` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL, `sage` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL, `scid` int(11) NOT NULL, PRIMARY KEY (`sid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci; ``` ###### 创建实体类 班级类 src/main/java/org/example/entity/Classes.java ```java package org.example.entity; import lombok.Data; import lombok.NoArgsConstructor; import lombok.AllArgsConstructor; import java.util.List; @Data @NoArgsConstructor @AllArgsConstructor public class Classes { private int cid; private String cname; private String cdesc; private List stu; // 一对多关系 } ``` 学生类 src/main/java/org/example/entity/Student.java ```java package org.example.entity; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @AllArgsConstructor @NoArgsConstructor public class Student { private int sid; private String sname; private int sage; private int scid; } ``` ###### mapper接口 src/main/java/org/example/dao/ClassesMapper.java ```java package org.example.dao; import org.example.entity.Classes; import java.util.List; /** * 接口 */ public interface ClassesMapper { /** * 通过班级id查询信息 * @return */ public Classes showClasses(int cid); } ``` ###### mapper.xml文件 src/main/resources/mappers/ClassesMapper.xml ```xml ``` > 记得在mybatis-config.xml中配置 `` > > ```xml > > > > > > > ``` ###### 测试类 src/test/java/org/example/test/ClassesTest.java ```java ... ClassesMapper mapper = sqlSession.getMapper(ClassesMapper.class); Classes classes = mapper.showClasses(1); System.out.println(classes); ... ``` 输出结果 ![image-20220119152029499](张博凯的Java学习笔记.assets/image-20220119152029499.png) ##### 多对一关系 > 案例:学生(n): 班级(1) > > **通过学生id查询该学生所在班级的信息** > > ```sql > select * from students s inner join classes c on s.scid=c.cid and s.sid=4; > select * from student s,classes c where s.scid=c.cid and s.scid=1; > ``` ###### 创建数据库表 [同上](#一对多关系创建数据表) ###### 创建实体类 学生类 src/main/java/org/example/entity/Student.java ```java package org.example.entity; import lombok.Data; import lombok.AllArgsConstructor; import lombok.NoArgsConstructor; @Data @AllArgsConstructor @NoArgsConstructor public class Student { private int sid; private String sname; private int sage; private int scid; private Classes classes; // 学生所在的班级 } ``` 班级类 src/main/java/org/example/entity/Classes.java ```java package org.example.entity; import lombok.Data; import lombok.AllArgsConstructor; import lombok.NoArgsConstructor; import java.util.List; @Data @AllArgsConstructor @NoArgsConstructor public class Classes { private int cid; private String cname; private String cdesc; } ``` ###### mapper接口 src/main/java/org/example/dao/ClassesMapper.java ```java package org.example.dao; import org.example.entity.Student; import java.util.List; /** * 接口 */ public interface StudentMapper { /** * 查询学生对应的班级 * @return */ public List showStu(); } ``` ###### mapper.xml文件 src/main/resources/mappers/StudentMapper.xml ```xml ``` > 记得在mybatis-config.xml中配置 `` > > ```xml > > > > > > > ``` ###### 测试类 src/test/java/org/example/test/StudentTest.java ```java ... StudentMapper mapper = sqlSession.getMapper(StudentMapper.class); List students = mapper.showStu(); for(Student student:students) { System.out.println(student.getSName() + "\t" + "对应班级:" + student.getClasses()); } ... ``` ##### 多对多关系 > 案例:学生(m)----课程(n) > > 注意:一般对于多对多的关系都会有一个中间表,对另外两张表进行关系。 > > ```sql > # 查询学生时,同时查询该学生选择的课程 > # 三张表联合查询 inner join on > > select * from student s inner join grades g inner join course c on > s.sid=g.sid and g.course_id=c.course_id; > > select * from student s,grades g,course c where s.sid=g.sid and g.course_id=c.course_id; > ``` ###### 数据库表设计 课程表 ```sql CREATE TABLE `course` ( `course_id` int(11) NOT NULL AUTO_INCREMENT, `course_name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, PRIMARY KEY (`course_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; ``` 学生表 ```sql CREATE TABLE `student` ( `sid` int(11) NOT NULL AUTO_INCREMENT, `sname` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, `sage` int(255) DEFAULT NULL, PRIMARY KEY (`sid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; ``` 中间表 ```sql CREATE TABLE `grades` ( `gradeId` int(11) NOT NULL AUTO_INCREMENT, `sid` int(11) NOT NULL, `course_id` int(11) NOT NULL, PRIMARY KEY (`gradeId`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; ``` ###### 创建实体类 学生类 src/main/java/org/example/entity/Student.java ```java package org.example.entity; import lombok.Data; import lombok.AllArgsConstructor; import lombok.NoArgsConstructor; @Data @AllArgsConstructor @NoArgsConstructor public class Student { private int sid; private String sname; private int sage; private List list; // 多个课程 } ``` 课程类 src/main/java/org/example/entity/Course.java ```java package org.example.entity; import lombok.Data; import lombok.AllArgsConstructor; import lombok.NoArgsConstructor; @Data @AllArgsConstructor @NoArgsConstructor public class Course { private int courseId; private String courseName; } ``` ###### mapper接口 src/main/java/org/example/dao/ClassesMapper.java ```java package org.example.dao; import org.example.entity.Student; import java.util.List; /** * 接口 */ public interface StudentMapper { /** * 查询学生对应的班级 * @return */ public List showStu(); } ``` ###### mapper.xml文件 src/main/resources/mappers/StudentMapper.xml ```xml ``` > 记得在mybatis-config.xml中配置 `` > > ```xml > > > > > > ``` ###### 测试类 src/test/java/org/example/test/StudentTest.java ```java ... StudentMapper mapper = sqlSession.getMapper(StudentMapper.class); List students = mapper.showStu(); for(Student student:students) { System.out.println(student.getSName() + "\t" + "对应班级:" + student.getClasses()); } ... ``` ##### 总结 1. 在多的一方添加集合,一的一方添加对象。 2. 如果实体类中的属性与数据库的字段名不一致时,mapper文件中选择resultmap映射 #### 动态SQL ##### 什么是动态SQL > 根据查询条件动态完成SQL拼接 ###### 创建数据库表 ```SQL CREATE TABLE `member` ( `member_id` int(11) NOT NULL AUTO_INCREMENT, `member_name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, `member_age` int(255) DEFAULT NULL, `member_city` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, PRIMARY KEY (`member_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; ``` ###### 创建实体类 src/main/java/org/example/entity/Member.java ```java package org.example.entity; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @NoArgsConstructor @AllArgsConstructor public class Member { private int memberId; private String memberName; private int memberAge; private String memberCity; } ``` ###### mapper接口 src/main/java/org/example/mapper/MemberMapper.java ```java package org.example.mapper; import org.example.entity.Member; import java.util.List; public interface MemberMapper { /** * 通过指定条件进行查询 * 1. 通过名称查新 * 2. 通过年龄查询 * 3. 通过城市查询 * @param member * @return */ public List showMember(Member member); /** * 修改 * @param member * @return */ public int updateMember(Member member); } ``` ###### mapper.xml文件 > if, where, trim, set src/main/resources/mappers/MemberMapper.xml ```xml update member member_name=#{memberName} member_city=#{memberCity} member_id=#{memberId} ``` > 记得在mybatis-config.xml中配置 `` > > ```xml > > > > > > ``` ###### 测试类 src/test/java/org/example/test/MemberTest.java ```java ... // 条件查询 MemberMapper mapper = sqlSession.getMapper(MemberMapper.class); Member member = new Member(); member.setMemberName("admin"); List members = mapper.showMember(member); for (Member member1 : members) { System.out.println(member1); } ... ``` ```java ... // 修改 MemberMapper mapper = sqlSession.getMapper(MemberMapper.class); Member member = new Member(); member.setMemberName("tom"); member.setMemberId(1); int i = mapper.updateMember(member); sqlSession.commit(); System.out.println(i); ... ``` #### MyBatis逆向生成 >MyBatis的快速生成实体类、mapper接口、mapper.xml文件 附件: [generator.zip](张博凯的Java学习笔记.assets\file\generator.zip) (放在D盘根目录下:`D:\generator`) 首先修改 `generator.xml` 配置文件 然后使用cmd命令 ``` # 1. 切换所在路径 D: cd generator # 2. java -jar mybatis-generator-core-1.3.2.jar -configfile generator.xml -overwrite ``` > [生成文件] > > 1. 实体类 (pojo/User.java) > > > 生成的接口文件不含注解 > > 2. Mapper (mapper/UserMapper.java) > > > deleteByPrimaryKey通过主键删除 > > > > insert是添加,insertSelective是选择性添加(前者需要指定每一个字段的值) > > > > selectByPrimaryKey通过主键查询 > > > > updateByPrimaryKey是通过主键修改,updateByPrimaryKeySelective是通过主键选择性修改(前者是修改所有字段) > > 3. (mapper/UserMapper.xml) > > > `` 中 `` 的jdbcType属性可以删除; > > > > `` 是公共SQL片段 > > > > `#{xxx,jdbcType=xxx}` 中 `,jdbcType=xxx` 可以省略 > > 想要生成多个表`generator.xml` 配置文件中就多复制几个 `` 标签 > Integer是int类型(Integer是int的包装类,Integer效率比int高) > 抽象方法的语法:访问修饰符 abstract 返回值类型 方法名称(); > > public abstract int xxxx(Integer xxx); // public abstract 可省略 ### Spring框架 > 胶水框架(主要跟其他框架结合) > > Spring全家桶(SpringMVC,Springboot,Spring Cloud) > > - Spring Boot 简化SSM > - Spring Framework Spring核心(IOC AOP) > - Spring Cloud、Spring Cloud Data Flow 微服务架构 > - Spring Data 数据验证(Spring提供的数据访问的客户端) > - Spring Security 权限验证(安全框架)类似框架:shiro 官网:https://spring.io/ ![image-20220119185108127](张博凯的Java学习笔记.assets/image-20220119185108127.png) > Spring是一个**轻量级的控制反转和面向切面编程**框架,用来解决企业项目开发的复杂问题 > > 特点: > > - 轻量级,体积小,对代码没有侵入性 > > - 控制反转IOC:把创建对象的工作交给Spring容器来完成 > - 依赖注入DI:Spring在创建对象的时候给对象的属性赋值 > - 面向切面编程AOP:做事务管理,可以在不改变原有业务逻辑的基础上实现对业务的增强 > - 容器:管理 Spring相关依赖:https://mvnrepository.com/search?q=spring > 1. Spring Context > > 2. Spring Core > > 3. Spring Web > > 做Web应用的 > > 4. Spring Beans > > Beans组件 > > 5. Spring Web MVC > > 6. Spring TestContext Framework > > 7. Spring AOP > > 事务处理 > > 8. Spring Object/Relational Mapping > > 9. Spring Framework > > ![image-20220119190419786](张博凯的Java学习笔记.assets/image-20220119190419786.png) #### Spring IOC和DI的使用 > IOC:控制反转,可以完成对象的创建 > > DI:对象属性赋值,对象管理 ##### Spring IOC基于XML ###### 创建SpringIOC Maven项目 [创建SpringIOC Maven项目](#创建SpringIOC_Maven项目) ###### 创建实体类 src/main/java/org/example/entity/User.java ```java package org.example.entity; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @NoArgsConstructor @AllArgsConstructor public class User { private int id; private String name; private int age; private String address; } ``` **使用Spring之间** src/test/java/org/example/test/UserTest.java ```java package org.example.test; import org.example.entity.User; public class UserTest { public static void main(String[] args) { // 创建对象 User user = new User(); // 对象赋值 user.setName("aa"); user.setId(1); } } ``` **使用Spring后** src/main/resources/applicationContext.xml ```xml ``` ###### 初始化Spring对象工厂,进行测试 src/test/java/org/example/test/UserTest.java ```java package org.example.test; import org.example.entity.User; import org.springframework.context.support.ClassPathXmlApplicationContext; public class UserTest { public static void main(String[] args) { // 加载Spring的核心配置文件 ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); // 通过Spring容器来获取对象 User user = (User) context.getBean("user"); System.out.println(user); } } ``` ##### DI依赖注入 > DI:给对象的属性赋值,Spring容器加载配置文件之后,通过**反射**创建累的对象,并给属性赋值。 > > Spring容器通过反射实现注入有三种方式: > > - set方法注入(用的较多) > - 构造器注入 > - 接口注入(不常用) ###### set注入 >在bean标签中通过property标签给属性赋值,实际上是通过set方式完成属性注入的 **简单类型及字符串** src/main/resources/applicationContext.xml ```xml ``` **自定义对象类型** 假设有两个实体类 src/main/java/org/example/entity/User.java ```java public class User { private int id; private String name; private int age; private String address; private Book book; } ``` src/main/java/org/example/entity/Book.java ```java public class Book { private int bookId; private String bookName; private String author; } ``` 方式1:在property标签中通过ref引用Spring容器中的另一个对象 src/main/resources/applicationContext.xml ```xml ``` 方式2:在property标签中,添加字标签bean来指定对象(内部bean) src/main/resources/applicationContext.xml ```xml ``` **集合类型** 假设有实体类 src/main/java/org/example/entity/User.java ```java public class User { private int id; private String name; private int age; private String address; private List list; } ``` src/main/resources/applicationContext.xml ```xml 吃饭 睡觉 打豆豆 ``` 测试 src/test/java/org/example/test/UserTest.java ```java package org.example.test; import org.example.entity.User; import org.springframework.context.support.ClassPathXmlApplicationContext; public class UserTest { public static void main(String[] args) { // 加载Spring的核心配置文件 ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); // 通过Spring容器来获取对象 User user = (User) context.getBean("user"); System.out.println(user); } } ``` ![image-20220119224034975](张博凯的Java学习笔记.assets/image-20220119224034975.png) ###### 构造器注入 **简单类型** 假设有实体类 src/main/java/org/example/entity/User.java ```java public class User { private int id; private String name; private int age; private String address; } ``` src/main/resources/applicationContext.xml ```xml ``` **自定义对象类型** 假设有两个实体类 src/main/java/org/example/entity/User.java ```java public class User { private int id; private String name; private int age; private String address; private Book book; } ``` src/main/java/org/example/entity/Book.java ```java public class Book { private int bookId; private String bookName; private String author; } ``` src/main/resources/applicationContext.xml ```xml ``` **集合类型** 同理 ##### Spring IOC基于注解 因为Spring容器初始化时,只会加载applicationContext.xml文件,那么我们在实体类中添加注解的话,注解不会被Spring扫描,所以需要在applicationContext.xml中配置扫描的范围,以达到Spring初始化时扫描到对应有注解的实体类并完成初始化工作。 ###### 修改头部 > 添加xmlns:context属性 > > `xmlns:context="http://www.springframework.org/schema/context"` > > 并在xsi:schemaLocation属性中添加 > > `http://www.springframework.org/schema/context` > > `http://www.springframework.org/schema/context/spring-beans.xsd` src/main/resources/applicationContext.xml ```xml ``` ```xml ``` ###### IOC常用的注解 **@Component** > 类注解:声明此类被Spring容器进行管理,相当于bean标签的作用 > > ```java > @Data > @AllArgsConstructor > @NoArgsConstructor > @Component > public class Book { > private int bookId; > private String bookName; > private String author; > } > ``` > @Component(value = "user") > > value属性用于指定当前bean的id,相当于bean标签的id属性,value属性可以省略,如果省略当前id的值默认为**类名首字母小写** **@Service** > 类注解,声明业务层处理类配置给Spring容器管理,service接口的实现类 **@Controller** > 类注解,声明将控制器类配置给Spring容器管理,例如:Servlet **@Autowired** > 属性注解,用于声明属性 **@Resource** > 属性注解,用于声明属性 ###### 实体类 src/main/java/org/example/entity/User.java ```java @Data @NoArgsConstructor @AllArgsConstructor @Component public class User { @Value("1") private int id; @Value("aa") private String name; @Value("12") private int age; @Value("武汉") private String address; @Resource // 或 @Autowired private Book book; } ``` src/main/java/org/example/entity/Book.java ```java @Data @AllArgsConstructor @NoArgsConstructor @Service public class Book { @Value("3") private int bookId; @Value("Java编程") private String bookName; @Value("dd") private String author; } ``` 测试 ```java package org.example.test; import org.example.entity.User; import org.springframework.context.support.ClassPathXmlApplicationContext; public class UserTest { public static void main(String[] args) { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); User user = (User) context.getBean("user"); System.out.println(user); } } ``` 输出 ```bash D:\Program\Java\jdk1.8.0_201\bin\java.exe ... User(id=1, name=aa, age=12, address=武汉, book=Book(bookId=3, bookName=Java编程, author=dd)) Process finished with exit code 0 ``` #### Spring整合MyBatis ##### 创建项目 ###### 创建普通Maven项目 ![image-20220119234814230](张博凯的Java学习笔记.assets/image-20220119234814230.png) ###### 导入依赖 需要导入的依赖:[MyBatis](#mybatis依赖)、[MySQL](#mysql依赖)、[Lombok](#Lombok依赖)、[JUnit](#junit依赖)、[Spring](#spring依赖)、MyBatis Spring、Druid **MyBatis Spring依赖** https://mvnrepository.com/artifact/org.mybatis/mybatis-spring/2.0.6 ```xml org.mybatis mybatis-spring 2.0.6 ``` **Druid依赖**(阿里巴巴数据源) https://mvnrepository.com/artifact/com.alibaba/druid/1.2.8 ```xml com.alibaba druid 1.2.8 ``` **Spring测试依赖** https://mvnrepository.com/artifact/org.springframework/spring-test/5.2.19.RELEASE ```xml org.springframework spring-test 5.2.19.RELEASE test ``` > Spring框架的依赖版本最好保持一致 **Spring JDBC** https://mvnrepository.com/artifact/org.springframework/spring-jdbc/5.2.19.RELEASE ```xml org.springframework spring-jdbc 5.2.19.RELEASE ``` 综上 pom.xml ```xml 4.0.0 org.example spring_and_mybatis 1.0-SNAPSHOT 8 8 org.mybatis mybatis 3.5.9 mysql mysql-connector-java 5.1.49 org.projectlombok lombok 1.18.22 provided junit junit 4.12 test org.springframework spring-context 5.2.19.RELEASE org.mybatis mybatis-spring 2.0.6 com.alibaba druid 1.2.8 org.springframework spring-test 5.2.19.RELEASE test org.springframework spring-jdbc 5.2.19.RELEASE ``` ###### 创建db.properties文件 在resources目录下创建db.properties文件,配置键值对 src/main/resources/db.properties ```properties driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/mydb?characterEncoding=utf-8 username=root password=111111 ``` ###### 创建Spring核心配置文件 在resources目录下创建applicationContext.xml文件:[传送门](#创建Spring核心配置文件) >当Spring和MyBatis整合后,MyBatis核心配置文件mybatis-config.xml可以不要 ```xml ``` ###### 数据库建表语句 用户表 ```sql CREATE TABLE `user` ( `user_id` int(11) NOT NULL AUTO_INCREMENT, `user_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL, `user_pwd` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL, `user_realname` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL, `user_age` int(11) DEFAULT NULL, PRIMARY KEY (`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci; ``` ###### 实体类 src/main/java/org/example/entity/User.java ```java package org.example.entity; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @AllArgsConstructor @NoArgsConstructor public class User { private Integer userId; private String userName; private String userPwd; private String userRealname; private Integer userAge; } ``` ###### mapper接口 src/main/java/org/example/mapper/UserMapper.java ```java package org.example.mapper; import org.example.entity.User; import java.util.List; public interface UserMapper { /** * 查询所有用户信息 * @return */ public List showUser(); } ``` ###### mapper.xml文件 src/main/resources/mappers/UserMapper.xml ```xml ``` ##### 测试类 > 当Spring和MyBatis整合后,单表不需要使用 `sqlSession.commit();` 事务提交,可以自动提交 src/test/java/org/example/test/SpringUserTest.java ```java package org.example.test; import org.example.entity.User; import org.example.mapper.UserMapper; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import javax.annotation.Resource; import java.util.List; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:applicationContext.xml") public class SpringUserTest { // 需要调用接口中的方法进行测试 @Resource private UserMapper userMapper; @Test public void show() { List users = userMapper.showUser(); for (User user : users) { System.out.println(user); } } } ``` > 通过@RunWith,声明当前测试类位于Spring容器管理 > > 通过@ContextConfiguration声明加载配置文件 运行结果 ![image-20220120005858883](张博凯的Java学习笔记.assets/image-20220120005858883.png) #### TKMapper快速开发 > tk.mapper是mybatis第三方提供的一个插件。简化接口,不需要映射文件 ##### 导入依赖 > 基于上一个项目(Spring整合MyBatis) https://mvnrepository.com/artifact/tk.mybatis/mapper/4.1.5 ```xml tk.mybatis mapper 4.1.5 ``` ##### 修改Spring的核心配置文件 **去掉以下部分** ```xml ``` **修改以下部分** ```xml ``` 改为 ```xml ``` ![image-20220120111645093](张博凯的Java学习笔记.assets/image-20220120111645093.png) ##### 删除映射文件 src/main/resources/mappers/ ##### 实体类添加注解 src/main/java/org/example/entity/User.java ```java package org.example.entity; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import tk.mybatis.mapper.annotation.KeySql; import javax.persistence.Id; import javax.persistence.Table; @Data @AllArgsConstructor @NoArgsConstructor @Table(name = "user") // 对应数据库表名 public class User { /* ***** 如果表中字段名和实体类中属性名一致,就可以直接测试 ***** */ @Id // 主键 @KeySql(useGeneratedKeys = true) // 自增 private Integer user_id; private String user_name; private String user_pwd; private String user_realname; private Integer user_age; /* 其实写成驼峰命名,经测试也可以 */ @Id // 主键 @KeySql(useGeneratedKeys = true) // 自增 private Integer userId; private String userName; private String userPwd; private String userRealname; private Integer userAge; /* ***** 如果表中字段名和实体类中属性名不一致,需要谈价@Column注解 ***** */ @Id // 主键 @KeySql(useGeneratedKeys = true) // 自增 @Column(name = "user_id") private Integer id; @Column(name = "user_name") private String name; @Column(name = "user_pwd") private String pwd; @Column(name = "user_realname") private String realname; @Column(name = "user_age") private Integer age; } ``` ##### mapper接口改为extends,接口函数删掉 src/main/java/org/example/mapper/UserMapper.java ```java package org.example.mapper; import org.example.entity.User; import tk.mybatis.mapper.common.Mapper; public interface UserMapper extends Mapper { } ``` ###### 测试类 ```java package org.example.test; import org.example.entity.User; import org.example.mapper.UserMapper; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import javax.annotation.Resource; import java.util.List; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:applicationContext.xml") public class SpringUserTest { // 需要调用接口中的方法进行测试 @Resource private UserMapper userMapper; @Test public void show() { List users = userMapper.selectAll(); for (User user : users) { System.out.println(user); } } } ``` 运行结果 ```bash User(user_id=1, user_name=小明, user_pwd=13579, user_realname=张小明, user_age=20) User(user_id=2, user_name=ad, user_pwd=asda, user_realname=dasd, user_age=48) Process finished with exit code 0 ``` #### Spring整合MyBatis整合log4j > 基于上一个项目(TKMapper快速开发) ##### 导入依赖 [log4j](#log4j依赖)、commons-logging、slf4j-log4j12 **导入commons-logging依赖** https://mvnrepository.com/artifact/commons-logging/commons-logging/1.2 ```xml commons-logging commons-logging 1.2 ``` **导入slf4j-log4j12依赖** https://mvnrepository.com/artifact/org.slf4j/slf4j-log4j12/1.7.25 ```xml org.slf4j slf4j-log4j12 1.7.25 test ``` ##### 添加log4j配置文件 [导入log4j.propertites文件](#导入log4j_propertites文件) 进行测试,日志成功输出 ![image-20220120115301780](张博凯的Java学习笔记.assets/image-20220120115301780.png) #### Spring和MyBatis整合后pageHelper分页插件的使用 ##### 导入依赖 [导入PageHelper依赖](#PageHelper依赖) ##### 在Spring核心配置文件中配置拦截器 https://github.com/pagehelper/Mybatis-PageHelper/blob/master/wikis/zh/HowToUse.md src/main/resources/applicationContext.xml ```xml ... params=value1 ``` ##### 测试类 src/test/java/org/example/test/SpringUserTest.java ```java package org.example.test; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import org.example.entity.User; import org.example.mapper.UserMapper; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import javax.annotation.Resource; import java.util.List; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:applicationContext.xml") public class SpringUserTest { // 需要调用接口中的方法进行测试 @Resource private UserMapper userMapper; @Test public void show() { // 设置当前页,页面容量 PageHelper.startPage(1,3); List users = userMapper.selectAll(); PageInfo userPageInfo = new PageInfo<>(users); System.out.println(userPageInfo); } } ``` 运行结果 ```bash PageInfo{pageNum=1, pageSize=3, size=3, startRow=1, endRow=3, total=5, pages=2, list=Page{count=true, pageNum=1, pageSize=3, startRow=0, endRow=3, total=5, pages=2, reasonable=false, pageSizeZero=false}[User(id=1, name=小明, pwd=13579, realname=张小明, age=20), User(id=2, name=ad, pwd=asda, realname=dasd, age=48), User(id=3, name=vb, pwd=13579, realname=张小明, age=20)], prePage=0, nextPage=2, isFirstPage=true, isLastPage=false, hasPreviousPage=false, hasNextPage=true, navigatePages=8, navigateFirstPage=1, navigateLastPage=2, navigatepageNums=[1, 2]} ``` #### AOP注解事务的使用 ##### 导入依赖 spring-aspects https://mvnrepository.com/artifact/org.springframework/spring-aspects/5.2.19.RELEASE ```xml org.springframework spring-aspects 5.2.19.RELEASE ``` ##### 修改Spring的核心配置文件 修改文件头,添加事务管理器配置 ```xml ... ``` ##### 应用 创建UserService src/main/java/org/example/service/UserService.java ```java package org.example.service; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; @Service public class UserService { @Transactional(propagation = Propagation.REQUIRED) public void addUser() { System.out.println("增加"); } @Transactional(propagation = Propagation.REQUIRED) public int updateUser() { return 1; } @Transactional(propagation = Propagation.SUPPORTS) // 查询不需要事务 public int selectUser() { return 1; } } ``` >**Spring中七种Propagation类的事务属性详解** > > REQUIRED:支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。 > > SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。 > > MANDATORY:支持当前事务,如果当前没有事务,就抛出异常。 > > REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起。 > > NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 > > NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。 > > NESTED:支持当前事务,如果当前事务存在,则执行一个嵌套事务,如果当前没有事务,就新建一个事务。 > REQUIRED和SUPPORTS用的较多。REQUIRED→增删改,SUPPORTS→查 ### SpringMVC框架 > Web框架,Servlet角色 #### 介绍 > SpringMVC是由Spring官方提供的基于MVC设计的web框架 > > SpringMVC是基于Servlet封装的用于实现MVC控制的框架,实现前端与服务端的交互 ##### SpringMVC优势 > 严格遵守MVC分层思想 > > SpringMVC在数据绑定、视图解析等提供了多种处理方式,可以灵活配置 > > SpringMVC对Restful风格提供了良好的支持 ##### SpringMVC本质工作 > 接受并解析请求 > > 处理请求 > > 数据渲染、响应请求 #### SpringMVC框架部署 ##### 创建Maven web工程 > 之前创建的都是Maven普通工程 [创建SpringMVC Maven web项目](#创建SpringMVC_Maven_web项目) ##### 配置SpringMVC ###### 导入依赖 > 所需依赖(导入spring-webmvc就可包含以下四个依赖) > > - spring-context > - spring-jdbc > - spring-web > - spring-webmvc 导入spring-webmvc依赖 https://mvnrepository.com/artifact/org.springframework/spring-webmvc/5.2.19.RELEASE ```xml org.springframework spring-webmvc 5.2.19.RELEASE ``` ###### 创建SpringMVC配置文件 在resources目录下创建名为spring-servlet.xml文件(使用spring模板),并修改头部+配置 src/main/resources/spring-servlet.xml ```xml ``` > 右上角点一下Create new application context > > ![image-20220120161453418](张博凯的Java学习笔记.assets/image-20220120161453418.png) ###### 在web.xml中配置SpringMVC的前端控制器 > SpringMVC提供了一个名为DispatcherServlet的类(前端控制器),用于拦截用户请求交由SpringMVC来处理 src/main/webapp/WEB-INF/web.xml ```xml springmvc org.springframework.web.servlet.DispatcherServlet contextConfigLocation classpath:spring-servlet.xml springmvc / ``` ###### 创建控制器 Controller > 在SpringMVC中,我们把接收用户请求,处理用户请求的类称为Controller(控制器) 1. 创建一个org.example.web的包(包需要在注解扫描的范围内) 2. 创建一个类(无需任何的继承和实现) 3. 在类上添加 `@Controller` 注解声明此类为SpringMVC的控制器 4. 在类上添加 `@RequestMapping("url")` 声明控制器类的请求url地址(可以省略) src/main/java/org/example/web/UserController.java ```java package org.example.web; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller @RequestMapping("/user") public class UserController { } ``` ###### 在控制器类中定义处理请求的方法 > 在一个控制器类中可以定义多个方法处理不同的请求 > > 在每个方法上添加 `@RequestMapping("/login")` 用于声明当前方法的请求url地址 ```java package org.example.web; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller @RequestMapping("/user") public class UserController { @RequestMapping("/add") public void addUser(){ System.out.println("增加"); } @RequestMapping("/select") public void viewUser(){ System.out.println("查询"); } } ``` ##### 启动 浏览器访问:http://localhost:8080/user/add ![image-20220120170419338](张博凯的Java学习笔记.assets/image-20220120170419338.png) 服务端成功输出信息 ![image-20220120170449972](张博凯的Java学习笔记.assets/image-20220120170449972.png) ##### 静态资源配置 > 静态资源:就是项目中的HTML, CSS, JS, 图片, 字体等 ###### /* 和 / 的区别 src/main/webapp/WEB-INF/web.xml中url-pattern内部配置 ```xml / /* ``` > **/*** 拦截所有的HTTP请求,包括jsp的请求,都作为控制器类的请求路径来处理 > > **/** 拦截所有的HTTP请求,但不包括jsp的请求,不会放行静态资源的请求(html、css、js) ###### 静态资源放行 在SpringMVC的配置文件中,添加以下代码 src/main/webapp/WEB-INF/web.xml ```xml ``` ![image-20220120184525560](张博凯的Java学习笔记.assets/image-20220120184525560.png) #### SpringMVC框架数据应用 > 前端提交数据到控制器,控制器接收处理数据 ##### 前端提交数据到控制器 ###### 表单提交 > 输入框需要提供name属性,SpringMVC控制器是通过name属性取值的 ```html

图书管理系统

图书名称:

图书作者:

图书价格:

``` ###### URL提交 > 超链接提交 ```html 跳转 ``` ###### ajax提交 > 略 ##### 控制器接收前端提交的数据 ###### @RequestParam("")接收请求行传值 `@RequestParam("")` 注解用于接收请求行传递的数据 src/main/java/org/example/web/UserController.java ```java package org.example.web; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; @Controller @RequestMapping("/user") public class UserController { @RequestMapping("/add") public void addUser(@RequestParam("bookName") String bookName, @RequestParam("author") String author, @RequestParam("price") String price) { System.out.println(bookName); System.out.println(author); System.out.println(price); } } ``` 测试 ![image-20220120214323545](张博凯的Java学习笔记.assets/image-20220120214323545.png) ![image-20220120214332553](张博凯的Java学习笔记.assets/image-20220120214332553.png) >**[注意]** > >1.如果控制器方法中接收数据的参数名与请求过来的参数名称一致,则 `@RequestParam("")` 注解可以省略 > >如上述例子中的 > >```java >public void addUser(@RequestParam("bookName") String bookName, @RequestParam("author") String author, @RequestParam("price") String price) >``` > >就可以写为 > >```java >public void addUser(String bookName, String author, String price) >``` > >2.当页面传递过来的参数名称与实体类的属性名一一对应,那么控制器方法可以直接通过对象接收 > >例如: > >src/main/java/org/example/web/UserController.java > >```java > @RequestMapping("/add") > public void addUser(Book book) { > System.out.println(book.getBookName()); > System.out.println(book.getAuthor()); > System.out.println(book.getPrice()); > } >``` > >src/main/java/org/example/entity/Book.java > >```java >public class Book { > private int bookId; > private String bookName; > private String author; > private double price; > // ... 此处省略 Getter 和 Setter >} >``` > >测试结果相同 ##### 控制器响应前端请求 > form表单/超链接请求跳转页面 src/main/webapp/index.jsp ```html 提交 ``` src/main/webapp/success.jsp ```html

成功页面

``` ###### 转发(返回类型为String) src/main/java/org/example/web/UserController.java ```java @RequestMapping("/add") public String addUser(Book book) { return "/success.jsp"; // 或者 return "forward:/success.jsp"; } ``` ![image-20220120220526068](张博凯的Java学习笔记.assets/image-20220120220526068.png) ###### 重定向(返回类型为String) src/main/java/org/example/web/UserController.java ```java @RequestMapping("/add") public String addUser(Book book) { return "redirect:/success.jsp"; // 重定向 } ``` ![image-20220120222121539](张博凯的Java学习笔记.assets/image-20220120222121539.png) ###### 转发(返回类型为ModelAndView) src/main/java/org/example/web/UserController.java ```java @RequestMapping("/add") public String addUser(Book book) { ModelAndView modelAndView = new ModelAndView("/success.jsp"); // 或者 "forward:/success.jsp" return modelAndView; } ``` ![image-20220120220526068](张博凯的Java学习笔记.assets/image-20220120220526068.png) ###### 重定向(返回类型为ModelAndView) src/main/java/org/example/web/UserController.java ```java @RequestMapping("/add") public String addUser(Book book) { ModelAndView modelAndView = new ModelAndView("redirect:/success.jsp"); return modelAndView; } ``` ![image-20220120222121539](张博凯的Java学习笔记.assets/image-20220120222121539.png) #### Thymeleaf > 模板引擎 ##### 介绍 >**Thymeleaf**是一个现代的服务器端 Java 模板引擎,适用于 Web 和独立环境。 > >Thymeleaf 的主要目标是为您的开发工作流程带来优雅*的自然模板*——**HTML可以在浏览器中正确显示**,也可以用作静态原型,从而在开发团队中实现更强大的协作。 > >Thymeleaf 是现代 HTML5 JVM Web 开发的理想选择 ###### 官网 https://www.thymeleaf.org/ ##### 导入依赖 ###### 导入thymeleaf依赖 https://mvnrepository.com/artifact/org.thymeleaf/thymeleaf/3.0.14.RELEASE ```xml org.thymeleaf thymeleaf 3.0.14.RELEASE ``` ###### 导入thymeleaf-spring4依赖 https://mvnrepository.com/artifact/org.thymeleaf/thymeleaf-spring4/3.0.14.RELEASE ```xml org.thymeleaf thymeleaf-spring4 3.0.14.RELEASE ``` ##### 编写SpringMVC的核心配置文件 src/main/resources/spring-servlet.xml ```xml ``` ##### 在web.xml中配置首页启动项 src/main/webapp/WEB-INF/web.xml ```xml /WEB-INF/templates/login.html springmvc org.springframework.web.servlet.DispatcherServlet contextConfigLocation classpath:spring-servlet.xml springmvc / ``` ##### Thymeleaf的使用 ###### 启动 一般thymeleaf的模板 放在WEB-INF下面 src/main/webapp/WEB-INF/templates/login.html ```html Title

thymeleaf

``` ![image-20220120231646089](张博凯的Java学习笔记.assets/image-20220120231646089.png) ###### 运用 src/main/webapp/WEB-INF/templates/login.html ```html Title

图书管理系统

图书名称:

图书作者:

图书价格:

``` src/main/webapp/WEB-INF/templates/success.html ```html Title

图书管理系统

图书名称:

图书作者:

图书价格:

``` ![image-20220120232421282](张博凯的Java学习笔记.assets/image-20220120232421282.png) ![image-20220120232442818](张博凯的Java学习笔记.assets/image-20220120232442818.png) ##### 语法 > Thymeleaf的主要作用是把model中的数据渲染到HTML中,因此语法主要是如何解析model中的数据 > Thymeleaf使用的是OGNL表达式(Object Graph Notation Language) > > JSP中使用的是JSTL表达式(JSP Standard Tag Library)、el表达式(Expressiong Language) ###### 变量(基本类型:String、int、...) 控制器代码 src/main/java/org/example/web/UserController.java ```java @RequestMapping("/add") public String addUser(Book book, Model model) { // 把书籍名称存储起来 model.addAttribute("name",book.getBookName()); return "success"; } ``` 页面获取 通过 `tx:next=${控制器传递过来的参数}` 显示文本内容 ```html ``` ###### 对象 控制器代码 src/main/java/org/example/web/UserController.java ```java @RequestMapping("/add") public String addUser(Book book, Model model) { // 把书籍名称存储起来 model.addAttribute("book",book); return "success"; } ``` 页面获取 通过 `tx:next=${控制器传递过来的参数}` 显示文本内容 ```html ``` ###### 拼接 > 字符串 ```html ``` ###### 运算 > `${}` 内部是通过OGNL表达式 引擎解析的,外部的才是通过Thymeleaf的引擎解析的,因此运算符尽量放在 `${}` 之外 #### SpringMVC字符集编码设置 ##### SpringMVC解决中文乱码问题 ###### 前端编码 HTML页面 ```html ``` jsp页面 ```jsp <%@ page contentType="text/html;charset=UTF-8" language="java" %> ``` ###### 服务器编码 tomcat/conf/server.xml ```xml ``` ###### 设置SpringMVC过滤器 在web.xml中配置编码过滤器的方式 ```xml EncodingFilter org.springframework.web.filter.CharacterEncodingFilter encoding utf-8 EncodingFilter /* ``` ### SSM框架整合 > MyBatis、Spring、SpringMVC三个框架整合 [创建Mavenweb项目](#创建Mavenweb项目) #### 导入依赖 ##### 需要导入的依赖 数据库:[MyBatis](#mybatis依赖)、[MySQL](#mysql依赖)、[MyBatis Spring](#MyBatis_Spring依赖) 单元测试:[JUnit](#junit依赖) 实体类:[Lombok](#Lombok依赖) 数据源:[Druid](#Druid依赖) Spring:[Spring](#spring依赖)、[Spring JDBC](#SpringJDBC依赖)、[Spring Web MVC](#springwebmvc依赖) 页面:[Thymeleaf](#thymeleaf依赖)、[Thymeleaf Spring4](#thymeleaf-spring4依赖) 日志:[log4j](#log4j依赖)、[commons-logging](#commons-logging依赖)、[slf4j-log4j12](#slf4j-log4j12依赖) ##### 如下 ```xml 4.0.0 org.example ssm 1.0-SNAPSHOT war org.mybatis mybatis 3.5.9 org.mybatis mybatis-spring 2.0.6 mysql mysql-connector-java 5.1.49 junit junit 4.12 test org.projectlombok lombok 1.18.22 provided com.alibaba druid 1.2.8 org.springframework spring-context 5.2.19.RELEASE org.springframework spring-jdbc 5.2.19.RELEASE org.springframework spring-webmvc 5.2.19.RELEASE org.thymeleaf thymeleaf 3.0.14.RELEASE org.thymeleaf thymeleaf-spring4 3.0.14.RELEASE log4j log4j 1.2.17 commons-logging commons-logging 1.2 org.slf4j slf4j-log4j12 1.7.25 test ``` #### 编写数据库配置文件 在resources目录下创建db.properties文件 src/main/resources/db.properties ```properties driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/mydb?characterEncoding=utf-8 username=root password=111111 ``` #### 编写Spring核心配置文件 在resources目录下创建db.properties文件 ## 提升 ### 前后端分离 Springboot + Vue ### 微服务(架构师) Spring Cloud + ES + Redis