创建 Spring Boot 项目并实现连接操作MySQL数据库
准备
MySQL
命令
$ docker pull mysql
$ docker run --name local-mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql
Maven
相关地址
下载地址:
maven配置方法地址:
仓库搜索地址:
maven
本地配置
conf/settings.xml
<!-- TAG··· --><!-- 指定下载依赖到本地的路径 --><localRepository>${user.home}/Documents/AAA-PLee/maven/repository</localRepository><!-- TAG··· --><!-- 配置为阿里云公共仓库 --><mirror><id>aliyunmaven</id><mirrorOf>*</mirrorOf><name>阿里云公共仓库</name><url>https://maven.aliyun.com/repository/public</url></mirror><!-- TAG··· -->
***下载
idea
并配置本地环境
maven
Maven
构建
生命周期
Maven
的构建生命周期
包括三个阶段
:clean
、build
和site
1.clean
:清理项目,删除之前的编译结果和构建产生的文件。2.build
:构建项目,包括编译、测试、打包等操作。3.site
:生成项目文档和报告,例如测试报告、代码覆盖率报告等。- 每个阶段都包含了一些插件和目标,
Maven
会按照预定义的顺序依次执行。例如,在build
阶段,Maven
会依次执行以下目标: 1.validate
:验证项目是否正确。2.compile
:编译项目源代码。3.test
:运行项目的测试用例。4.package
:将项目打包成jar或war文件。5.verify
:验证打包结果是否正确。6.install
:将打包结果安装到本地Maven仓库。7.deploy
:将打包结果部署到远程Maven仓库。
idea
所需插件下载
EasyCode
用于快速生成与数据库相关的项目目录和代码
MyBatisPlus
用于
java
与
sql.xml
之间的跳转
idea
创建项目
配置
Server URL
填写项目相关信息
创建项目成功(运行并测试)
idea
测试能否正常连接
MySQL
创建数据库表
添加项目内连接
MySQL
的配置
搜索连接
MySQL
使用的依赖包
编写连接数据库配置文件
***在
pom.xml
中引入
MySQL依赖包
(别忘了
Load Maven Changes
)***
<dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId></dependency>
***创建并编写
application.yml
路径:
user/src/main/resources/application.yml
server:port:8000spring:application:name: user-service
datasource:url: jdbc:mysql://127.0.0.1:3306/java_app
username: root
password:123456driver-class-name: com.mysql.cj.jdbc.Driver
利用插件
EasyCode
快速创建操作数据库相关代码
查看创建完成后的项目目录结构
Java
应用程序通常使用以下几个组件来组织代码***
这些组件之间的关系通常是
Controller
调用
Service
,
Service
定义
impl
文件夹内的
业务实现类
,
业务实现类
调用
DAO
,
DAO
操作
Mapper
中的
SQL语句
,
Entity
表示数据库表结构
实体类
简单来说,
Controller
用于接收用户请求,
Service
实现业务逻辑,
DAO
操作数据库,
Entity
表示数据库表结构
在
/service/impl/xxx.java
中实现具体业务逻辑
在
/resources/mapper/xxx.xml
中添加操作数据的
sql
语句
Controller
:控制器,用于接收用户请求并调用相应的处理方法来处理请求,然后返回响应结果。通常使用Spring MVC
框架来实现。Service
:服务层,用于实现业务逻辑,调用DAO
进行数据操作。通常包含接口和实现类。DAO
:数据访问对象,用于操作数据库。通常使用MyBatis
、Hibernate
等框架来实现。Entity
:实体类,用于表示数据库中的表结构。通常包含类属性和对应的getter/setter
方法。
解决项目中导入库报错问题
***利用
https://mvnrepository.com/
搜索解决***
<!-- 解决完成后的pom.xml --><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId></dependency><dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-commons</artifactId><version>3.1.0</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.6</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies>
尝试运行(报错:没有引入对应版本)
<!-- <dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-commons</artifactId>
<version>3.1.0</version>
</dependency> --><!-- 修改为 --><dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-commons</artifactId></dependency>
***尝试运行(缺少
@MapperScan
注解)***
注意:
尽量选择使用量大的依赖包
<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.2</version></dependency>
// user/src/main/java/com/example/user/UserApplication.javapackagecom.example.user;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.mybatis.spring.annotation.MapperScan;@SpringBootApplication@MapperScan(basePackages ="com.example.user.dao")publicclassUserApplication{publicstaticvoidmain(String[] args){SpringApplication.run(UserApplication.class, args);}}
- @SpringBootApplication注解是一个组合注解,它的作用是标记一个Spring Boot应用程序的主类。它包括三个注解:
@Configuration
,@EnableAutoConfiguration
和@ComponentScan
- @Configuration:将该类标记为Spring应用程序上下文中的一个bean定义的源。即在该类中定义的bean可以被Spring容器管理。- @EnableAutoConfiguration:自动配置Spring Boot应用程序所需的Bean。- @ComponentScan:扫描应用程序中的其他组件,例如控制器、服务和存储库。 - @MapperScan是MyBatis框架中的一个注解,它的作用是扫描指定的包路径,找到所有标记了@Mapper注解的接口,并将这些接口创建成MyBatis的Mapper接口实现类 - 可以在需要使用Mapper的地方自动注入这些Mapper实现类的实例,从而方便地访问数据库。
***尝试运行(运行成功,若运行后立即结束,有可能为未引入
spring-boot-starter-web
包)***
尝试引入即可
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>
最终
pom.xml
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId></dependency><dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-commons</artifactId></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.6</version></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.2</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies>
访问接口
请求失败
***解决报错(告诉
MyBatis
去哪里找
SQL
语句)***
mybatis:mapper-locations: classpath:**/mapper/*.xml
重新运行并请求
完整源码
目录结构
引入依赖:
user/pom.xml
<?xml version="1.0" encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>user</artifactId><version>0.0.1-SNAPSHOT</version><name>user</name><description>user</description><properties><java.version>1.8</java.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><spring-boot.version>2.6.13</spring-boot.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId></dependency><dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-commons</artifactId></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.6</version></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.2</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>1.8</source><target>1.8</target><encoding>UTF-8</encoding></configuration></plugin><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>${spring-boot.version}</version><configuration><mainClass>com.example.user.UserApplication</mainClass><skip>true</skip></configuration><executions><execution><id>repackage</id><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins></build></project>
服务相关配置:
user/src/main/resources/application.yml
server:port:8000spring:application:name: user-service
datasource:url: jdbc:mysql://127.0.0.1:3306/java_app
username: root
password:123456driver-class-name: com.mysql.cj.jdbc.Driver
mybatis:mapper-locations: classpath:**/mapper/*.xml
入口:
user/src/main/java/com/example/user/UserApplication.java
packagecom.example.user;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.mybatis.spring.annotation.MapperScan;@SpringBootApplication@MapperScan(basePackages ="com.example.user.dao")publicclassUserApplication{publicstaticvoidmain(String[] args){SpringApplication.run(UserApplication.class, args);}}
(User)表控制层:
user/src/main/java/com/example/user/controller/UserController.java
packagecom.example.user.controller;importcom.example.user.entity.User;importcom.example.user.service.UserService;importorg.springframework.data.domain.Page;importorg.springframework.data.domain.PageRequest;importorg.springframework.http.ResponseEntity;importorg.springframework.web.bind.annotation.*;importjavax.annotation.Resource;/**
* (User)表控制层
*
* @author makejava
* @since 2023-06-12 14:13:44
*/@RestController@RequestMapping("user")publicclassUserController{/**
* 服务对象
*/@ResourceprivateUserService userService;/**
* 分页查询
*
* @param user 筛选条件
* @param pageRequest 分页对象
* @return 查询结果
*/@GetMappingpublicResponseEntity<Page<User>>queryByPage(User user,PageRequest pageRequest){returnResponseEntity.ok(this.userService.queryByPage(user, pageRequest));}/**
* 通过主键查询单条数据
*
* @param id 主键
* @return 单条数据
*/@GetMapping("{id}")publicResponseEntity<User>queryById(@PathVariable("id")String id){returnResponseEntity.ok(this.userService.queryById(id));}/**
* 新增数据
*
* @param user 实体
* @return 新增结果
*/@PostMappingpublicResponseEntity<User>add(User user){returnResponseEntity.ok(this.userService.insert(user));}/**
* 编辑数据
*
* @param user 实体
* @return 编辑结果
*/@PutMappingpublicResponseEntity<User>edit(User user){returnResponseEntity.ok(this.userService.update(user));}/**
* 删除数据
*
* @param id 主键
* @return 删除是否成功
*/@DeleteMappingpublicResponseEntity<Boolean>deleteById(String id){returnResponseEntity.ok(this.userService.deleteById(id));}}
(User)表服务接口:
user/src/main/java/com/example/user/service/UserService.java
packagecom.example.user.service;importcom.example.user.entity.User;importorg.springframework.data.domain.Page;importorg.springframework.data.domain.PageRequest;/**
* (User)表服务接口
*
* @author makejava
* @since 2023-06-12 14:13:49
*/publicinterfaceUserService{/**
* 通过ID查询单条数据
*
* @param id 主键
* @return 实例对象
*/UserqueryById(String id);/**
* 分页查询
*
* @param user 筛选条件
* @param pageRequest 分页对象
* @return 查询结果
*/Page<User>queryByPage(User user,PageRequest pageRequest);/**
* 新增数据
*
* @param user 实例对象
* @return 实例对象
*/Userinsert(User user);/**
* 修改数据
*
* @param user 实例对象
* @return 实例对象
*/Userupdate(User user);/**
* 通过主键删除数据
*
* @param id 主键
* @return 是否成功
*/booleandeleteById(String id);}
(User)表服务实现类:
user/src/main/java/com/example/user/service/impl/UserServiceImpl.java
packagecom.example.user.service.impl;importcom.example.user.entity.User;importcom.example.user.dao.UserDao;importcom.example.user.service.UserService;importorg.springframework.stereotype.Service;importorg.springframework.data.domain.Page;importorg.springframework.data.domain.PageImpl;importorg.springframework.data.domain.PageRequest;importjavax.annotation.Resource;/**
* (User)表服务实现类
*
* @author makejava
* @since 2023-06-12 14:13:50
*/@Service("userService")publicclassUserServiceImplimplementsUserService{@ResourceprivateUserDao userDao;/**
* 通过ID查询单条数据
*
* @param id 主键
* @return 实例对象
*/@OverridepublicUserqueryById(String id){returnthis.userDao.queryById(id);}/**
* 分页查询
*
* @param user 筛选条件
* @param pageRequest 分页对象
* @return 查询结果
*/@OverridepublicPage<User>queryByPage(User user,PageRequest pageRequest){long total =this.userDao.count(user);returnnewPageImpl<>(this.userDao.queryAllByLimit(user, pageRequest), pageRequest, total);}/**
* 新增数据
*
* @param user 实例对象
* @return 实例对象
*/@OverridepublicUserinsert(User user){this.userDao.insert(user);return user;}/**
* 修改数据
*
* @param user 实例对象
* @return 实例对象
*/@OverridepublicUserupdate(User user){this.userDao.update(user);returnthis.queryById(user.getId());}/**
* 通过主键删除数据
*
* @param id 主键
* @return 是否成功
*/@OverridepublicbooleandeleteById(String id){returnthis.userDao.deleteById(id)>0;}}
(User)表数据库访问层:
user/src/main/java/com/example/user/dao/UserDao.java
packagecom.example.user.dao;importcom.example.user.entity.User;importorg.apache.ibatis.annotations.Param;importorg.springframework.data.domain.Pageable;importjava.util.List;/**
* (User)表数据库访问层
*
* @author makejava
* @since 2023-06-12 14:13:45
*/publicinterfaceUserDao{/**
* 通过ID查询单条数据
*
* @param id 主键
* @return 实例对象
*/UserqueryById(String id);/**
* 查询指定行数据
*
* @param user 查询条件
* @param pageable 分页对象
* @return 对象列表
*/List<User>queryAllByLimit(User user,@Param("pageable")Pageable pageable);/**
* 统计总行数
*
* @param user 查询条件
* @return 总行数
*/longcount(User user);/**
* 新增数据
*
* @param user 实例对象
* @return 影响行数
*/intinsert(User user);/**
* 批量新增数据(MyBatis原生foreach方法)
*
* @param entities List<User> 实例对象列表
* @return 影响行数
*/intinsertBatch(@Param("entities")List<User> entities);/**
* 批量新增或按主键更新数据(MyBatis原生foreach方法)
*
* @param entities List<User> 实例对象列表
* @return 影响行数
* @throws org.springframework.jdbc.BadSqlGrammarException 入参是空List的时候会抛SQL语句错误的异常,请自行校验入参
*/intinsertOrUpdateBatch(@Param("entities")List<User> entities);/**
* 修改数据
*
* @param user 实例对象
* @return 影响行数
*/intupdate(User user);/**
* 通过主键删除数据
*
* @param id 主键
* @return 影响行数
*/intdeleteById(String id);}
(User)实体类:
user/src/main/java/com/example/user/entity/User.java
packagecom.example.user.entity;importjava.io.Serializable;/**
* (User)实体类
*
* @author makejava
* @since 2023-06-12 14:13:46
*/publicclassUserimplementsSerializable{privatestaticfinallong serialVersionUID =264722085318530649L;privateString id;privateString name;privateInteger age;privateString sex;privateString phone;publicStringgetId(){return id;}publicvoidsetId(String id){this.id = id;}publicStringgetName(){return name;}publicvoidsetName(String name){this.name = name;}publicIntegergetAge(){return age;}publicvoidsetAge(Integer age){this.age = age;}publicStringgetSex(){return sex;}publicvoidsetSex(String sex){this.sex = sex;}publicStringgetPhone(){return phone;}publicvoidsetPhone(String phone){this.phone = phone;}}
SQL:
user/src/main/resources/mapper/UserDao.xml
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPEmapperPUBLIC"-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mappernamespace="com.example.user.dao.UserDao"><resultMaptype="com.example.user.entity.User"id="UserMap"><resultproperty="id"column="id"jdbcType="VARCHAR"/><resultproperty="name"column="name"jdbcType="VARCHAR"/><resultproperty="age"column="age"jdbcType="INTEGER"/><resultproperty="sex"column="sex"jdbcType="VARCHAR"/><resultproperty="phone"column="phone"jdbcType="VARCHAR"/></resultMap><!--查询单个--><selectid="queryById"resultMap="UserMap">
select
id, name, age, sex, phone
from user
where id = #{id}
</select><!--查询指定行数据--><selectid="queryAllByLimit"resultMap="UserMap">
select
id, name, age, sex, phone
from user
<where><iftest="id != null and id != ''">
and id = #{id}
</if><iftest="name != null and name != ''">
and name = #{name}
</if><iftest="age != null">
and age = #{age}
</if><iftest="sex != null and sex != ''">
and sex = #{sex}
</if><iftest="phone != null and phone != ''">
and phone = #{phone}
</if></where>
limit #{pageable.offset}, #{pageable.pageSize}
</select><!--统计总行数--><selectid="count"resultType="java.lang.Long">
select count(1)
from user
<where><iftest="id != null and id != ''">
and id = #{id}
</if><iftest="name != null and name != ''">
and name = #{name}
</if><iftest="age != null">
and age = #{age}
</if><iftest="sex != null and sex != ''">
and sex = #{sex}
</if><iftest="phone != null and phone != ''">
and phone = #{phone}
</if></where></select><!--新增所有列--><insertid="insert"keyProperty="id"useGeneratedKeys="true">
insert into user(name, age, sex, phone)
values (#{name}, #{age}, #{sex}, #{phone})
</insert><insertid="insertBatch"keyProperty="id"useGeneratedKeys="true">
insert into user(name, age, sex, phone)
values
<foreachcollection="entities"item="entity"separator=",">
(#{entity.name}, #{entity.age}, #{entity.sex}, #{entity.phone})
</foreach></insert><insertid="insertOrUpdateBatch"keyProperty="id"useGeneratedKeys="true">
insert into user(name, age, sex, phone)
values
<foreachcollection="entities"item="entity"separator=",">
(#{entity.name}, #{entity.age}, #{entity.sex}, #{entity.phone})
</foreach>
on duplicate key update
name = values(name),
age = values(age),
sex = values(sex),
phone = values(phone)
</insert><!--通过主键修改数据--><updateid="update">
update user
<set><iftest="name != null and name != ''">
name = #{name},
</if><iftest="age != null">
age = #{age},
</if><iftest="sex != null and sex != ''">
sex = #{sex},
</if><iftest="phone != null and phone != ''">
phone = #{phone},
</if></set>
where id = #{id}
</update><!--通过主键删除--><deleteid="deleteById">
delete from user where id = #{id}
</delete></mapper>
版权归原作者 Prosper Lee 所有, 如有侵权,请联系我们删除。