Crie um projeto Spring Boot e implemente a operação de conexão do banco de dados MySQL
-
- Preparar
- `idea` cria um projeto
- `idea` testa se pode se conectar ao `MySQL` normalmente
- Criar tabela de banco de dados
- Adicione configuração para conectar-se ao `MySQL` dentro do projeto
- Use o plug-in `EasyCode` para criar rapidamente código relacionado a bancos de dados operacionais
- Interface de acesso
- Código fonte completo
-
- Estrutura de diretório
- Introduzir dependências: `user/pom.xml`
- Configuração relacionada ao serviço: `user/src/main/resources/application.yml`
- Nome:`user/src/main/java/com/example/user/UserApplication.java`
- Camada de controle de tabela (usuário): `user/src/main/java/com/example/user/controller/UserController.java`
- Interface de serviço de tabela (usuário): `user/src/main/java/com/example/user/service/UserService.java`
- Classe de implementação de serviço de tabela (usuário): `user/src/main/java/com/example/user/service/impl/UserServiceImpl.java`
- Camada de acesso ao banco de dados de tabela (usuário): `user/src/main/java/com/example/user/dao/UserDao.java`
- (Usuário)实体类:`user/src/main/java/com/example/user/entity/User.java`
- SQL:`user/src/main/resources/mapper/UserDao.xml`
Preparar
MySQL
Ordem
$ docker pull mysql
$ docker run --name local-mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql
Maven
Endereços relacionados
Link para Download:
endereço do método de configuração maven:
Endereço de pesquisa do armazém:
maven
configuração localconf/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··· -->
Baixe idea
e configure o ambiente localmaven
Maven
Construir生命周期
Maven
A construção生命周期
inclui三个阶段
:clean
ebuild
site
clean
: Limpe o projeto, exclua os resultados da compilação anterior e os arquivos gerados pela compilação.build
: Construa o projeto, incluindo compilação, teste, empacotamento e outras operações.site
: Gere documentos e relatórios de projeto, como relatórios de teste, relatórios de cobertura de código, etc.
- Cada estágio contém alguns plug-ins e destinos, que
Maven
são executados em uma ordem predefinida. Por exemplo,build
numa fase,Maven
os seguintes objetivos são executados em sequência:validate
: Verifique se o projeto está correto.compile
: Compile o código-fonte do projeto.test
: execute os casos de teste do projeto.package
: Empacote o projeto em um arquivo jar ou war.verify
: Verifique se o resultado da embalagem está correto.install
: instale os resultados do pacote no repositório Maven local.deploy
: implanta os resultados do empacotamento no repositório Maven remoto.
idea
Baixe os plug-ins necessários
Código Fácil
Usado para gerar rapidamente diretórios e códigos de projetos relacionados ao banco de dados
MeuBatisPlus
Usado para pular entre
java
esql.xml
idea
Criar projeto
ConfiguraçãoServer URL
Endereço: https://start.aliyun.com/
Preencha as informações relacionadas ao projeto
Criação do projeto bem-sucedida (executar e testar)
idea
Teste se a conexão está normalMySQL
Criar tabela de banco de dados
Adicione MySQL
configuração de conexões dentro do projeto
Procure MySQL
pacotes de dependência usados pela conexão
Gravar arquivo de configuração do banco de dados de conexão
Apresente (não se pom.xml
esqueça )MySQL依赖包
Load Maven Changes
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
</dependency>
criar e escreverapplication.yml
caminho:
user/src/main/resources/application.yml
server:
port: 8000
spring:
application:
name: user-service
datasource:
url: jdbc:mysql://127.0.0.1:3306/java_app
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
Use plug-ins EasyCode
para criar rapidamente código relacionado a bancos de dados operacionais
Veja a estrutura de diretórios do projeto após a criação
Java
Os aplicativos normalmente usam os seguintes componentes para organizar seu código
O relacionamento entre esses componentes geralmente é chamada
Controller
,Service
definidaService
dentroimpl
da pasta业务实现类
,业务实现类
chamadaDAO
,DAO
operação , representando a estrutura da tabela do banco de dadosMapper
SQL语句
Entity
实体类
Simplificando,
Controller
ele é usado para receber solicitações de usuários,Service
implementar lógica de negócios,DAO
operar o banco de dados eEntity
representar a estrutura da tabela do banco de dados.
/service/impl/xxx.java
Implementar lógica de negócios específica emAdicione instruções
/resources/mapper/xxx.xml
para manipular dados emsql
Controller
: Controlador, usado para receber solicitações do usuário e chamar métodos de processamento correspondentes para processar as solicitações e, em seguida, retornar os resultados da resposta. GeralmenteSpring MVC
implementado usando uma estrutura.Service
: Camada de serviço, usada para implementar lógica de negócios e chamada paraDAO
realizar operações de dados. Geralmente contém classes de interface e implementação.DAO
: Objeto de acesso a dados, utilizado para operar o banco de dados. Geralmente é implementado usando frameworksMyBatis
comoHibernate
.Entity
: Classe de entidade, usada para representar a estrutura da tabela no banco de dados. Geralmente contém atributos de classe egetter/setter
métodos correspondentes.
Resolva o problema de importação de erros de biblioteca no projeto
Usar https://mvnrepository.com/
solução de pesquisa
<!-- 解决完成后的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>
Tente executar (erro: nenhuma versão correspondente foi introduzida)
<!-- <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>
Tente executar (faltam @MapperScan
anotações)
Perceber:
尽量选择使用量大的依赖包
<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.java
package com.example.user;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.mybatis.spring.annotation.MapperScan;
@SpringBootApplication
@MapperScan(basePackages = "com.example.user.dao")
public class UserApplication {
public static void main(String[] args) {
SpringApplication.run(UserApplication.class, args);
}
}
- A anotação @SpringBootApplication é uma anotação combinada, usada para marcar
a classe principal de um aplicativo Spring Boot. Inclui três anotações :@Configuration
e@EnableAutoConfiguration
@ComponentScan
- @Configuration: marque esta classe como a origem de uma definição de bean no contexto do aplicativo Spring. Ou seja, os beans definidos nesta classe podem ser gerenciados pelo contêiner Spring.
- @EnableAutoConfiguration: configura automaticamente os beans exigidos pelos aplicativos Spring Boot.
- @ComponentScan: verifica outros componentes do aplicativo, como controladores, serviços e repositórios.
- @MapperScan é uma anotação na estrutura MyBatis. Sua função é verificar o caminho do pacote especificado, encontrar todas as interfaces marcadas com a anotação @Mapper e criar essas interfaces nas classes de implementação da interface MyBatis Mapper.
- Instâncias dessas classes de implementação do Mapper podem ser injetadas automaticamente sempre que o Mapper for necessário, acessando assim o banco de dados de maneira conveniente.
Tente executar (a operação foi bem-sucedida, se terminar imediatamente após a execução, pode ser que spring-boot-starter-web
o pacote não tenha sido introduzido)
Apenas tente importá-lo
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
finalmentepom.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>
Interface de acesso
Falha na solicitação
Resolva o erro (diga MyBatis
onde encontrar SQL
a afirmação)
mybatis:
mapper-locations: classpath:**/mapper/*.xml
Execute novamente e solicite
Código fonte completo
Estrutura de diretório
Introduzir dependências:user/pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="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>
Configuração relacionada ao serviço:user/src/main/resources/application.yml
server:
port: 8000
spring:
application:
name: user-service
datasource:
url: jdbc:mysql://127.0.0.1:3306/java_app
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis:
mapper-locations: classpath:**/mapper/*.xml
Entrada:user/src/main/java/com/example/user/UserApplication.java
package com.example.user;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.mybatis.spring.annotation.MapperScan;
@SpringBootApplication
@MapperScan(basePackages = "com.example.user.dao")
public class UserApplication {
public static void main(String[] args) {
SpringApplication.run(UserApplication.class, args);
}
}
Camada de controle de tabela (usuário):user/src/main/java/com/example/user/controller/UserController.java
package com.example.user.controller;
import com.example.user.entity.User;
import com.example.user.service.UserService;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
/**
* (User)表控制层
*
* @author makejava
* @since 2023-06-12 14:13:44
*/
@RestController
@RequestMapping("user")
public class UserController {
/**
* 服务对象
*/
@Resource
private UserService userService;
/**
* 分页查询
*
* @param user 筛选条件
* @param pageRequest 分页对象
* @return 查询结果
*/
@GetMapping
public ResponseEntity<Page<User>> queryByPage(User user, PageRequest pageRequest) {
return ResponseEntity.ok(this.userService.queryByPage(user, pageRequest));
}
/**
* 通过主键查询单条数据
*
* @param id 主键
* @return 单条数据
*/
@GetMapping("{id}")
public ResponseEntity<User> queryById(@PathVariable("id") String id) {
return ResponseEntity.ok(this.userService.queryById(id));
}
/**
* 新增数据
*
* @param user 实体
* @return 新增结果
*/
@PostMapping
public ResponseEntity<User> add(User user) {
return ResponseEntity.ok(this.userService.insert(user));
}
/**
* 编辑数据
*
* @param user 实体
* @return 编辑结果
*/
@PutMapping
public ResponseEntity<User> edit(User user) {
return ResponseEntity.ok(this.userService.update(user));
}
/**
* 删除数据
*
* @param id 主键
* @return 删除是否成功
*/
@DeleteMapping
public ResponseEntity<Boolean> deleteById(String id) {
return ResponseEntity.ok(this.userService.deleteById(id));
}
}
Interface de serviço de tabela (usuário):user/src/main/java/com/example/user/service/UserService.java
package com.example.user.service;
import com.example.user.entity.User;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
/**
* (User)表服务接口
*
* @author makejava
* @since 2023-06-12 14:13:49
*/
public interface UserService {
/**
* 通过ID查询单条数据
*
* @param id 主键
* @return 实例对象
*/
User queryById(String id);
/**
* 分页查询
*
* @param user 筛选条件
* @param pageRequest 分页对象
* @return 查询结果
*/
Page<User> queryByPage(User user, PageRequest pageRequest);
/**
* 新增数据
*
* @param user 实例对象
* @return 实例对象
*/
User insert(User user);
/**
* 修改数据
*
* @param user 实例对象
* @return 实例对象
*/
User update(User user);
/**
* 通过主键删除数据
*
* @param id 主键
* @return 是否成功
*/
boolean deleteById(String id);
}
Classe de implementação de serviço de tabela (usuário):user/src/main/java/com/example/user/service/impl/UserServiceImpl.java
package com.example.user.service.impl;
import com.example.user.entity.User;
import com.example.user.dao.UserDao;
import com.example.user.service.UserService;
import org.springframework.stereotype.Service;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.PageRequest;
import javax.annotation.Resource;
/**
* (User)表服务实现类
*
* @author makejava
* @since 2023-06-12 14:13:50
*/
@Service("userService")
public class UserServiceImpl implements UserService {
@Resource
private UserDao userDao;
/**
* 通过ID查询单条数据
*
* @param id 主键
* @return 实例对象
*/
@Override
public User queryById(String id) {
return this.userDao.queryById(id);
}
/**
* 分页查询
*
* @param user 筛选条件
* @param pageRequest 分页对象
* @return 查询结果
*/
@Override
public Page<User> queryByPage(User user, PageRequest pageRequest) {
long total = this.userDao.count(user);
return new PageImpl<>(this.userDao.queryAllByLimit(user, pageRequest), pageRequest, total);
}
/**
* 新增数据
*
* @param user 实例对象
* @return 实例对象
*/
@Override
public User insert(User user) {
this.userDao.insert(user);
return user;
}
/**
* 修改数据
*
* @param user 实例对象
* @return 实例对象
*/
@Override
public User update(User user) {
this.userDao.update(user);
return this.queryById(user.getId());
}
/**
* 通过主键删除数据
*
* @param id 主键
* @return 是否成功
*/
@Override
public boolean deleteById(String id) {
return this.userDao.deleteById(id) > 0;
}
}
Camada de acesso ao banco de dados de tabela (usuário):user/src/main/java/com/example/user/dao/UserDao.java
package com.example.user.dao;
import com.example.user.entity.User;
import org.apache.ibatis.annotations.Param;
import org.springframework.data.domain.Pageable;
import java.util.List;
/**
* (User)表数据库访问层
*
* @author makejava
* @since 2023-06-12 14:13:45
*/
public interface UserDao {
/**
* 通过ID查询单条数据
*
* @param id 主键
* @return 实例对象
*/
User queryById(String id);
/**
* 查询指定行数据
*
* @param user 查询条件
* @param pageable 分页对象
* @return 对象列表
*/
List<User> queryAllByLimit(User user, @Param("pageable") Pageable pageable);
/**
* 统计总行数
*
* @param user 查询条件
* @return 总行数
*/
long count(User user);
/**
* 新增数据
*
* @param user 实例对象
* @return 影响行数
*/
int insert(User user);
/**
* 批量新增数据(MyBatis原生foreach方法)
*
* @param entities List<User> 实例对象列表
* @return 影响行数
*/
int insertBatch(@Param("entities") List<User> entities);
/**
* 批量新增或按主键更新数据(MyBatis原生foreach方法)
*
* @param entities List<User> 实例对象列表
* @return 影响行数
* @throws org.springframework.jdbc.BadSqlGrammarException 入参是空List的时候会抛SQL语句错误的异常,请自行校验入参
*/
int insertOrUpdateBatch(@Param("entities") List<User> entities);
/**
* 修改数据
*
* @param user 实例对象
* @return 影响行数
*/
int update(User user);
/**
* 通过主键删除数据
*
* @param id 主键
* @return 影响行数
*/
int deleteById(String id);
}
Classe de entidade (Usuário):user/src/main/java/com/example/user/entity/User.java
package com.example.user.entity;
import java.io.Serializable;
/**
* (User)实体类
*
* @author makejava
* @since 2023-06-12 14:13:46
*/
public class User implements Serializable {
private static final long serialVersionUID = 264722085318530649L;
private String id;
private String name;
private Integer age;
private String sex;
private String phone;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
}
SQL:user/src/main/resources/mapper/UserDao.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.example.user.dao.UserDao">
<resultMap type="com.example.user.entity.User" id="UserMap">
<result property="id" column="id" jdbcType="VARCHAR"/>
<result property="name" column="name" jdbcType="VARCHAR"/>
<result property="age" column="age" jdbcType="INTEGER"/>
<result property="sex" column="sex" jdbcType="VARCHAR"/>
<result property="phone" column="phone" jdbcType="VARCHAR"/>
</resultMap>
<!--查询单个-->
<select id="queryById" resultMap="UserMap">
select
id, name, age, sex, phone
from user
where id = #{id}
</select>
<!--查询指定行数据-->
<select id="queryAllByLimit" resultMap="UserMap">
select
id, name, age, sex, phone
from user
<where>
<if test="id != null and id != ''">
and id = #{id}
</if>
<if test="name != null and name != ''">
and name = #{name}
</if>
<if test="age != null">
and age = #{age}
</if>
<if test="sex != null and sex != ''">
and sex = #{sex}
</if>
<if test="phone != null and phone != ''">
and phone = #{phone}
</if>
</where>
limit #{pageable.offset}, #{pageable.pageSize}
</select>
<!--统计总行数-->
<select id="count" resultType="java.lang.Long">
select count(1)
from user
<where>
<if test="id != null and id != ''">
and id = #{id}
</if>
<if test="name != null and name != ''">
and name = #{name}
</if>
<if test="age != null">
and age = #{age}
</if>
<if test="sex != null and sex != ''">
and sex = #{sex}
</if>
<if test="phone != null and phone != ''">
and phone = #{phone}
</if>
</where>
</select>
<!--新增所有列-->
<insert id="insert" keyProperty="id" useGeneratedKeys="true">
insert into user(name, age, sex, phone)
values (#{name}, #{age}, #{sex}, #{phone})
</insert>
<insert id="insertBatch" keyProperty="id" useGeneratedKeys="true">
insert into user(name, age, sex, phone)
values
<foreach collection="entities" item="entity" separator=",">
(#{entity.name}, #{entity.age}, #{entity.sex}, #{entity.phone})
</foreach>
</insert>
<insert id="insertOrUpdateBatch" keyProperty="id" useGeneratedKeys="true">
insert into user(name, age, sex, phone)
values
<foreach collection="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>
<!--通过主键修改数据-->
<update id="update">
update user
<set>
<if test="name != null and name != ''">
name = #{name},
</if>
<if test="age != null">
age = #{age},
</if>
<if test="sex != null and sex != ''">
sex = #{sex},
</if>
<if test="phone != null and phone != ''">
phone = #{phone},
</if>
</set>
where id = #{id}
</update>
<!--通过主键删除-->
<delete id="deleteById">
delete from user where id = #{id}
</delete>
</mapper>