项目环境

  • 操作系统:Mac OSX Catalina 10.15.1
  • IDE: IntelliJ IDEA CE(社区版)
  • mysql: MySQL Community Server 8.0.19
  • mybatis-spring-boot-starter:2.1.1
  • mysql-connector-java

MySQL安装

2.1. 下载MySQL

官网下载地址
下载并安装dmg文件, 安装过程会要求设置密码,为了方便使用,可以选择传统的密码加密方式
Use Legacy Password Encryption,设置root密码

安装成功之后,系统偏好设置面板中会出现mysql图标,点击会展开操作面板:

支持手动启动/停止数据库服务,选择Initialize Database可以修改密码加密方式和密码,下文会介绍如果使用命令行完成这些任务。

2.2. 使用Shell脚本启动/停止DB Server

使用脚本之前,请先配置mysql环境变量,以使用zsh为例,我们需要在.zshrc文件中添加:

1
2
#mysql 
export PATH="$PATH":/usr/local/mysql/bin

保存之后执行source命令:

1
source .zshrc

启动mysql:

1
sudo /usr/local/mysql/support-files/mysql.server start

停止mysql:

1
sudo /usr/local/mysql/support-files/mysql.server stop

重启mysql:

1
sudo /usr/local/mysql/support-files/mysql.server restart

保存命令行至shell文件中,方便后续使用

别忘了给shell文件添加执行权限
1
chmod 777 mysql-start.sh chmod 777 mysql-restart.sh chmod 777 mysql-stop.sh
好了,现在尝试使用shell脚本来操作mysql server吧:)

2.3. 登录MySQL

执行命令行:

1
mysql -u root -p

输入初始设置的密码,登录成功会进入mysql>命令行输入界面,若出现无权限提示,需要重置密码

1
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

2.4. 重置密码

  1. 停止MySQL server
  2. 使用安全模式启动MySQL server, 添加–skip-grant-tables参数关闭登录时密码校验
    1
    sudo /usr/local/mysql/bin/mysqld_safe --skip-grant-tables
  3. 无密码登录MySQL
    1
    sudo /usr/local/mysql/bin/mysql -u root
  4. 在mysql>输入命令修改root登录密码
    1
    mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'new pwd';
  5. 若遇到下面的错误提示,请刷新权限表之后重新执行密码修改命令
    1
    ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement
  6. 刷新权限表
    1
    mysql> flush privileges;

使用MySQL

3.1. 创建数据库表

  1. 首先创建一个独立的DB用于开发
    mysql> create database dev_db;
  2. 切换到新创建的DB
    mysql> use database dev_db;
  3. 在dev_db下新建表t_member
    mysql> create table t_member(id int, name varchar(255), book_count int, min_duration int, max_duration int, av_duration int, times_per_week int);
  4. 手动插入几条测试数据
    1
    2
    3
    mysql> insert into t_member values(1, "小明", 10, 30, 65, 45, 3);
    mysql> insert into t_member values(2, "小红", 5, 10, 30, 25, 2);
    mysql> insert into t_member values(3, "小强", 25, 30, 120, 68, 7);

3.2. 安装GUI工具

  1. 推荐安装Sequel Pro最新测试版本,因为稳定版本在loading数据库时会出现卡死,详细原因参见GitHub issue: #2699
  2. 使用StandardTCP/IP方式连接MySQL server并添加到收藏列表

连接成功后可以切换DB和查看表

在工程中配置MyBatis和MySQL

4.1. pom.xml配置依赖

添加mybatis-spring-boot-starter和mysql-connector-java依赖

1
2
3
4
5
6
7
8
<dependency>    
<groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>

4.2. 配置数据库
resources/application.properties中添加配置:

1
2
3
4
mybatis.type-aliases-package=com.example.domains 
spring.datasource.driverClassName = com.mysql.cj.jdbc.Driver
spring.datasource.url = jdbc:mysql://localhost:3306/dev_db?useUnicode=true&characterEncoding=utf-8 spring.datasource.username = {your username}
spring.datasource.password = {your password}

使用Mybatis访问MySQL

5.1. 创建Mapper接口

在每个接口声明之前需要使用@Mapper注解,由于MyBatis动态代理机制的存在,我们无需手动实现Mapper接口

1
2
3
4
5
6
7
8
9
10
package com.example.demo01.mapper; 
import com.example.demo01.domains.MemberPO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
@Mapper
public interface MemberMapper {
@Select("SELECT * FROM t_member WHERE name = #{name}")
MemberPO findByName(@Param("name") String name);
}

为了免去每个接口文件都要添加@Mapper注解,MyBatis提供统一扫描包的方式鉴别Mapper接口

1
2
3
4
5
6
7
8
@MapperScan("your mapper package")
@SpringBootApplication
@MapperScan("com.example.demo01.mapper")
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}

5.2. 依赖注入Mapper并使用

使用@Autowired注解,注入Mapper依赖,然后就可以直接使用Mapper实例调用接口方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@RestController 
public class DemoController {
@Autowired
private MemberMapper memberMapper;
@RequestMapping("/")
public String sayHello() {
return "Hello";
}
@RequestMapping(value="/member/{name}",method= RequestMethod.GET) public MemberDTO getMemberInfo(@PathVariable("name") String name) {
MemberPO memberPO = memberMapper.findByName(name); MemberDTO memberDTO = new MemberDTO();
memberDTO.setName(memberPO.getName());
memberDTO.setBookCount(memberPO.getBook_count());
memberDTO.setAverageDuration(memberPO.getAv_duration());
memberDTO.setTimesPerWeek(memberPO.getTimes_per_week()); return memberDTO;
}
}

5.3. 接口测试

运行DemoApplication, 用Chrome测试一下接口

附录:

issue 1: java: 变量 memberMapper 未在默认构造器中初始化
private MemberMapper memberMapper; 变量声明时未使用@Autowired注解

issue 2: This application has no explicit mapping for /error, so you are seeing this as a fallback.
代码里面url mapping是正确的,原因是Controller所在的包没有包含在Application所在的包里面,正确的目录结构是这样的:

issue 3: 更改目录结构之后工程文件出现警告Cannot resolve symbol, 但是应用可以正常运行,需要清理缓存
其中一种解决方法:进入File > Invalidate Caches & Restart