Cree un proyecto Spring Boot e implemente la operación de conexión de la base de datos MySQL
-
- Preparar
- `idea` crea un proyecto
- `idea` prueba si puede conectarse a `MySQL` normalmente
- Crear tabla de base de datos
- Agregar configuración para conectarse a `MySQL` dentro del proyecto
- Utilice el complemento `EasyCode` para crear rápidamente código relacionado con bases de datos operativas
- Interfaz de acceso
- código fuente completo
-
- Estructura de directorios
- Introducir dependencias: `user/pom.xml`
- Configuración relacionada con el servicio: `user/src/main/resources/application.yml`
- Ejemplo: `usuario/src/main/java/com/example/user/UserApplication.java`
- Capa de control de tabla (Usuario): `user/src/main/java/com/example/user/controller/UserController.java`
- Interfaz de servicio de tabla (usuario): `user/src/main/java/com/example/user/service/UserService.java`
- (Usuario) clase de implementación del servicio de tabla: `user/src/main/java/com/example/user/service/impl/UserServiceImpl.java`
- Capa de acceso a la base de datos de la tabla (Usuario): `user/src/main/java/com/example/user/dao/UserDao.java`
- (Usuario)实体类:`user/src/main/java/com/example/user/entity/User.java`
- SQL:`usuario/src/main/resources/mapper/UserDao.xml`
Preparar
mysql
Orden
$ docker pull mysql
$ docker run --name local-mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql
experto
Direcciones relacionadas
enlace de descarga:
Dirección del método de configuración de Maven:
Dirección de búsqueda de almacén:
maven
configuración 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··· -->
Descargar idea
y configurar el entorno local.maven
Maven
Construir生命周期
Maven
La construcción生命周期
incluye三个阶段
:clean
,build
ysite
clean
: Limpia el proyecto, elimina los resultados de la compilación anterior y los archivos generados por la compilación.build
: Construya el proyecto, incluidas la compilación, las pruebas, el empaquetado y otras operaciones.site
: Genere documentos e informes del proyecto, como informes de prueba, informes de cobertura de código, etc.
- Cada etapa contiene algunos complementos y objetivos, que
Maven
se ejecutan en un orden predefinido. Por ejemplo, enbuild
una etapa,Maven
los siguientes objetivos se ejecutan en secuencia:validate
: Verifique que el proyecto sea correcto.compile
: compila el código fuente del proyecto.test
: Ejecute los casos de prueba del proyecto.package
: Empaquete el proyecto en un archivo jar o war.verify
: Verifique si el resultado del empaquetado es correcto.install
: instale los resultados del empaquetado en el repositorio local de Maven.deploy
: implemente los resultados del empaquetado en el repositorio remoto de Maven.
idea
Descargue los complementos necesarios
Código fácil
Se utiliza para generar rápidamente directorios y códigos de proyectos relacionados con bases de datos.
MiBatisPlus
Solía saltar entre
java
ysql.xml
idea
Crear proyecto
ConfiguraciónServer URL
Dirección: https://start.aliyun.com/
Complete la información relacionada con el proyecto
Creación exitosa del proyecto (ejecutar y probar)
idea
Pruebe si la conexión es normalMySQL
Crear tabla de base de datos
Agregar MySQL
configuración de conexiones dentro del proyecto.
Buscar MySQL
paquetes de dependencia utilizados por la conexión
Escribir archivo de configuración de base de datos de conexión
Introducir (no olvidar pom.xml
)MySQL依赖包
Load Maven Changes
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
</dependency>
crear y escribirapplication.yml
camino:
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
Utilice complementos EasyCode
para crear rápidamente código relacionado con bases de datos operativas
Ver la estructura del directorio del proyecto después de la creación.
Java
Las aplicaciones suelen utilizar los siguientes componentes para organizar su código.
La relación entre estos componentes suele ser llamada
Controller
,Service
definidaService
dentroimpl
de la carpeta业务实现类
,业务实现类
llamadaDAO
,DAO
operación , que representa la estructura de la tabla de la base de datos.Mapper
SQL语句
Entity
实体类
En pocas palabras,
Controller
se utiliza para recibir solicitudes de usuarios,Service
implementar lógica empresarial,DAO
operar bases de datos yEntity
representar la estructura de la tabla de la base de datos.
/service/impl/xxx.java
Implementar una lógica de negocios específica enAgregar declaraciones
/resources/mapper/xxx.xml
para manipular datos ensql
Controller
: Controlador, utilizado para recibir solicitudes de usuarios y llamar a los métodos de procesamiento correspondientes para procesar las solicitudes y luego devolver los resultados de la respuesta. GeneralmenteSpring MVC
se implementa mediante un marco.Service
: Capa de servicio, utilizada para implementar lógica empresarial y llamadas paraDAO
realizar operaciones de datos. Generalmente contiene clases de interfaz y de implementación.DAO
: Objeto de acceso a datos, utilizado para operar la base de datos. Generalmente se implementa utilizando marcosMyBatis
comoHibernate
.Entity
: Clase de entidad, utilizada para representar la estructura de la tabla en la base de datos. Generalmente contiene atributos de clase ygetter/setter
métodos correspondientes.
Resuelva el problema de importar errores de biblioteca en el proyecto.
Usar https://mvnrepository.com/
solución de búsqueda
<!-- 解决完成后的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>
Intente ejecutar (error: no se introduce ninguna versión correspondiente)
<!-- <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>
Intenta ejecutar (faltan @MapperScan
anotaciones)
Aviso:
尽量选择使用量大的依赖包
<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);
}
}
- La anotación @SpringBootApplication es una anotación combinada que se utiliza para marcar
la clase principal de una aplicación Spring Boot. Incluye tres anotaciones:@Configuration
,@EnableAutoConfiguration
y@ComponentScan
- @Configuration: marca esta clase como fuente de una definición de bean en el contexto de la aplicación Spring. Es decir, los beans definidos en esta clase pueden ser administrados por el contenedor Spring.
- @EnableAutoConfiguration: configura automáticamente los beans requeridos por las aplicaciones Spring Boot.
- @ComponentScan: escanea otros componentes de la aplicación, como controladores, servicios y repositorios.
- @MapperScan es una anotación en el marco MyBatis. Su función es escanear la ruta del paquete especificada, encontrar todas las interfaces marcadas con la anotación @Mapper y crear estas interfaces en las clases de implementación de la interfaz MyBatis Mapper.
- Las instancias de estas clases de implementación de Mapper se pueden inyectar automáticamente donde se necesita Mapper, accediendo así cómodamente a la base de datos.
Intente ejecutar (la operación es exitosa, si finaliza inmediatamente después de la ejecución, es posible que spring-boot-starter-web
el paquete no se haya introducido)
Solo intenta importarlo
<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>
Interfaz de acceso
Solicitud fallida
Resuelva el error (indique MyBatis
dónde encontrar SQL
la declaración)
mybatis:
mapper-locations: classpath:**/mapper/*.xml
Volver a ejecutar y solicitar
código fuente completo
Estructura de directorios
Introducir dependencias: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>
Configuración relacionada con el servicio: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);
}
}
Capa de control de tabla (usuario):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));
}
}
Interfaz de servicio de mesa (usuario):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);
}
Clase de implementación del servicio de tabla (usuario):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;
}
}
Capa de acceso a la base de datos de la tabla (usuario):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);
}
Clase de entidad (usuario):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>