MySQL
前提:本地有安装 MySQL 。
连接
使用工具 Navicat Premium ,或者 IDEA 自带的 DB 工具,或者其他能连接 MySQL 数据库的工具都可以。
1)创建 MySQL Data Source
2)根据本地配置连接上 MySQL,点击【Test Connection】,显示连接成功,再点击【OK】按钮即可成功连接上 DB。
版本
此时已经是成功连接上 MySQL,在 console 窗口输入命令查看本地 MySQL 的版本。
SELECT VERSION();
依赖
前往公共 Maven 查看,发现 MySQL 没有8.0.34的版本,所以用降个版本用 v8.0.33。
仓库地址:https://mvnrepository.com/artifact/com.mysql/mysql-connector-j
pom.xml
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.0.33</version>
</dependency>
application.yml
spring:
application:
name: system
thymeleaf:
prefix: classpath:/templates/ #前缀,默认为classpath:/templates/
suffix: .html #后缀,默认为.html
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/system?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: root
password: root
com.mysql.jdbc.Driver 和 com.mysql.cj.jdbc.Driver 的区别及设定 serverTimezone 的方法:https://www.jb51.net/program/298475don.htm
建库建表
新建库 system,新建表 t_user。
#建库,库名: system
CREATE DATABASE `system` CHARACTER SET 'utf8mb4';
#进入 system 数据库
use `system`;
#建表,表名: t_user
CREATE TABLE `system`.`t_user` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`age` tinyint NULL,
`gender` tinyint(1) NULL COMMENT '性别:男0,女1',
`deleted` tinyint(1) NOT NULL COMMENT '已经删除:0否,1是',
`create_time` datetime NOT NULL,
`update_time` datetime NULL,
PRIMARY KEY (`id`)
);
MyBatis
官网
MyBatis 3:https://mybatis.org/mybatis-3/
MyBatis-Plus(推荐):https://baomidou.com/
依赖
pom.xml
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.7</version>
</dependency>
配置
1)启动类添加 @MapperScan 注解
SystemApplication.java
@SpringBootApplication
@MapperScan("com.lm.system.mapper")
public class SystemApplication extends SpringBootServletInitializer {}
插件(可选)
图标不同是因为装了插件,这个装不装都可以,装了可以在 Mapper 接口和 Mapper.xml 两个间跳转等功能。
实现代码
实体类
User.java
package com.lm.system.common;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import io.swagger.annotations.ApiModel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDateTime;
/**
* @Author: DuHaoLin
* @Date: 2024/7/26
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@ApiModel("用户实体类")
public class User {
@TableId(value = "id", type = IdType.INPUT)
private Integer id; //自增长
private String name;
private Integer age;
private Integer gender; //性别:0男,1女
private Integer deleted; //是否已经删除:0否,1是
private LocalDateTime createTime;
private LocalDateTime updateTime;
}
Mapper / Dao 层
在 system 目录下,新建 mapper 目录,在 mapper 目录下新建 UserMapper 接口。
UserMapper.java(这是个接口)
package com.lm.system.mapper;
import com.lm.system.common.User;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* @Author: DuHaoLin
* @Date: 2024/7/27
*/
public interface UserMapper {
int insertUser(@Param("user") User user); //写入单个用户信息
int updateUser(@Param("user") User user); //修改单个用户信息
User queryUserById(int id); //按ID查询用户信息
List<User> queryAllUser(); //查询所有用户信息
int deleteUser(int id); //按ID删除用户
}
在 resource 目录下,新建 com 目录,在 com 目录下新建 lm 目录,在 lm 目录下新建 system 目录,在 system 目录下新建 UserMapper.xml 文件。
注:保持 resource 下的 mapper 目录的层级,和 src 中的 mapper 目录的层级一样。
UserMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.lm.system.mapper.UserMapper">
<!-- 返回结果集 -->
<resultMap id="users" type="com.lm.system.common.User">
<id property="id" column="id" jdbcType="INTEGER" />
<result property="name" column="name" jdbcType="VARCHAR" />
<result property="age" column="age" jdbcType="INTEGER" />
<result property="gender" column="gender" jdbcType="INTEGER" />
<result property="deleted" column="deleted" jdbcType="INTEGER" />
<result property="createTime" column="create_time" jdbcType="DATE" />
<result property="updateTime" column="update_time" jdbcType="DATE" />
</resultMap>
<sql id="baseColumn">
id, `name`, age, gender, deleted, create_time, update_time
</sql>
<insert id="insertUser" parameterType="com.lm.system.common.User"
keyColumn="id" keyProperty="id" useGeneratedKeys="true">
INSERT INTO t_user (name, age, gender, deleted, create_time, update_time)
VALUES (#{user.name}, #{user.age}, #{user.gender}, #{user.deleted}, NOW(), NOW())
</insert>
<update id="updateUser" parameterType="com.lm.system.common.User">
UPDATE t_user SET name=#{user.name}, age=#{user.age}, gender=#{user.gender}, update_time=NOW()
WHERE id = #{user.id}
</update>
<select id="queryUserById" parameterType="int" resultType="com.lm.system.common.User">
SELECT <include refid="baseColumn"></include>
FROM t_user
WHERE id = #{id} AND deleted = 0
</select>
<select id="queryAllUser" resultMap="users">
SELECT <include refid="baseColumn"></include>
FROM t_user
WHERE deleted = 0
</select>
<update id="deleteUser" parameterType="int">
UPDATE t_user SET deleted = 1
WHERE id = #{id}
</update>
</mapper>
Service 层
在 system 目录下,新建 service 目录,在 service 目录下新建 UserService 接口。
UserService.java(这是一个接口)
package com.lm.system.service;
import com.lm.system.common.User;
import java.util.List;
/**
* @Author: DuHaoLin
* @Date: 2024/7/27
*/
public interface UserService {
int insertUser(User user); //写入单个用户信息
int updateUser(User user); //修改单个用户信息
User queryUserById(int id); //按ID查询用户信息
List<User> queryAllUser(); //查询所有用户信息
int deleteUser(int id); //按ID删除用户
}
在 service 目录下新建 impl 目录,在 impl 目录下新建 UserServiceImpl 类。
UserServiceImpl.java
package com.lm.system.service.impl;
import com.lm.system.common.User;
import com.lm.system.mapper.UserMapper;
import com.lm.system.service.UserService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
/**
* @Author: DuHaoLin
* @Date: 2024/7/27
*/
@Service
public class UserServiceImpl implements UserService {
@Resource
private UserMapper userMapper;
@Override
public int insertUser(User user) {
return userMapper.insertUser(user);
}
@Override
public int updateUser(User user) {
return userMapper.updateUser(user);
}
@Override
public User queryUserById(int id) {
return userMapper.queryUserById(id);
}
@Override
public List<User> queryAllUser() {
return userMapper.queryAllUser();
}
@Override
public int deleteUser(int id) {
return userMapper.deleteUser(id);
}
}