diff --git a/张博凯的Java学习笔记.md b/张博凯的Java学习笔记.md index 11fca10..1339caa 100644 --- a/张博凯的Java学习笔记.md +++ b/张博凯的Java学习笔记.md @@ -501,6 +501,80 @@ pom.xml中添加 `war` ,如下: +#### 创建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) + + + ### 连接数据库 ##### IDEA连接MySQL @@ -793,7 +867,9 @@ redis 首先创建Maven项目(Maven普通或Mavenweb) -添加Maven依赖(目前官网最新版是3.5.9) + + +添加mybatis依赖(目前官网最新版是3.5.9) https://mvnrepository.com/artifact/org.mybatis/mybatis @@ -1156,10 +1232,12 @@ src/main/resources/mybatis-config.xml ##### 单元测试 -> junit单元测试 +> JUnit单元测试 ###### 添加单元测试的依赖 + + https://mvnrepository.com/artifact/junit/junit/4.12 ```xml @@ -1543,6 +1621,8 @@ https://mvnrepository.com/artifact/log4j/log4j/1.2.17 ##### 导入log4j.propertites文件 + [log4j.properties](张博凯的Java学习笔记.assets\file\log4j.properties) + src/main/resources/log4j.properties ``` @@ -1732,9 +1812,9 @@ src/main/resources/mappers/UserMapper.xml > > ```xml > -> -> -> +> +> +> > > ``` @@ -1898,10 +1978,10 @@ src/main/resources/mappers/ClassesMapper.xml > > ```xml > -> -> -> -> +> +> +> +> > > ``` @@ -2039,10 +2119,10 @@ src/main/resources/mappers/StudentMapper.xml > > ```xml > -> -> -> -> +> +> +> +> > > ``` @@ -2073,9 +2153,9 @@ for(Student student:students) { > # 三张表联合查询 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 +> 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 +> select * from student s,grades g,course c where s.sid=g.sid and g.course_id=c.course_id; > ``` ###### 数据库表设计 @@ -2112,12 +2192,383 @@ CREATE TABLE `grades` ( ) 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框架 @@ -2125,6 +2576,956 @@ CREATE TABLE `grades` ( > 胶水框架(主要跟其他框架结合) > > 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); + } + } +} +``` + +运行结果 + +![image-20220120005858883](张博凯的Java学习笔记.assets/image-20220120005858883.png)