1.pom.xml导入依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.12</version>
</dependency>
<dependency>
<groupId>commons-dbutils</groupId>
<artifactId>commons-dbutils</artifactId>
<version>1.7</version>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.0.33</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.4.7</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.28</version>
</dependency>
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf</artifactId>
<version>3.1.1.RELEASE</version>
</dependency>
<!--bootstrap-->
<dependency>
<groupId>org.webjars</groupId>
<artifactId>bootstrap</artifactId>
<version>5.2.3</version>
</dependency>
<!--jQuery-->
<dependency>
<groupId>org.webjars</groupId>
<artifactId>jquery</artifactId>
<version>3.6.4</version>
</dependency>
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
<version>5.0.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<!-- 日期格式化依赖-->
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.4</version>
</dependency>
2.pojo包下person类
package com.example.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.Date;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Person implements Serializable {
private Integer id;
private String username;
private String password;
private Integer sex;
private Date birthday;
private String mobile;
private String address;
}
3.util包下导入thutils
4.dao包下dbutiles类
package com.example.dao;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import com.example.pojo.Person;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.sql.DataSource;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.List;
import java.util.Properties;
public class DBUtils {
//创建logback日志管理对象Logger(1分)
private static final Logger LOGGER= LoggerFactory.getLogger(DBUtils.class);
//声明静态成员DataSource(1分)
private static DataSource ds;
//static代码块中读取资源文件并为DataSouce对象赋值(日志处理异常)(1分,日志处理1分)
static {
Properties pro=new Properties();
try {
pro.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("db.properties"));
} catch (IOException e) {
LOGGER.debug("获取资源文件失败!");
}
try {
//通过资源文件创建数据源
ds= DruidDataSourceFactory.createDataSource(pro);
} catch (Exception e) {
LOGGER.debug("通过资源文件创建数据源失败!");
}
}
/**
* 创建通用的增删改方法(日志处理异常)(2分,日志1分)
* @param sql
* @param args
* @return
*/
public static int exectueCom(String sql,Object...args){
QueryRunner runner=new QueryRunner(ds);
int row=0;
try {
row = runner.update(sql, args);
} catch (SQLException e) {
LOGGER.debug("增,删,改执行失败,请检查sql语句和参数");
}
return row;
}
/**
* ⑤创建通用的查询(日志处理异常)(2分,日志1分)
* @param sql
* @param clazz
* @param args
* @return
* @param <T>
*/
public static <T> List<T> findAll(String sql, Class<T> clazz, Object...args){
QueryRunner runner=new QueryRunner(ds);
List<T> list=null;
try {
list=runner.query(sql,new BeanListHandler<>(clazz),args);
} catch (SQLException e) {
LOGGER.debug("查询所有执行失败,请检查sal语句!");
}
return list;
}
/**
* 查询单个数据
* @param sql
* @param clazz
* @param args
* @return
* @param <T>
*/
public static <T> T findOne(String sql,Class<T> clazz,Object...args){
QueryRunner runner=new QueryRunner(ds);
T t=null;
try {
t=runner.query(sql,new BeanHandler<>(clazz),args);
} catch (SQLException e) {
LOGGER.debug("查询所有执行失败,请检查sal语句!");
}
return t;
}
}
5.dao包下的接口
package com.example.dao;
import com.example.pojo.Person;
import java.util.List;
public interface IPersonDao {
String FIND_ALL="SELECT * FROM person";
String FIND_ONE="SELECT * FROM person WHERE id=?";
String DELETE="DELETE FROM person where id=?";
String INS="INSERT INTO person(username,password,sex,birthday,mobile,address) VALUES(?,?,?,?,?,?)";
//6)实现对某条数据的修改操作
String UPD="UPDATE person SET username=?,password=?,sex=?,birthday=?,mobile=?,address=? WHERE id=?";
String LOGIN="SELECT * FROM person WHERE username=? and password=?";
List<Person> selectAll();
Person selectONE(int id);
int delete(int id);
int add(Person person);
int update(Person person);
Person login(String username,String password);
List<Person> like(String mohu);
}
6.dao包下的接口实现类
package com.example.dao;
import com.example.pojo.Person;
import java.util.List;
public class PersonDao implements IPersonDao{
@Override
public List<Person> selectAll() {
return DBUtils.findAll(FIND_ALL,Person.class);
}
@Override
public Person selectONE(int id) {
return DBUtils.findOne(FIND_ONE, Person.class,id);
}
@Override
public int delete(int id) {
return DBUtils.exectueCom(DELETE,id);
}
@Override
public int add(Person person) {
return DBUtils.exectueCom(INS,person.getUsername(),
person.getPassword(),
person.getSex(),
person.getBirthday(),
person.getMobile(),
person.getAddress());
}
@Override
public int update(Person person) {
return DBUtils.exectueCom(UPD,person.getUsername(),
person.getPassword(),
person.getSex(),
person.getBirthday(),
person.getMobile(),
person.getAddress(),
person.getId()
);
}
@Override
public Person login(String username, String password) {
return DBUtils.findOne(LOGIN,Person.class,username,password);
}
@Override
public List<Person> like(String mohu) {
mohu=mohu==null ? "" :mohu;
return DBUtils.findAll("select * from person where username like '%"+mohu+"%'",Person.class);
}
}
7.导入
8.
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body onload="location='/tologin'">
</body>
</html>
9.
list.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="webjars/bootstrap/5.2.3/css/bootstrap.min.css">
</head>
<body>
<div class="container">
<form action="findAll" method="post">
<input type="text" name="mohu">
<button class="btn btn-success">搜索</button>
</form>
<table class="table table-bordered table-hover">
<tr>
<th>序号</th>
<th>编号</th>
<th>账号</th>
<th>性别</th>
<th>生日</th>
<th>手机</th>
<th>地址</th>
<th>
<button class="btn btn-success" onclick="location='toadd'">新增</button>
</th>
</tr>
<tr th:each="person:${ps}" th:object="${person}">
<td th:text="${personStat.count}"></td>
<td th:text="*{id}"></td>
<td th:text="*{username}"></td>
<td th:text="*{sex==0 ? '男':'女'}"></td>
<td th:text="*{birthday}"></td>
<td th:text="*{mobile}"></td>
<td th:text="*{address}"></td>
<td>
<a th:href="@{delete(pid=*{id})}">删除</a>
<a th:href="@{find(pid=*{id})}">修改</a>
</td>
</tr>
</table>
</div>
</body>
</html>
add.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="webjars/bootstrap/5.2.3/css/bootstrap.min.css">
</head>
<body>
<div class="container">
<form action="/baocun" method="post">
姓名:<input type="text" name="username"><br>
密码:<input type="password" name="password"><br>
性别:<input type="radio" name="sex" value="0">男
<input type="radio" name="sex" value="1">女<br>
手机:<input type="text" name="mobile"><br>
生日:<input type="text" name="birthday"><br>
地址:<input type="text" name="address"><br>
<button class="btn btn-success">提交</button>
</form>
</div>
</body>
</html>
update.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="webjars/bootstrap/5.2.3/css/bootstrap.min.css">
</head>
<body>
<div class="container">
<form action="/baocun" method="post" th:each="person:${person}" th:object="${person}">
<input type="hidden" name="id" th:value="*{id}" readonly>
姓名:<input type="text" name="username" th:value="*{username}"><br>
密码:<input type="password" name="password" th:value="*{password}"><br>
性别:<input type="radio" name="sex" value="0" th:checked="*{sex==0}">男
<input type="radio" name="sex" value="1" th:checked="*{sex==1}">女<br>
手机:<input type="text" name="mobile" th:value="*{mobile}"><br>
生日:<input type="text" name="birthday" th:value="*{birthday}"><br>
地址:<input type="text" name="address" th:value="*{address}"><br>
<button class="btn btn-success">提交</button>
</form>
</div>
</body>
</html>
login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>login</title>
<link rel="stylesheet" href="webjars/bootstrap/5.2.3/css/bootstrap.min.css">
</head>
<form action="login" method="post">
账号:<input type="text" name="username"><br>
密码:<input type="password" name="password"><br>
<button class="btn btn-success">登录</button>
<span th:utext="${mess}"></span>
</form>
<body>
</body>
</html>
10.servlet包下的服务类
package com.example.servlet;
import com.example.dao.IPersonDao;
import com.example.dao.PersonDao;
import com.example.pojo.Person;
import com.example.util.ThUtils;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.converters.DateConverter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.thymeleaf.context.Context;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Date;
import java.util.Map;
@WebServlet(urlPatterns = {"/toadd","/tologin","/login","/baocun","/delete","/find","/findAll"})
public class HelloServlet extends HttpServlet {
private static final Logger LOGGER= LoggerFactory.getLogger(HelloServlet.class);
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//创建一个实例化对象
IPersonDao personDao=new PersonDao();
//创建传值对象
Context context=new Context();
//读取执行路径
String servletPath = req.getServletPath();
System.out.println(servletPath);
switch (servletPath){
case "/login"->{
//接收账号和密码
String username = req.getParameter("username");
String password = req.getParameter("password");
//调用DAO进行判断
Person person=personDao.login(username,password);
//判断是否成功
if (person!=null){
resp.sendRedirect("findAll");
}else{
context.setVariable("mess","<font color='red'>对不起,登录失败</font>");
ThUtils.print("/view/login.html",context,resp);
}
}
case "/tologin"->{
ThUtils.print("/view/login.html",context,resp);
}
case "/findAll"->{
String mohu = req.getParameter("mohu");
context.setVariable("ps",personDao.like(mohu));
//传递到页面
ThUtils.print("/view/list.html",context,resp);
}
case "/delete"->{
//接收页面的id
String pid = req.getParameter("pid");
//转换数据类型
Integer id=Integer.parseInt(pid);
//接收返回行数
int m=personDao.delete(id);
//判断返回行数,执行是否成功
if(m==1){
//执行成功重新查询所有
resp.sendRedirect("findAll");
}
}
case "/toadd"->{
ThUtils.print("view/add.html",context,resp);
}
case "/baocun"->{
//创建一个日期转换器
DateConverter dateConverter = new DateConverter();
//设置格式
dateConverter.setPatterns(new String[]{"yyyy-MM-dd"});
//注册格式
ConvertUtils.register(dateConverter, Date.class);
Map map=req.getParameterMap();
Person person=new Person();
try {
BeanUtils.populate(person,map);
} catch (IllegalAccessException e) {
LOGGER.debug("参数异常!");
} catch (InvocationTargetException e) {
LOGGER.debug("运行时异常!");
}
int m=0;
//判断用户ID是否为空或0,如果是即新增,否则修改
if (person.getId()==null || person.getId()==0){
m=personDao.add(person);
}else{
m=personDao.update(person);
}
//判断返回行数是否执行成功
if(m==1){
//重新查询所有
resp.sendRedirect("findAll");
}
}
case "/find"->{
//接收页面的id
String pid = req.getParameter("pid");
//转换数据类型
Integer id=Integer.parseInt(pid);
Person person=personDao.selectONE(id);
context.setVariable("person",person);
ThUtils.print("/view/update.html",context,resp);
}
}
}
}