JavaWeb:(练习)十三、mybatis练习
JavaWeb:(练习)十三、mybatis练习
一、说明
记录学习mybatis框架的学习代码。
二、数据库设计
CREATE DATABASE `ffycdb`;
CREATE TABLE `grade` (
`grade_id` INT NOT NULL AUTO_INCREMENT,
`grade_name` VARCHAR(20) NOT NULL,
PRIMARY KEY (`grade_id`)
)
CREATE TABLE `student` (
`student_id` INT NOT NULL AUTO_INCREMENT,
`student_number` VARCHAR(20) NOT NULL,
`student_name` VARCHAR(10) NOT NULL,
`student_gender` VARCHAR(2) NOT NULL,
`student_grade` INT DEFAULT NULL,
`student_phone` VARCHAR(11) DEFAULT NULL,
`student_address` VARCHAR(100) DEFAULT NULL,
PRIMARY KEY (`student_id`),
KEY `fk_student_grade_id` (`student_grade`),
CONSTRAINT `fk_student_grade_id` FOREIGN KEY (`student_grade`) REFERENCES `grade` (`grade_id`)
三、练习idea代码
1、dao
1)GradeDao
package com.ffyc.mybatisPro.dao;
import com.ffyc.mybatisPro.model.Grade;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import java.util.List;
public interface GradeDao {
// 查询单个
Grade findGradeById(int id);
// 查询全部:方式一
List<Grade> findGrades();
// 查询全部:方式二
List<Grade> findGradesOther();
// 插入方式一
// void insertGrade(@Param("name") String name);
// 插入方式二
void insertGrade(Grade grade);
// 修改
// void updateGrade(Grade grade); // 没有返回值
int updateGrade(Grade grade); // 有返回值
// 删除
// void deleteGrade(int gradeId); // 没有返回值
int deleteGrade(int gradeId); // 有返回值
// 统计查询到的数量
int checkGrade(@Param("gradeId") String gradeId);
// 注解标签
@Select("select * from grade")
List<Grade> selectGrades();
}
2)StudentDao
package com.ffyc.mybatisPro.dao;
import com.ffyc.mybatisPro.model.Student;
import java.util.List;
public interface StudentDao {
// 查询全部:方式一
List<Student> findStudents();
// 查询全部:方式二
List<Student> findStudentsOther();
// 动态SQL:if / where
List<Student> findStudentsBySomething(Student student);
// 动态SQL:trim
List<Student> findStudentsBySomethingOfTrim(Student student);
// 动态SQL:choose / when
List<Student> findStudentsBySomethingOfWhen(Student student);
// 动态SQL:set
int updateStudentOfSet(Student student);
// 动态SQL:set / trim
int updateStudentOfSetAndTrim(Student student);
// 动态SQL:foreach
int deleteStudentsOfForeach(Integer[] array);
}
2、demo
1)demo1
package com.ffyc.mybatisPro.demo;
import com.ffyc.mybatisPro.model.Grade;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
public class Demo1 {
public static void main(String[] args) throws IOException {
String resource = "mybatis.xml";
// 读取mybatis配置文件
InputStream inputStream = Resources.getResourceAsStream(resource);
// 构造出一个 SqlSessionFactory 对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// 创建 SqlSession 对象
SqlSession sqlSession = sqlSessionFactory.openSession();
Grade grade = sqlSession.selectOne("com.grade.findGrade", 2);
System.out.println(grade);
sqlSession.close();
}
}
2)demo2
package com.ffyc.mybatisPro.demo;
import com.ffyc.mybatisPro.dao.GradeDao;
import com.ffyc.mybatisPro.model.Grade;
import com.ffyc.mybatisPro.util.MybatisUtil;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.session.SqlSession;
import java.util.List;
public class Demo2 {
public static void main(String[] args) {
SqlSession sqlSession = MybatisUtil.getSqlSession();
//生成一个接口的代理对象,由代理对象去实际调用接口中与映射文件中对应的sql
GradeDao gradeDao = sqlSession.getMapper(GradeDao.class);
System.out.println("----------------------------------------------------");
// 查询一个grade
Grade grade1 = gradeDao.findGradeById(1);
System.out.println(1);
System.out.println("----------------------------------------------------");
// 查询多个grade(所有)
List<Grade> grades = gradeDao.findGrades();
System.out.println(grades);
System.out.println("----------------------------------------------------");
/*
// 插入方式一
System.out.println("插入方式一");
gradeDao.insertGrade("五年级");
sqlSession.commit();
System.out.println("----------------------------------------------------");
*/
// 插入方式二
System.out.println("插入方式二");
Grade grade2 = new Grade();
grade2.setGradeName("六年级");
gradeDao.insertGrade(grade2);
System.out.println("----------------------------------------------------");
// 修改
Grade grade3 = new Grade(9,"五年级");
int count1 = gradeDao.updateGrade(grade3);
System.out.println("修改的条数:" + count1);
System.out.println("----------------------------------------------------");
int count2 = gradeDao.deleteGrade(10);
System.out.println("删除的条数:" + count2);
System.out.println("----------------------------------------------------");
sqlSession.commit();
sqlSession.close();
}
}
3)demo3
package com.ffyc.mybatisPro.demo;
import com.ffyc.mybatisPro.dao.GradeDao;
import com.ffyc.mybatisPro.dao.StudentDao;
import com.ffyc.mybatisPro.model.Grade;
import com.ffyc.mybatisPro.model.Student;
import com.ffyc.mybatisPro.util.MybatisUtil;
import org.apache.ibatis.session.SqlSession;
import java.util.List;
public class Demo3 {
public static void main(String[] args) {
SqlSession sqlSession = MybatisUtil.getSqlSession();
/* System.out.println("----------------------------------------------------");
//生成一个接口的代理对象,由代理对象去实际调用接口中与映射文件中对应的sql
StudentDao studentDao = sqlSession.getMapper(StudentDao.class);
List<Student> students = studentDao.findStudents();
for (Student student : students) {
System.out.println(student);
}*/
/* System.out.println("----------------------------------------------------");
//生成一个接口的代理对象,由代理对象去实际调用接口中与映射文件中对应的sql
StudentDao studentDao = sqlSession.getMapper(StudentDao.class);
List<Student> students = studentDao.findStudentsOther();
for (Student student : students) {
System.out.println(student);
}*/
/* System.out.println("----------------------------------------------------");
GradeDao gradeDao = sqlSession.getMapper(GradeDao.class);
List<Grade> grades = gradeDao.findGrades();
for (Grade grade : grades) {
System.out.println(grade);
}*/
System.out.println("----------------------------------------------------");
GradeDao gradeDao = sqlSession.getMapper(GradeDao.class);
List<Grade> grades = gradeDao.findGradesOther();
for (Grade grade : grades) {
System.out.println(grade);
}
}
}
4)demo4
package com.ffyc.mybatisPro.demo;
import com.ffyc.mybatisPro.dao.GradeDao;
import com.ffyc.mybatisPro.dao.StudentDao;
import com.ffyc.mybatisPro.model.Grade;
import com.ffyc.mybatisPro.model.Student;
import com.ffyc.mybatisPro.util.MybatisUtil;
import org.apache.ibatis.session.SqlSession;
import java.util.List;
public class Demo4 {
public static void main(String[] args) {
SqlSession sqlSession = MybatisUtil.getSqlSession();
GradeDao gradeDao = sqlSession.getMapper(GradeDao.class);
/* System.out.println("------------------------------------------------------------");
// 注解标签
List<Grade> grades = gradeDao.selectGrades();
for (Grade grade : grades) {
System.out.println(grade);
}*/
/* System.out.println("------------------------------------------------------------");
// 动态SQL:if / where
StudentDao studentDao = sqlSession.getMapper(StudentDao.class);
Student student = new Student();
student.setStudentGender("男");
List<Student> students = studentDao.findStudentsBySomething(student);
for (Student stu : students) {
System.out.println(stu);
}*/
/* System.out.println("------------------------------------------------------------");
// 动态SQL:trim /
StudentDao studentDao = sqlSession.getMapper(StudentDao.class);
Student student = new Student();
student.setStudentGender("男");
List<Student> students = studentDao.findStudentsBySomethingOfTrim(student);
for (Student stu : students) {
System.out.println(stu);
}*/
/* System.out.println("------------------------------------------------------------");
// 动态SQL:choose / when
StudentDao studentDao = sqlSession.getMapper(StudentDao.class);
Student student = new Student();
student.setStudentGender("男");
List<Student> students = studentDao.findStudentsBySomethingOfWhen(student);
for (Student stu : students) {
System.out.println(stu);
}*/
/* System.out.println("------------------------------------------------------------");
// 动态SQL:set
StudentDao studentDao = sqlSession.getMapper(StudentDao.class);
Student student = new Student();
student.setStudentId(2);
student.setStudentName("222");
student.setStudentGender("男");
int number = studentDao.updateStudentOfSet(student);
sqlSession.commit();
System.out.println("修改了 " + number + " 条数据");*/
/* System.out.println("------------------------------------------------------------");
// 动态SQL:set / trim
StudentDao studentDao = sqlSession.getMapper(StudentDao.class);
Student student = new Student();
student.setStudentId(2);
student.setStudentName("333");
student.setStudentGender("男");
int number = studentDao.updateStudentOfSetAndTrim(student);
sqlSession.commit();
System.out.println("修改了 " + number + " 条数据");*/
System.out.println("------------------------------------------------------------");
// 动态SQL:foreach
StudentDao studentDao = sqlSession.getMapper(StudentDao.class);
Integer[] array = {3,4};
int number = studentDao.deleteStudentsOfForeach(array);
sqlSession.commit();
System.out.println("删除了 " + number + " 条数据");
}
}
5)demo5
package com.ffyc.mybatisPro.demo;
public class Demo5 {
public static void main(String[] args) {
}
}
3、model
1)Grade
package com.ffyc.mybatisPro.model;
import java.util.List;
public class Grade {
private int gradeId;
private String gradeName;
private List<Student> students;
public Grade() {
}
public Grade(int gradeId, String gradeName) {
this.gradeId = gradeId;
this.gradeName = gradeName;
}
public int getGradeId() {
return gradeId;
}
public void setGradeId(int gradeId) {
this.gradeId = gradeId;
}
public String getGradeName() {
return gradeName;
}
public void setGradeName(String gradeName) {
this.gradeName = gradeName;
}
public List<Student> getStudents() {
return students;
}
public void setStudents(List<Student> students) {
this.students = students;
}
@Override
public String toString() {
return "Grade{" +
"gradeId=" + gradeId +
", gradeName='" + gradeName + '\'' +
", students=" + students +
'}';
}
}
2)Student
package com.ffyc.mybatisPro.model;
public class Student {
private Integer studentId;
private String studentNumber;
private String studentName;
private String studentGender;
private Grade grade;
private String phone;
private String address;
public Student() {
}
public Student(int studentId, String studentNumber, String studentName, String studentGender, Grade grade, String phone, String address) {
this.studentId = studentId;
this.studentNumber = studentNumber;
this.studentName = studentName;
this.studentGender = studentGender;
this.grade = grade;
this.phone = phone;
this.address = address;
}
public Integer getStudentId() {
return studentId;
}
public void setStudentId(Integer studentId) {
this.studentId = studentId;
}
public String getStudentNumber() {
return studentNumber;
}
public void setStudentNumber(String studentNumber) {
this.studentNumber = studentNumber;
}
public String getStudentName() {
return studentName;
}
public void setStudentName(String studentName) {
this.studentName = studentName;
}
public String getStudentGender() {
return studentGender;
}
public void setStudentGender(String studentGender) {
this.studentGender = studentGender;
}
public Grade getGrade() {
return grade;
}
public void setGrade(Grade grade) {
this.grade = grade;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "Student{" +
"studentId=" + studentId +
", studentNumber='" + studentNumber + '\'' +
", studentName='" + studentName + '\'' +
", studentGender='" + studentGender + '\'' +
", grade=" + grade +
", phone='" + phone + '\'' +
", address='" + address + '\'' +
'}';
}
}
4、util
1)MybatisUtil
package com.ffyc.mybatisPro.util;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
public class MybatisUtil {
static SqlSessionFactory sqlSessionFactory;
//在MybatisUtil第一次加载时,初始化好SqlSessionFactory
static {
String resource = "mybatis.xml";
InputStream inputStream = null;
try {
inputStream = Resources.getResourceAsStream(resource);
} catch (IOException e) {
e.printStackTrace();
}
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession();
}
}
5、resources/mapper
1)GradeMapper.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.ffyc.mybatisPro.dao.GradeDao">
<!-- 查询单条数据 -->
<select id="findGradeById" parameterType="int" resultType="Grade">
select * from grade where grade_id = #{id}
</select>
<!-- 查询全部数据:方式一 -->
<resultMap id="gradeMap" type="Grade">
<id column="grade_id" property="gradeId"></id>
<result column="grade_name" property="gradeName"></result>
<collection property="students" javaType="list" ofType="Student">
<result column="student_id" property="studentId"></result>
<result column="student_number" property="studentNumber"></result>
<result column="student_name" property="studentName"></result>
<result column="student_gender" property="studentGender"></result>
<result column="student_phone" property="phone"></result>
<result column="student_address" property="address"></result>
</collection>
</resultMap>
<select id="findGrades" resultMap="gradeMap">
SELECT g.grade_id, g.grade_name, s.student_id, s.student_number, s.student_name, s.student_gender, s.student_phone, s.student_address
FROM grade g
LEFT JOIN student s ON s.student_grade = g.grade_id
</select>
<!-- 查询全部数据:方式二 -->
<resultMap id="gradeMapOther" type="Grade">
<id column="grade_id" property="gradeId"></id>
<result column="grade_name" property="gradeName"></result>
<collection property="students" javaType="list" ofType="Student" column="grade_id" select="findStudentsById">
</collection>
</resultMap>
<select id="findGradesOther" resultMap="gradeMapOther">
select *
FROM grade
</select>
<select id="findStudentsById" parameterType="int" resultType="Student" >
select * from student where student_grade = #{grade_id}
</select>
<!-- "*******************************************************************************************************" -->
<!-- 插入方式一 -->
<!-- <select id="insertGrade">
insert into grade (grade_name) value (#{name})
</select>-->
<!-- 插入方式二 -->
<select id="insertGrade">
insert into grade (grade_name) value(#{gradeName})
</select>
<!-- "*******************************************************************************************************" -->
<!-- 修改数据 -->
<update id="updateGrade">
update grade set grade_name = #{gradeName} where grade_id = #{gradeId}
</update>
<!-- "*******************************************************************************************************" -->
<!-- 删除数据 -->
<delete id="deleteGrade">
delete from grade where grade_id = #{gradeId}
</delete>
<!-- "*******************************************************************************************************" -->
<!-- 统计查询到的数量 -->
<select id="checkGrade" resultType="java.lang.Integer">
select count(*) from grade where grade_id = #{gradeId}
</select>
</mapper>
2)StudentMapper.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.ffyc.mybatisPro.dao.StudentDao">
<!-- 查询所有学生 -->
<!-- 自定义映射结果集 -->
<resultMap id="studentMap" type="Student">
<id column="student_id" property="studentId"></id>
<result column="student_number" property="studentNumber"></result>
<result column="student_name" property="studentName"></result>
<result column="student_gender" property="studentGender"></result>
<result column="student_phone" property="phone"></result>
<result column="student_address" property="address"></result>
<association property="grade" javaType="Grade">
<result column="grade_id" property="gradeId"></result>
<result column="grade_name" property="gradeName"></result>
</association>
</resultMap>
<select id="findStudents" resultMap="studentMap">
SELECT s.student_id, s.student_number, s.student_name, s.student_gender, g.grade_id, g.grade_name, s.student_phone, s.student_address
FROM student s
LEFT JOIN grade g ON s.student_grade = g.grade_id
</select>
<!-- 分开查询 -->
<resultMap id="studentMapOther" type="Student">
<id column="student_id" property="studentId"></id>
<result column="student_number" property="studentNumber"></result>
<result column="student_name" property="studentName"></result>
<result column="student_gender" property="studentGender"></result>
<result column="student_phone" property="phone"></result>
<result column="student_address" property="address"></result>
<association property="grade" javaType="Grade" select="findGradeById" column="student_grade" >
<result column="grade_id" property="gradeId"></result>
<result column="grade_name" property="gradeName"></result>
</association>
</resultMap>
<select id="findStudentsOther" resultMap="studentMapOther">
select *
FROM student
</select>
<select id="findGradeById" parameterType="int" resultType="Grade" >
select *
from grade where grade_id = #{student_grade}
</select>
<!-- "*******************************************************************************************************" -->
<!-- 动态SQL:if / where -->
<select id="findStudentsBySomething" parameterType="Student" resultType="Student">
SELECT * from student
<where>
<if test="studentId!=null">
and student_id = #{studentId}
</if>
<if test="studentNumber!=null">
and student_number = #{studentNumber}
</if>
<if test="studentName!=null">
and student_name = #{studentName}
</if>
<if test="studentGender!=null">
and student_gender = #{studentGender}
</if>
</where>
</select>
<!-- 动态SQL:trim -->
<select id="findStudentsBySomethingOfTrim" parameterType="Student" resultType="Student">
SELECT * from student
<trim prefix="where" prefixOverrides="and|or">
<if test="studentId!=null">
and student_id = #{studentId}
</if>
<if test="studentNumber!=null">
and student_number = #{studentNumber}
</if>
<if test="studentName!=null">
and student_name = #{studentName}
</if>
<if test="studentGender!=null">
and student_gender = #{studentGender}
</if>
</trim>
</select>
<!-- 动态SQL:choose / when -->
<select id="findStudentsBySomethingOfWhen" resultType="Student">
select * from student
<trim prefix="where" prefixOverrides="and|or">
<choose>
<when test="studentName!=null">
student_name = #{studentName}
</when>
<otherwise>
student_name = "乙"
</otherwise>
</choose>
</trim>
</select>
<!-- 动态SQL:set -->
<update id="updateStudentOfSet">
update student
<set>
<if test="studentId!=null">
student_id = #{studentId},
</if>
<if test="studentNumber!=null">
student_number = #{studentNumber},
</if>
<if test="studentName!=null">
student_name = #{studentName},
</if>
<if test="studentGender!=null">
student_gender = #{studentGender}
</if>
</set>
where student_id = #{studentId}
</update>
<!-- 动态SQL:set / trim -->
<update id="updateStudentOfSetAndTrim">
update student
<trim prefix="set" suffixOverrides=",">
<if test="studentId!=null">
student_id = #{studentId},
</if>
<if test="studentNumber!=null">
student_number = #{studentNumber},
</if>
<if test="studentName!=null">
student_name = #{studentName},
</if>
<if test="studentGender!=null">
student_gender = #{studentGender}
</if>
</trim>
where student_id = #{studentId}
</update>
<!-- 动态SQL:foreach -->
<delete id="deleteStudentsOfForeach">
delete from student where student_id in
<foreach collection="array" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
</mapper>
6、resources
1)config.properties
dirverClassName=com.mysql.cj.jdbc.Driver
url = jdbc:mysql://127.0.0.1:3306/feifan_test?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
username = root
password = root
2)mybatis.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<properties resource="config.properties"></properties>
<settings>
<!-- <setting name="logImpl" value="STDOUT_LOGGING"/>-->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<typeAliases>
<typeAlias type="com.ffyc.mybatisPro.model.Grade" alias="Grade"></typeAlias>
<typeAlias type="com.ffyc.mybatisPro.model.Student" alias="Student"></typeAlias>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!-- <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/studentmanagedb?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai"/>
<property name="username" value="root"/>
<property name="password" value="root"/>-->
<property name="driver" value="${dirverClassName}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mapper/GradeMapper.xml"></mapper>
<mapper resource="mapper/StudentMapper.xml"></mapper>
</mappers>
</configuration>xxxxxxxxxx <?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration> <properties resource="config.properties"></properties> <settings><!-- <setting name="logImpl" value="STDOUT_LOGGING"/>--> <setting name="mapUnderscoreToCamelCase" value="true"/> </settings> <typeAliases> <typeAlias type="com.ffyc.mybatisPro.model.Grade" alias="Grade"></typeAlias> <typeAlias type="com.ffyc.mybatisPro.model.Student" alias="Student"></typeAlias> </typeAliases> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"><!-- <property name="driver" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://127.0.0.1:3306/studentmanagedb?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai"/> <property name="username" value="root"/> <property name="password" value="root"/>--> <property name="driver" value="${dirverClassName}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments> <mappers> <mapper resource="mapper/GradeMapper.xml"></mapper> <mapper resource="mapper/StudentMapper.xml"></mapper> </mappers></configuration>23421xml
7、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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>mybatisPro</artifactId>
<version>1.0</version>
<name>mybatisPro</name>
<packaging>war</packaging>
<properties>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.source>1.8</maven.compiler.source>
<junit.version>5.6.2</junit.version>
</properties>
<dependencies>
<!-- mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.2</version>
</dependency>
<!-- mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.3.0</version>
</plugin>
</plugins>
</build>
</project>