diff --git "a/51 \347\250\213\350\210\234/20231219.md" "b/51 \347\250\213\350\210\234/20231219.md" new file mode 100644 index 0000000000000000000000000000000000000000..9f1cfc79b3b78d55dd33d74d0f3e1d5d9e16ac01 --- /dev/null +++ "b/51 \347\250\213\350\210\234/20231219.md" @@ -0,0 +1,98 @@ +## 笔记 + +### Maven + +~~~ md +Maven是专门用于管理和构建Java项目的工具,它的主要功能有: + +提供了一套标准化的项目结构 + +提供了一套标准化的构建流程(编译,测试,打包,发布……) + +提供了一套依赖管理机制 + + +仓库分类: +本地仓库:自己计算机上的一个目录 + +中央仓库:由Maven团队维护的全球唯一的仓库 + +地址: https://repo1.maven.org/maven2/ + +远程仓库(私服):一般由公司团队搭建的私有仓库,国内镜像也是远程仓库的一种 +当项目中使用坐标引入对应依赖jar包后,首先会查找本地仓库中是否有对应的jar +包: +如果有,则在项目直接引用; + +如果没有,则去中央仓库中下载对应的jar包到本地仓库。 + + +Maven 坐标详解 + +什么是坐标? +Maven 中的坐标是==资源的唯一标识== +使用坐标来定义项目或引入项目中需要的依赖 + +Maven 坐标主要组成 +groupId:定义当前Maven项目隶属组织名称(通常是域名反写,例如: +com.mdd) +artifactId:定义当前Maven项目名称(通常是模块名称,例如 order-service、 +goods-service) +version:定义当前项目版本号 + + +使用坐标引入jar包 +使用坐标引入jar包的步骤: + +在项目的 pom.xml 中编写 标签 +在 标签中 使用 引入坐标 +定义坐标的 groupId,artifactId,version +点击刷新按钮,使坐标生效 + + +依赖范围 +通过设置坐标的依赖范围(scope),可以设置 对应jar包的作用范围:编译环境、测试 +环境、运行环境。 +如下图所示给 junit 依赖通过 scope 标签指定依赖的作用范围。 那么这个依赖就 +只能作用在测试环境,其他环境下不能使用。 + +compile :作用于编译环境、测试环境、运行环境。 +test : 作用于测试环境。典型的就是Junit坐标,以后使用Junit时,都会将scope +指定为该值 +provided :作用于编译环境、测试环境。我们后面会学习 servlet-api ,在使 +用它时,必须将 scope 设置为该值,不然运行时就会报错 +runtime : 作用于测试环境、运行环境。jdbc驱动一般将 scope 设置为该值, +当然不设置也没有任何问题 +注意: +如果引入坐标不指定 scope 标签时,默认就是 compile 值。以后大部分 +jar包都是使用默认值。 +~~~ + +## 作业 + +~~~ java + + + junit + junit + 4.13.2 + test + + +~~~ + +~~~ java +import org.junit.Test; + +public class APP { + @Test + public void test01(){ + System.out.println(999); + } + @Test + public void test02(){ + System.out.println("吃饭了吗"); + } +} + +~~~ \ No newline at end of file diff --git "a/51 \347\250\213\350\210\234/20231220.md" "b/51 \347\250\213\350\210\234/20231220.md" new file mode 100644 index 0000000000000000000000000000000000000000..7e3fabda68cca047f250d538bb7d97af354106ff --- /dev/null +++ "b/51 \347\250\213\350\210\234/20231220.md" @@ -0,0 +1,315 @@ +## Mybatis 第2版(Mapper代理方式) + +**可做优化:** + +1. 设置别名 + +2. 参数写到专属文件,解除硬编码【写死在源代码中,而源代码有所改动,就要重新编译,测试,打包,整个流程,耦合度太高,好比把电池焊死在手机主板上了,不方便换电池,而且只能用专用品牌的电池,解耦,或解除硬编码编程方式,就好比可以随意换电池的玩具,只认型号,不认品牌,只要是5号电池就可以用。】 + +### 总结 + +使用Mapper代理方式,必须满足以下要求: + +1. 定义与SQL映射文件同名的Mapper接口, +2. 在 Mapper 接口中定义方法,方法名就是SQL映射文件中sql语句的id,并保持参数类型和返回值类型一致 +3. 设置SQL映射文件的namespace属性为Mapper接口全限定名 +4. 核心配置文件中的mapper路径要根据sql映射文件的实际路径改变(具体文件或包扫描) +5. 执行sql的方法改成getMapper()的方法 + +### 例题: + +**1.** **创建 brand 表,添加数据** + +~~~ mysql +-- 删除tb_brand表 +drop table if exists tb_brand; +-- 创建tb_brand表 +create table tb_brand( + id int primary key auto_increment, -- id 主键 + brand_name varchar(20), -- 品牌名称 + company_name varchar(20), -- 企业名称 + ordered int, -- 排序字段 + description varchar(100), -- 描述信息 + status int -- 状态:0:禁用 1:启用 +); +-- 添加数据 +insert into tb_brand (brand_name, company_name, ordered, description, status) +values ('三只松鼠', '三只松鼠股份有限公司', 5, '好吃不上火', 0), + ('华为', '华为技术有限公司', 100, '华为致力于把数字世界带入每个人、每个家庭、每个组织,构建万物互联的智能世界', 1), + ('小米', '小米科技有限公司', 50, 'are you ok', 1); + +SELECT * FROM tb_brand; +~~~ + +**2.** **创建模块,根据数据表,编写对应的 java 类** + +在 com.mdd.pojo 包下创建 User类 + +~~~ java +package com.mdd.pojo; + +/** + * 品牌 + * + * alt + 鼠标左键:整列编辑 + * + * 在实体类中,基本数据类型建议使用其对应的包装类型 + */ + +public class Brand { + // id 主键 + private Integer id; + // 品牌名称 + private String brandName; + // 企业名称 + private String companyName; + // 排序字段 + private Integer ordered; + // 描述信息 + private String description; + // 状态:0:禁用 1:启用 + private Integer status; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public String getCompanyName() { + return companyName; + } + + public void setCompanyName(String companyName) { + this.companyName = companyName; + } + + public Integer getOrdered() { + return ordered; + } + + public void setOrdered(Integer ordered) { + this.ordered = ordered; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + @Override + public String toString() { + return "Brand{" + + "id=" + id + + ", brandName='" + brandName + '\'' + + ", companyName='" + companyName + '\'' + + ", ordered=" + ordered + + ", description='" + description + '\'' + + ", status=" + status + + '}'; + } +} +~~~ + +**3.** **导入坐标** + +在创建好的模块中的 pom.xml 配置文件中添加依赖的坐标 + +~~~ xml + + + 4.0.0 + + com.mdd + mybatis_02 + 1.0-SNAPSHOT + + + 17 + 17 + UTF-8 + + + + + + com.mysql + mysql-connector-j + 8.1.0 + + + + org.mybatis + mybatis + 3.5.13 + + + + junit + junit + 4.13.2 + test + + + + +~~~ + +**4.** **编写 MyBatis 核心配置文件 - > 替换连接信息** + +在模块下的 resources 目录下创建mybatis的配置文件 mybatis-config.xml ,内容如下: + +~~~ xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +~~~ + +**5. 编写 SQL 映射文件 —> 统一管理 sql 语句,在resources下创建与代理商文件路径相同** + +将sql映射文件(改成与mapper接口同名)移动到该目录,并将namespace属性为Mapper接口完整路径(引用) + +~~~ xml + + + + + + + + + + + + + + + + +~~~ + +**6.定义与 SQL 映射文件同名的 Mapper 接口** + +~~~ java +package com.mdd.mapper; + +import com.mdd.pojo.Brand; + +import java.util.List; + +public interface BrandMapper { + // 方法名就是SQL映射文件中sql语句的id,并保持返回值类型一致 + // 查询所有 + List selectAll(); + // 按照id查询 + Brand selectById(Integer id); + // 查询id大于某个值的 + List selectAllById(Integer id); +} +~~~ + +**7. 编写测试类** + +~~~ java +package com.mdd; + +import com.mdd.mapper.BrandMapper; +import com.mdd.pojo.Brand; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.junit.Test; + +import java.io.IOException; +import java.util.List; + +public class TestBrand { + @Test + public void selectAll() throws IOException { + //1. 加载mybatis的核心配置文件,获取 sqlSession 对象 + SqlSession sqlSession = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml")).openSession(); + //2. 获取UserMapper接口的代理对象,执行SQL语句 + BrandMapper mapper = sqlSession.getMapper(BrandMapper.class); + // 查询所有 + List brands = mapper.selectAll(); + System.out.println(brands); + + // 指定id查询 + Brand brand = mapper.selectById(1); + System.out.println(brand); + + // 查询id大于某个值的 + List list = mapper.selectAllById(1); + System.out.println(list); + + //3. 释放资源 + sqlSession.close(); + } +} +~~~ \ No newline at end of file diff --git "a/51 \347\250\213\350\210\234/20231221.md" "b/51 \347\250\213\350\210\234/20231221.md" new file mode 100644 index 0000000000000000000000000000000000000000..7e3fabda68cca047f250d538bb7d97af354106ff --- /dev/null +++ "b/51 \347\250\213\350\210\234/20231221.md" @@ -0,0 +1,315 @@ +## Mybatis 第2版(Mapper代理方式) + +**可做优化:** + +1. 设置别名 + +2. 参数写到专属文件,解除硬编码【写死在源代码中,而源代码有所改动,就要重新编译,测试,打包,整个流程,耦合度太高,好比把电池焊死在手机主板上了,不方便换电池,而且只能用专用品牌的电池,解耦,或解除硬编码编程方式,就好比可以随意换电池的玩具,只认型号,不认品牌,只要是5号电池就可以用。】 + +### 总结 + +使用Mapper代理方式,必须满足以下要求: + +1. 定义与SQL映射文件同名的Mapper接口, +2. 在 Mapper 接口中定义方法,方法名就是SQL映射文件中sql语句的id,并保持参数类型和返回值类型一致 +3. 设置SQL映射文件的namespace属性为Mapper接口全限定名 +4. 核心配置文件中的mapper路径要根据sql映射文件的实际路径改变(具体文件或包扫描) +5. 执行sql的方法改成getMapper()的方法 + +### 例题: + +**1.** **创建 brand 表,添加数据** + +~~~ mysql +-- 删除tb_brand表 +drop table if exists tb_brand; +-- 创建tb_brand表 +create table tb_brand( + id int primary key auto_increment, -- id 主键 + brand_name varchar(20), -- 品牌名称 + company_name varchar(20), -- 企业名称 + ordered int, -- 排序字段 + description varchar(100), -- 描述信息 + status int -- 状态:0:禁用 1:启用 +); +-- 添加数据 +insert into tb_brand (brand_name, company_name, ordered, description, status) +values ('三只松鼠', '三只松鼠股份有限公司', 5, '好吃不上火', 0), + ('华为', '华为技术有限公司', 100, '华为致力于把数字世界带入每个人、每个家庭、每个组织,构建万物互联的智能世界', 1), + ('小米', '小米科技有限公司', 50, 'are you ok', 1); + +SELECT * FROM tb_brand; +~~~ + +**2.** **创建模块,根据数据表,编写对应的 java 类** + +在 com.mdd.pojo 包下创建 User类 + +~~~ java +package com.mdd.pojo; + +/** + * 品牌 + * + * alt + 鼠标左键:整列编辑 + * + * 在实体类中,基本数据类型建议使用其对应的包装类型 + */ + +public class Brand { + // id 主键 + private Integer id; + // 品牌名称 + private String brandName; + // 企业名称 + private String companyName; + // 排序字段 + private Integer ordered; + // 描述信息 + private String description; + // 状态:0:禁用 1:启用 + private Integer status; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getBrandName() { + return brandName; + } + + public void setBrandName(String brandName) { + this.brandName = brandName; + } + + public String getCompanyName() { + return companyName; + } + + public void setCompanyName(String companyName) { + this.companyName = companyName; + } + + public Integer getOrdered() { + return ordered; + } + + public void setOrdered(Integer ordered) { + this.ordered = ordered; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + @Override + public String toString() { + return "Brand{" + + "id=" + id + + ", brandName='" + brandName + '\'' + + ", companyName='" + companyName + '\'' + + ", ordered=" + ordered + + ", description='" + description + '\'' + + ", status=" + status + + '}'; + } +} +~~~ + +**3.** **导入坐标** + +在创建好的模块中的 pom.xml 配置文件中添加依赖的坐标 + +~~~ xml + + + 4.0.0 + + com.mdd + mybatis_02 + 1.0-SNAPSHOT + + + 17 + 17 + UTF-8 + + + + + + com.mysql + mysql-connector-j + 8.1.0 + + + + org.mybatis + mybatis + 3.5.13 + + + + junit + junit + 4.13.2 + test + + + + +~~~ + +**4.** **编写 MyBatis 核心配置文件 - > 替换连接信息** + +在模块下的 resources 目录下创建mybatis的配置文件 mybatis-config.xml ,内容如下: + +~~~ xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +~~~ + +**5. 编写 SQL 映射文件 —> 统一管理 sql 语句,在resources下创建与代理商文件路径相同** + +将sql映射文件(改成与mapper接口同名)移动到该目录,并将namespace属性为Mapper接口完整路径(引用) + +~~~ xml + + + + + + + + + + + + + + + + +~~~ + +**6.定义与 SQL 映射文件同名的 Mapper 接口** + +~~~ java +package com.mdd.mapper; + +import com.mdd.pojo.Brand; + +import java.util.List; + +public interface BrandMapper { + // 方法名就是SQL映射文件中sql语句的id,并保持返回值类型一致 + // 查询所有 + List selectAll(); + // 按照id查询 + Brand selectById(Integer id); + // 查询id大于某个值的 + List selectAllById(Integer id); +} +~~~ + +**7. 编写测试类** + +~~~ java +package com.mdd; + +import com.mdd.mapper.BrandMapper; +import com.mdd.pojo.Brand; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.junit.Test; + +import java.io.IOException; +import java.util.List; + +public class TestBrand { + @Test + public void selectAll() throws IOException { + //1. 加载mybatis的核心配置文件,获取 sqlSession 对象 + SqlSession sqlSession = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml")).openSession(); + //2. 获取UserMapper接口的代理对象,执行SQL语句 + BrandMapper mapper = sqlSession.getMapper(BrandMapper.class); + // 查询所有 + List brands = mapper.selectAll(); + System.out.println(brands); + + // 指定id查询 + Brand brand = mapper.selectById(1); + System.out.println(brand); + + // 查询id大于某个值的 + List list = mapper.selectAllById(1); + System.out.println(list); + + //3. 释放资源 + sqlSession.close(); + } +} +~~~ \ No newline at end of file