6月15日笔记
SQLyog在安装时电脑的名不能是中文名不然会在Initializing database这部出错
1.微头条功能
登录 注册 发布 浏览 点赞 删除(用户)
2.全栈:前端 后端 数据库
3.JDBC 数据库连接
4.MySQL安装、建表、JDBC连接与注册功能-实现记录一、教学目标
- 安装MySQL,创建数据库和
user表。 - 使用JDBC连接数据库,实现用户注册(
PreparedStatement防止SQL注入)。
核心知识点(简要)
- JDBC:Java连接数据库的标准API。
- PreparedStatement:预编译SQL,防止注入,使用
?占位符。 - DriverManager:获取
Connection对象。 - executeUpdate():执行INSERT/UPDATE/DELETE,返回影响行数。
操作步骤
1.创建数据库和表
-
在
SQLyog左侧空白位置右键,新建数据库,名字叫:weitoutiao -
再新建查询,输入以下SQL脚本
CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;-- 指定字符集为 utf8mb4 USE weitoutiao;-- 进入微头条这个数据库 CREATE TABLE `user` (-- 创建user表格存放用户信息 `id` INT PRIMARY KEY AUTO_INCREMENT,-- id列:用户的唯一编号。INT是整数类型;PRIMARY KEY表示它是主键(相当于身份证号,绝对不能重复);自增,不用手动填编号 `username` VARCHAR(50) NOT NULL UNIQUE,-- 字符不超过50;不能为空;不能重复 `password` VARCHAR(100) NOT NULL, `role` VARCHAR(20) DEFAULT 'user',-- 默认是user `news_count` INT DEFAULT 0, `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP );
2.用IDEA创建maven工程
3. 创建Maven项目,添加MySQL驱动
在pom.xml文件的</project>标签之上,添加如下依赖:
<dependencies><!-- 【依赖管理区】这里用来声明当前项目需要用到哪些第三方工具包 -->
<dependency><!-- 声明一个具体的依赖项-->
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId><!--JDBC驱动,连接数据库-->
<version>8.0.33</version>
</dependency>
</dependencies>
添加完之后,点击maven的刷新(弹窗按钮也可),就不红了
4.编写DBUtil(连接数据库工具类)
-
右键java文件夹,创建java类
-
输入:
com.weitoutiao.util.DBUtil, 回车 -
编写如下代码:
package com.weitoutiao.util;// 声明这个工具类所在的包路径 // 【导入依赖】引入 JDBC 操作数据库必须的核心接口和类 import java.sql.Connection;// Connection 接口:代表与数据库的物理连接通道 import java.sql.DriverManager;// DriverManager 类:用于管理数据库驱动并获取连接 import java.sql.SQLException;// SQLException 类:处理数据库操作中可能出现的异常 public class DBUtil {//【创建工具类】封装数据库操作的辅助类 private static final String URL = "jdbc:mysql://localhost:3306/weitoutiao?useSSL=false&serverTimezone=Asia/Shanghai"; // 【配置连接参数】使用 private static final 修饰,表示这些是全局唯一且不可修改的常量 private static final String USER = "root";//登录数据库的用户名 private static final String PASSWORD = "root";//登录数据库的密码 static { //【静态代码块】当这个类被加载到内存时,里面的代码只会执行一次 try { Class.forName("com.mysql.cj.jdbc.Driver");// 核心作用:加载并注册 MySQL 8.0+ 版本的驱动程序 } catch (ClassNotFoundException e) {// 如果找不到这个驱动类,说明项目里没有引入 mysql-connector-java 依赖,打印错误信息 e.printStackTrace(); } } public static Connection getConnection() throws SQLException { //【获取连接方法】提供一个公开的静态方法,供外部业务代码(如 UserDao)直接调用 return DriverManager.getConnection(URL, USER, PASSWORD);// 利用上面配置好的三要素(URL、账号、密码),向数据库服务器申请一个连接通道并返回 } }
5. 编写User实体类
-
右键java,创建User类
-
编写如下代码:
package com.weitoutiao.entity;// 【定义包名】声明这个实体类所在的包路径 public class User {// 在实际开发中,它通常与数据库里的 user 表一一对应 private Integer id;// 【主键ID】用户的唯一标识符。使用包装类 Integer private String username; private String password; private String role; private Integer newsCount; // 生成getter/setter(略) }
6. 编写UserDAO(数据访问层)实现注册
-
右键
com.weitoutiao包名,创建UserDA0类 -
编写如下代码:
package com.weitoutiao.dao;// 【定义包名】声明这个类属于 dao (数据访问) 层,专门负责与数据库进行交互 // 【导入依赖】引入用户实体类和刚才写的数据库工具类 import com.weitoutiao.entity.User; import com.weitoutiao.util.DBUtil; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; // 【创建 DAO 类】UserDAO 专门负责处理 user 表的数据增删改查操作 public class UserDAO { // 【注册方法】向数据库中插入一条新的用户记录 public boolean register(String username, String password) { // SQL 语句:使用 ? 作为占位符,这是 PreparedStatement 的标准写法,可以有效防止 SQL 注入攻击 String sql = "INSERT INTO user (username, password) VALUES (?, ?)"; // 【核心逻辑】利用 try-with-resources 语法自动管理资源 // 1. 调用 DBUtil 获取数据库连接 // 2. 将 SQL 语句预编译成 PreparedStatement 对象 try (Connection conn = DBUtil.getConnection(); PreparedStatement ps = conn.prepareStatement(sql)) { // 【参数赋值】给 SQL 中的两个 ? 占位符分别设置真实的用户名和密码 ps.setString(1, username); ps.setString(2, password); return ps.executeUpdate() > 0; // 【执行并返回结果】executeUpdate() 用于执行 INSERT/UPDATE/DELETE 语句 } catch (SQLException e) { e.printStackTrace(); return false; } } }
7. 编写Main测试
-
右键
com.weitoutiao,创建Main类 -
编写Mian中代码:
package com.weitoutiao;// 【定义包名】声明这个主类所在的包路径 import com.weitoutiao.dao.UserDAO;// 【导入依赖】引入刚才写好的用户数据访问对象(DAO) public class Main { public static void main(String[] args) { UserDAO userDAO = new UserDAO();// 【实例化 DAO】创建一个 UserDAO 对象 boolean success = userDAO.register("testuser", "123456");// 【调用注册方法】去数据库里插入一条测试数据 System.out.println(success ? "注册成功" : "注册失败"); // 如果 success 为 true,输出 "注册成功";否则输出 "注册失败" } }
8.运行测试
-
运行
-
控制台打印:注册成功
-
通过SQLyou查看数据库表中数据已经对应增加
5.JDBC实现登录与新闻发布(含事务)一、教学目标
- 实现登录查询(根据用户名密码查询用户)。
- 实现发布新闻(插入
news表,同时更新用户news_count),使用事务保证一致性。
核心知识点(简要)
- 事务:一组操作要么全部成功,要么全部失败。
setAutoCommit(false):关闭自动提交,开启事务。commit()和rollback():提交或回滚事务。ResultSet:查询结果集,使用next()遍历。
操作步骤
1. 创建
news表-
打开SQLyog,选中weitout数据库,点+号,新建查询
-
在新的询问中输入如下内容:
CREATE TABLE `news` (-- 创建名为 news 的表 `id` INT PRIMARY KEY AUTO_INCREMENT,-- 【主键】定义 id 字段,类型为整数,设为主键并开启自增 `user_id` INT NOT NULL,--记录这条新闻是由哪个用户发布的,关联 user 表的 id `title` VARCHAR(200) NOT NULL, -- 【标题】 `content` TEXT, -- 【正文】定义 content 字段,文本类型 `publish_time` DATETIME DEFAULT CURRENT_TIMESTAMP,--【发布时间】定义 publish_time 字段,日期时间类型 `view_count` INT DEFAULT 0,-- 【浏览量】默认为 0,后续可通过 UPDATE 语句累加 FOREIGN KEY (`user_id`) REFERENCES `user`(`id`)-- 【外键约束】建立 user_id 与 user 表 id 之间的关联,确保发布的 user_id 必须在 user 表中真实存在 ); -
然后选中全部内容,点击运行
-
点开weitoutiao数据库中的表,可以看到新增了一张名为news的表,再点击表数据,点击刷新,新的表就显示出来,表示news数据表已成功创建。
2. 创建
News实体类(包含id, userId, title, content, publishTime, viewCount)-
打开IDEA,继续在上个工程上修改,右键entity,新建java类,News类
-
News类中编写代码如下:
package com.weitoutiao.entity;// 【包声明】表明该类属于 entity(实体)层 import java.time.LocalDateTime;// 【导入包】引入 Java 8 的时间处理类,对应数据库中的 DATETIME 类型 public class News {// News 实体类,对应数据库中的 news 表 private Integer id; // 【主键】对应表中的 id 字段 private Integer userId;// 【外键】对应表中的 user_id 字段,表示发布该新闻的用户ID private String title;// 存储新闻的简短标题 private String content; // 存储新闻的详细内容 private LocalDateTime publishTime; //使用 LocalDateTime精确匹配数据库的DATETIME格式 private Integer viewCount;// 统计该新闻被查看的次数 }
3. 在
UserDAO中添加login方法-
login方法如下:
public User login(String username, String password) { String sql = "SELECT id, username, role, news_count FROM user WHERE username=? AND password=?"; // 定义 SQL 查询语句:从 user 表中查找匹配的用户名和密码,并只查询需要的字段(id, username, role, news_count) try (Connection conn = DBUtil.getConnection();// 调用工具类获取数据库连接对象 PreparedStatement ps = conn.prepareStatement(sql)) {// 预编译 SQL 语句,生成 PreparedStatement 对象 ps.setString(1, username); // 设置 SQL 语句中第一个问号 (?) 的值为传入的 username 参数 ps.setString(2, password); ResultSet rs = ps.executeQuery();// 执行 SQL 查询语句,并将结果存储在 ResultSet 结果集对象中 if (rs.next()) {// 判断结果集中是否有数据(即是否找到了匹配的用户) User user = new User();// 如果找到用户,实例化一个新的 User 对象用于封装数据 user.setId(rs.getInt("id"));// 从结果集中获取 "id" 字段的值,并设置到 user 对象的 id 属性中 user.setUsername(rs.getString("username")); user.setRole(rs.getString("role")); user.setNewsCount(rs.getInt("news_count")); return user;// 将封装好数据的 user 对象返回给调用者,表示登录成功 } } catch (SQLException e) {// 捕获在执行数据库操作过程中可能发生的 SQL 异常 e.printStackTrace();// 在控制台打印异常的堆栈信息,方便开发者调试和排查错误 } return null; //如果没有找到匹配的用户(if 条件不成立)or发生了异常,则返回null,表示登录失败 } -
在
UserDao类中,login方法添加的位置如下: -
ResultSet会爆红,鼠标悬停之上,选择导入类 -
user的set方法还会爆红,这是因为User类的选择器没有配置,再返回到User实体类中添加
-
在User实体类中的空白位置右键,选择生成,再选择
Getter和Setter,生成set和get方法 -
可以全选中,一次全部生成
-
最后生成的方法如下所示:
-
再看
UserDao类中的set已经不红了。
4. 创建
NewsDAO实现发布新闻(事务)-
右键
dao包名,新建NewsDAO类 -
NewsDAO类中的代码如下:package com.weitoutiao.dao;// 【包声明】表明该类属于 dao(数据访问)层 import com.weitoutiao.util.DBUtil;// 【导入工具类】引入自定义的数据库连接工具 import java.sql.Connection;// 【导入类】数据库连接接口 import java.sql.PreparedStatement;// 【导入类】预编译 SQL 语句接口 import java.sql.SQLException;// 【导入异常】SQL 异常处理类 public class NewsDAO {//新闻数据访问对象 //发布新闻的方法 public boolean publish(int userId, String title, String content) { //【定义 SQL】向 news 表中插入一条新记录,使用 ? 占位符防注入 String insertSql = "INSERT INTO news (user_id, title, content) VALUES (?, ?, ?)"; // 【定义 SQL】根据用户 id,将该用户的发帖总数 (news_count) 累加 1 String updateSql = "UPDATE user SET news_count = news_count + 1 WHERE id = ?"; Connection conn = null; PreparedStatement psInsert = null; PreparedStatement psUpdate = null; try { conn = DBUtil.getConnection();// 【获取连接】通过工具类获取一个活跃的数据库连接 conn.setAutoCommit(false); // 开启事务,关闭自动提交功能!这是保证数据一致性的关键一步 psInsert = conn.prepareStatement(insertSql);// 【准备插入语句】预编译第一条 SQL(插入新闻) psInsert.setInt(1, userId);// 【设置参数】依次为占位符赋值:用户ID、标题、内容 psInsert.setString(2, title); psInsert.setString(3, content); psInsert.executeUpdate();// 【执行插入】将新闻写入数据库(此时尚未真正落盘) psUpdate = conn.prepareStatement(updateSql);// 【准备更新语句】预编译第二条 SQL(增加用户发帖数) psUpdate.setInt(1, userId);// 【设置参数】指定要更新的用户 ID psUpdate.executeUpdate();// 【执行更新】增加发帖计数(同样尚未真正落盘) conn.commit(); // 提交事务,两步操作都成功后,统一提交!让所有修改真正生效 return true; // 【返回结果】全部顺利执行,返回 true 表示发布成功 } catch (SQLException e) {// 【捕获异常】如果上述任何一步发生错误(如插入成功但更新失败),进入此块 // 【回滚事务】检查连接是否存在,保证“插入新闻”和“更新用户发帖数”一致 if (conn != null) { try { conn.rollback(); } catch (SQLException ex) { ex.printStackTrace(); } } e.printStackTrace(); return false; } finally { try { if (psInsert != null) psInsert.close(); } catch (SQLException e) {} try { if (psUpdate != null) psUpdate.close(); } catch (SQLException e) {} try { if (conn != null) conn.close(); } catch (SQLException e) {} } } }
5. 修改
Main测试登录和发布新闻-
具体内容如下:
package com.weitoutiao;// 【包声明】这是项目的根包,通常用于存放程序的启动类 Main import com.weitoutiao.dao.UserDAO;// 【导入 DAO 类】引入用户数据访问对象 import com.weitoutiao.dao.NewsDAO;// 【导入 DAO 类】引入新闻数据访问对象 import com.weitoutiao.entity.User;// 【导入实体类】引入 User 实体类,用于接收登录返回的数据 public class Main { public static void main(String[] args) { UserDAO userDAO = new UserDAO(); User user = userDAO.login("testuser", "123456");// 【调用登录方法】传入硬编码的用户名和密码进行验证 if (user != null) { System.out.println("登录成功,用户ID:" + user.getId()); NewsDAO newsDAO = new NewsDAO(); boolean published = newsDAO.publish(user.getId(), "我的第一条新闻", "内容"); System.out.println(published ? "发布成功" : "发布失败"); } else { System.out.println("登录失败"); } } }
6.运行测试
-
控制台打印如下:
-
打开SQLyog,查看news数据表如下:
6.SpringBoot项目创建 & 基础配置
教学目标
- 创建SpringBoot 3.1.5项目,配置数据库连接和MyBatis-Plus。
- 编写
HelloController验证项目启动。
核心知识点(简要)
- SpringBoot:自动配置,简化Spring应用开发。
- application.yml:配置文件,使用YAML格式。
- @RestController:标记控制器,返回JSON。
- MyBatis-Plus:增强MyBatis,简化数据库操作。
操作步骤
1. 创建项目
-
文件➡️新建➡️项目

-
配置如下:

配置完成后,点
下一步。 -
先选一下SpringBoot的版本,用3.5.15,依赖选这3个:Spring Web、MySQL Driver、Lombok。


-
选完之后,右侧会显示
已添加的依赖,最后点击创建
2. 添加MyBatis-Plus依赖(在pom.xml中):
-
添加的内容:
<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-spring-boot3-starter</artifactId> <version>3.5.5</version> </dependency><!--告别繁琐的 Connection、PreparedStatement--> -
在
pom.xml中添加的位置如下,添加完之后点一下maven的刷新按钮,下载依赖,就不会红了。
3. 配置application.yml:
-
在
src/main/resources文件夹中,找到application.properties文件,重命名为application.yml
-
其中内容改为:
#--JDBC:DBUtil # ======================== 服务器配置 ======================== server: port: 8080 # 【端口号】指定当前 Web 应用启动时监听的端口为 8080 # ======================== Spring 基础配置 ======================== spring: application: name: WeiTouTiao-SpringBoot # 【应用名称】为当前项目命名,方便在日志或注册中心中识别 datasource: # 【数据库连接 URL】指定 MySQL 数据库的地址、库名及连接参数 url: jdbc:mysql://localhost:3306/weitoutiao? #本机 3306 端口下的 weitoutiao 数据库 useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8 username: root # 【数据库账号】登录 MySQL 的用户名 password: root # 【数据库密码】登录 MySQL 的密码 driver-class-name: com.mysql.cj.jdbc.Driver # MyBatis-Plus 框架配置 mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl map-underscore-to-camel-case: true global-config: db-config: id-type: auto # 【逻辑删除字段】指定表中用于标记“是否被删除”的字段名为 deleted logic-delete-field: deleted logic-delete-value: 1 logic-not-delete-value: 0
4.编写HelloController:
-
右键
com.weitoutiao包名,新建controller.HelloController类

-
HelloController类中的代码如下:
// 【包声明】表明该类属于 controller(控制)层,专门负责处理前端请求 package com.weitoutiao.controller; import org.springframework.web.bind.annotation.GetMapping;// 【导入注解】引入 GET 请求映射注解 import org.springframework.web.bind.annotation.RestController;// 【导入注解】引入 REST 控制器注解 // 【REST 控制器注解】这是一个组合注解(相当于 @Controller + @ResponseBody) // 作用1:告诉 Spring 这是一个处理 Web 请求的控制器类,并将其注册到容器中 // 作用2:将该类中所有方法的返回值直接作为 HTTP 响应体(通常是 JSON 或纯文本)返回给前端 @RestController public class HelloController { @GetMapping("/hello")// 【GET 请求映射】限定该方法只处理 GET 类型的 HTTP 请求 public String hello() { // 当浏览器或前端访问 http://localhost:8080/hello 时,就会触发这个方法 return "微头条后端启动成功!";// 【返回响应】将字符串直接写入 HTTP 响应体中 } }
5.运行测试
-
找到主程序,点击运行

-
可以看到主程序的返回值,说明程序运行成功。

7.实体类与Mapper一、教学目标
- 创建
User和News实体类,使用Lombok和MyBatis-Plus注解。 - 创建
UserMapper和NewsMapper,继承BaseMapper。 - 测试基础查询。
核心知识点(简要)
- @TableName:指定数据库表名。
- @TableId:指定主键,
IdType.AUTO表示自增。 - @TableField(fill):自动填充。
- @TableLogic:逻辑删除。
- BaseMapper:提供通用CRUD方法。
操作步骤
本课次的操作是在上次课(课次23)的工程基础上继续操作。
1. 创建实体User:
-
右键
com.weitoutiao包名,创建entity.User类 -
类中内容如下:
package com.weitoutiao.entity; import com.baomidou.mybatisplus.annotation.*; import lombok.Data; import java.time.LocalDateTime; @Data @TableName("user") public class User { @TableId(type = IdType.AUTO) private Integer id; private String username; private String password; private String role; private Integer newsCount; @TableField(fill = FieldFill.INSERT) private LocalDateTime createTime; }
2. 创建实体News:
-
同样的操作,再创建News类
-
News类中的内容如下:
package com.weitoutiao.entity; import com.baomidou.mybatisplus.annotation.*; import lombok.Data; import java.time.LocalDateTime; @Data @TableName("news") public class News { @TableId(type = IdType.AUTO) private Integer id; private Integer userId; private String title; private String content; private LocalDateTime publishTime; private Integer viewCount; @TableField(fill = FieldFill.INSERT_UPDATE) private LocalDateTime updateTime; @TableLogic private Integer deleted; }
3. 创建Mapper接口
-
右键
com.weitoutiao,创建一个名为mapper的软件包 -
右键
mapper文件夹,新建UserMapper接口 -
UserMapper接口内容如下:package com.weitoutiao.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.weitoutiao.entity.User; import org.apache.ibatis.annotations.Mapper; @Mapper public interface UserMapper extends BaseMapper<User> { } -
同样的操作创建NewsMapper接口,内容如下:
package com.weitoutiao.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.weitoutiao.entity.News; import org.apache.ibatis.annotations.Mapper; @Mapper public interface NewsMapper extends BaseMapper<News> { }
4. 在启动类添加@MapperScan:
-
更改启动类
WeiTouTiaoSpringBootApplication中的内容如下:package com.weitoutiao; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication @MapperScan("com.weitoutiao.mapper") public class WeiTouTiaoSpringBootApplication { public static void main(String[] args) { SpringApplication.run(WeiTouTiaoSpringBootApplication.class, args); } }
5. 编写测试类(可选)
-
右键test文件夹中的com.weitoutiao,创建一个测试类
testSelect -
内容如下:
package com.weitoutiao; import com.weitoutiao.entity.User; import com.weitoutiao.mapper.UserMapper; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import java.util.List; @SpringBootTest class UserMapperTest { @Autowired private UserMapper userMapper; @Test void testSelect() { List<User> users = userMapper.selectList(null); users.forEach(System.out::println); } } -
点击运行
testSelect -
运行结果,可以查到数据库中所有的user信息
浙公网安备 33010602011771号