diff --git "a/08 \345\256\230\346\226\207\350\257\232/20231219 Maven\347\254\224\350\256\260.md" "b/08 \345\256\230\346\226\207\350\257\232/20231219 Maven\347\254\224\350\256\260.md" new file mode 100644 index 0000000000000000000000000000000000000000..0d531b85e37dafd8c94730779d4814105985fc1a --- /dev/null +++ "b/08 \345\256\230\346\226\207\350\257\232/20231219 Maven\347\254\224\350\256\260.md" @@ -0,0 +1,93 @@ +## 笔记 + +### Maven + +``` +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 + + +import org.junit.Test; + +public class APP { + @Test + public void test01(){ + System.out.println(999); + } + @Test + public void test02(){ + System.out.println("11111"); + } +} \ No newline at end of file diff --git "a/08 \345\256\230\346\226\207\350\257\232/20231220 Mybatis\347\254\224\350\256\260.md" "b/08 \345\256\230\346\226\207\350\257\232/20231220 Mybatis\347\254\224\350\256\260.md" new file mode 100644 index 0000000000000000000000000000000000000000..75fd67946efa24b871caa51fecd96981d5209c61 --- /dev/null +++ "b/08 \345\256\230\346\226\207\350\257\232/20231220 Mybatis\347\254\224\350\256\260.md" @@ -0,0 +1,222 @@ +## 笔记 + +### Mybatis 概念 + +- MyBatis 是一款优秀的==持久层框架==,用于简化 JDBC 开发 + +- MyBatis 本是 Apache 的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github + +- 官网:https://mybatis.org/mybatis-3/zh/index.html + +**持久层:** + +- 负责将数据到保存到数据库的那一层代码。以后开发我们会将操作数据库的Java代码作为持久层。而Mybatis就是对jdbc代码进行了封装。 + +- JavaEE三层架构:表现层、业务层、持久层 + +三层架构在后期会给大家进行讲解,今天先简单的了解下即可。 + +**框架:** + +- 框架就是一个半成品软件,是一套可重用的、通用的、软件基础代码模型 + +- 在框架的基础之上构建软件编写更加高效、规范、通用、可扩展 + +### **JDBC** 缺点 + +- 硬编码,耦合度高(注册驱动、获取连接、SQL语句,不方便后期维护) + +- 操作繁琐(手动设置参数,手动封装结果集,没有什么技术含量,而且特别耗费时间的) + +### Mybatis 优化 + +- 硬编码可以配置到==配置文件== + +- 操作繁琐的地方mybatis都==自动完成== + +### 几个概念: + +1. 文档官网:https://mybatis.org/mybatis-3/zh_CN/index.html 或 http://mybatis.net.cn + +2. 核心配置文件:mybatis-config.xml + +3. SQL 映射文件:xxMapper.xml --> 统一管理sql语句,解决硬编码问题 + + + +## 作业 + +#### 导入坐标 + +~~~xml + + + + com.mysql + mysql-connector-j + 8.1.0 + + + + org.mybatis + mybatis + 3.5.13 + + + + junit + junit + 4.13.2 + test + + + +~~~ + +#### 编写 MyBatis 核心配置文件 -- > 替换连接信息 + +~~~ xml + + + + + + + + + + + + + + + + + + + + +~~~ + +#### 编写 SQL 映射文件 --> 统一管理sql语句 + +~~~ xml + + + + + + + + insert into db_user(name,age,gender) value(#{name},#{age},#{gender}) + + + + delete from db_user where id = #{id} + + + + update db_user set name = #{name},age = #{age},gender = #{gender} where id = #{id} + + +~~~ + +#### 编写测试类 + +~~~ java +package com.mdd; + +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.junit.Test; + +import java.io.IOException; +import java.io.InputStream; +import java.util.List; + +public class TestUser { + + private SqlSessionFactory getSqlSessionFactory() throws IOException { + String resource = "mybatis-config.xml"; + InputStream inputStream = Resources.getResourceAsStream(resource); + SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); + return sqlSessionFactory; + } + + @Test + public void testSelectAll() throws IOException { + // 获取 sqlSessionFactory 对象 + SqlSessionFactory sqlSessionFactory = getSqlSessionFactory(); + // 获取执行 sql 的对象 + SqlSession sqlSession = sqlSessionFactory.openSession(true); + List list = sqlSession.selectList("test.selectAll"); + + System.out.println(list); + // 释放资源 + sqlSession.close(); + + } + + // 增 + @Test + public void testInsert() throws IOException { + // 获取 sqlSessionFactory 对象 + SqlSessionFactory sqlSessionFactory = getSqlSessionFactory(); + // 获取执行 sql 的对象 + SqlSession sqlSession = sqlSessionFactory.openSession(true); + // 创建一个对象 + User user = new User(); + user.setName("老八"); + user.setAge(18); + user.setGender("男"); + + sqlSession.insert("test.insert",user); + System.out.println("添加成功!"); + // 释放资源 + sqlSession.close(); + + } + + // 删 + @Test + public void testDelete() throws IOException { + // 获取 sqlSessionFactory 对象 + SqlSessionFactory sqlSessionFactory = getSqlSessionFactory(); + // 获取执行 sql 的对象 + SqlSession sqlSession = sqlSessionFactory.openSession(true); + + sqlSession.delete("test.delete",5); + System.out.println("删除成功!"); + // 释放资源 + sqlSession.close(); + } + + // 改 + @Test + public void testUpdate() throws IOException { + // 获取 sqlSessionFactory 对象 + SqlSessionFactory sqlSessionFactory = getSqlSessionFactory(); + // 获取执行 sql 的对象 + SqlSession sqlSession = sqlSessionFactory.openSession(true); + + // 创建一个对象 + User user = new User(); + user.setId(6); + user.setName("小七"); + user.setAge(20); + user.setGender("女"); + + sqlSession.delete("test.update",user); + System.out.println("修改成功!"); + // 释放资源 + sqlSession.close(); + } +} \ No newline at end of file diff --git "a/08 \345\256\230\346\226\207\350\257\232/20231225 Mybatis\345\242\236\345\210\240\346\224\271\346\237\245.md" "b/08 \345\256\230\346\226\207\350\257\232/20231225 Mybatis\345\242\236\345\210\240\346\224\271\346\237\245.md" new file mode 100644 index 0000000000000000000000000000000000000000..19da4a74aac151cd665259a5553477df50bbc4b5 --- /dev/null +++ "b/08 \345\256\230\346\226\207\350\257\232/20231225 Mybatis\345\242\236\345\210\240\346\224\271\346\237\245.md" @@ -0,0 +1,486 @@ +### 笔记 + +使用Mapper代理方式,必须满足以下要求: +1.定义与SQL映射文件同名的Mapper接口, +2.在 Mapper 接口中定义方法,方法名就是SQL映射文件中sql语句的id,并保持 +参数类型和返回值类型一致 + +# 作业 + +创建实体类 + +```java +public class User { + private Integer id; + private String username; + private String password; + private String email; + private String phone; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public User() { + } + + public User(Integer id, String username, String password, String email, String phone) { + this.id = id; + this.username = username; + this.password = password; + this.email = email; + this.phone = phone; + } + @Override + public String toString() { + return "User{" + + "id=" + id + + ", username='" + username + '\'' + + ", password='" + password + '\'' + + ", email='" + email + '\'' + + ", phone='" + phone + '\'' + + '}'; + } + +} + + +``` + +创建maven项目 + +```java + + + 4.0.0 + + org.example + mybatis + 1.0-SNAPSHOT + + + UTF-8 + 1.9 + 1.9 + + + + + + junit + junit + 4.11 + test + + + + mysql + mysql-connector-java + 8.0.19 + + + + org.mybatis + mybatis + 3.5.4 + + + + org.junit.jupiter + junit-jupiter + RELEASE + compile + + + + + + + + + + + src/main/java + + **/*.properties + **/*.xml + + false + + + + + + +``` + +mybatis配置文件 + +```java + + + + + + + +--> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +``` + +mybatis工具类 + +```java +public class MyBatisUtils { + + private static SqlSessionFactory factory = null; + + static { + //读取mybatis.xml配置文件 + String config="mybatis.xml"; + try { + //将配置文件加入到流中 + InputStream in = Resources.getResourceAsStream(config); + //创建factory对象 + factory = new SqlSessionFactoryBuilder().build(in); + + } catch (IOException e) { + e.printStackTrace(); + } + + + } + public static SqlSession getSqlSession(){ + SqlSession sqlSession = null; + if (factory!=null){ + //如果 factory!=null 就创建 sqlSession对象 + sqlSession = factory.openSession(false);//非自动提交事务 + } + + return sqlSession; + } +} + +``` + +接口 + +```java +public interface UserManagerDao { + + /** + * 查询所有的数据 用于视图展示 + * @return 返回一个List集合 + */ + public List queryUser(); + + + /** + * 添加 + * @param user 一个user对象 + * @return 成功返回true 失败返回false + */ + public Boolean addUser(User user); + + /** + * 删除用户 + * @param id 需要删除的用户id + * @return 成功返回true 失败返回false + */ + public Boolean delUser(String id); + + /** + * 修改用户信息 + * @param user 需要一个user对象 + * @return 成功返回true 失败返回false + */ + public Boolean updateUser(User user); + + /** + * 按照用户名查找用户 + * @param name 需要查找的用户名 + * @return 返回一个List集合 + */ + public List likeUser(String name); + + + +} + +``` + +xml文件 + +```java + + + + + + + + + + insert into t_user values(#{id},#{username},#{username},#{email},#{phone}) + + + + delete from t_user where id=#{id} + + + + update t_user set username=#{username},password=#{password},email=#{email},phone=#{phone} where id=#{id} + + + + +``` + +daoImpl + +```java + +public class UserManagerDaoImpl implements UserManagerDao { + + /** + * 查询所有的数据 用于视图展示 + * + * @return 返回一个List集合 + */ + @Override + public List queryUser() { + //获取sqlSession对象 + SqlSession sqlSession = MyBatisUtils.getSqlSession(); + String sqlId = "com.mybatis.dao.UserManagerDao.queryUser"; + //执行sql语句 + List userList = sqlSession.selectList(sqlId); + // sqlSession.commit(); //mybatis默认不会手动提交事务,在修改数据之后要 提交事务 + //关闭连接 + sqlSession.close(); + return userList; + } + + + /** + * 添加 + * + * @param user 一个user对象 + * @return 成功返回true 失败返回false + */ + @Override + public Boolean addUser(User user) { + //获取sqlSession对象 + SqlSession sqlSession = MyBatisUtils.getSqlSession(); + String sqlId = "com.mybatis.dao.UserManagerDao.addUser"; + //执行sql语句 + int updateCount = sqlSession.update(sqlId,user); + sqlSession.commit(); //mybatis默认不会手动提交事务,在修改数据之后要 提交事务 + //关闭连接 + sqlSession.close(); + if(updateCount>0){ + return true; + }else{ + return false; + } + + } + + /** + * 删除用户 + * + * @param id 需要删除的用户id + * @return 成功返回true 失败返回false + */ + @Override + public Boolean delUser(String id) { + //获取sqlSession对象 + SqlSession sqlSession = MyBatisUtils.getSqlSession(); + String sqlId = "com.mybatis.dao.UserManagerDao.delUser"; + //执行sql语句 + int delete = sqlSession.delete(sqlId, id); + sqlSession.commit(); //设置为自动提交事务 + //关闭连接 + sqlSession.close(); + if(delete>0){ + return true; + }else { + return false; + } + + } + + /** + * 修改用户信息 + * + * @param user 需要一个user对象 + * @return 成功返回true 失败返回false + */ + @Override + public Boolean updateUser(User user) { + //获取sqlSession对象 + SqlSession sqlSession = MyBatisUtils.getSqlSession(); + String sqlId = "com.mybatis.dao.UserManagerDao.updateUser"; + //执行sql语句 + int updateCount = sqlSession.update(sqlId,user); + sqlSession.commit(); //设置为自动提交事务 + //关闭连接 + sqlSession.close(); + if(updateCount>0){ + return true; + }else { + return false; + } + + } + + /** + * 按照用户名查找用户 + * + * @param name 需要查找的用户名 + * @return 返回一个List集合 + */ + @Override + public List likeUser(String name) { + SqlSession sqlSession = MyBatisUtils.getSqlSession(); + String sqlId = "com.mybatis.dao.UserManagerDao.likeUser"; + List userList = sqlSession.selectList(sqlId, name); + sqlSession.commit(); + //关闭连接 + sqlSession.close(); + return userList; + } +} + +``` + +Test类 + +``` + +```java +class UserManagerDaoImplTest { + + UserManagerDaoImpl userManagerDao = new UserManagerDaoImpl(); + + @Test + void queryUser() { + List userList = userManagerDao.queryUser(); + for (User user : userList) { + System.out.println(user); + } + } + @Test + void ListUser() { + + SqlSession sqlSession = MyBatisUtils.getSqlSession(); + UserManagerDao userDao = sqlSession.getMapper(UserManagerDao.class); + List userList = userDao.queryUser(); + for (User user : userList) { + System.out.println(user); + } + } + + @Test + void addUser() { + User user = new User(null,"admin","root","root@qq.com","1008644"); + Boolean flag = userManagerDao.addUser(user); + System.out.println(flag); + + } + + @Test + void delUser() { + Boolean flag = userManagerDao.delUser("23"); + System.out.println(flag); + } + + @Test + void updateUser() { + User user = new User(19,"admin2","root2","root@qq.com2","1008644"); + Boolean flag = userManagerDao.updateUser(user); + System.out.println(flag); + } + + @Test + void likeUser() { + List userList = userManagerDao.likeUser("admin"); + for (User user : userList) { + System.out.println(user); + } + } +}