开发基于Mysql+Servlet+JSP的作业管理系统(三)
开发基于Mysql+Servlet+JSP的作业管理系统(三)
一、使用project/module模式
1.创建maven工程
(1)new→project,选择maven,创建一个空的maven工程:
(2)填写名称、选择路径:
(3)结果如下:
2.创建module
(1)创建一个空的module:
(2)指定maven,点击next:
(3)指定Parent、编辑名称:
(4)如图可见新建的module,删除原有的src文件夹:
(5)使用如上同样的方法,创建 core 及 db 两个 module。
core: 用来包含一些常用变量
db:数据层,与数据库连接有关
3.module间的依赖关系
JaveEE 依赖 db,db 依赖 core,core、db、JaveEE 的 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">
<parent>
<artifactId>Homework_System_3.0</artifactId>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>core</artifactId>
</project>
<?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">
<parent>
<artifactId>Homework_System_3.0</artifactId>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>db</artifactId>
<dependencies>
<dependency>
<groupId>org.example</groupId>
<artifactId>core</artifactId>
</dependency>
</dependencies>
</project>
<?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">
<parent>
<artifactId>Homework_System_3.0</artifactId>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>JavaEE</artifactId>
<dependencies>
<dependency>
<groupId>org.example</groupId>
<artifactId>db</artifactId>
</dependency>
</dependencies>
</project>
4.迁移改造好的maven工程到该项目中
(1)目录如下所示:
(2)在core、db、JaveEE 的 pom.xml中添加如下依赖:
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
5.以module的形式运行项目,改造成功
若因Java版本报错,在JaveEE的pom.xml文件中添加:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.encoding>UTF-8</maven.compiler.encoding>
<java.version>1.8</java.version>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
二、添加数据库连接池
1.在JavaEE的pom.xml文件中添加依赖
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>3.4.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.22</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-log4j12 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.22</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-simple -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.22</version>
</dependency>
2.在Jdbc中新建JDBCUtils.class
package Jdbc;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.sql.DataSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
/**
*用于获取数据库连接对象的工具类。
*/
public class JDBCUtils {
private static DataSource dataSource;
private static ThreadLocal<Connection> tl = new ThreadLocal<>();
private static final Object obj = new Object();
private static final Logger log = LoggerFactory.getLogger(JDBCUtils.class);
static {
init();
}
/**
*获取数据库连接对象的方法,线程安全
*/
public static Connection getConnection() throws SQLException {
// 从当前线程中获取连接对象
Connection connection = tl.get();
// 判断为空的话,创建连接并绑定到当前线程
if(connection == null) {
synchronized(obj) {
if(tl.get() == null) {
connection = createConnection();
tl.set(connection);
}
}
}
return connection;
}
/**
*释放资源
*/
public static void release(Connection conn, Statement statement, ResultSet resultSet) {
if(resultSet != null) {
try {
resultSet.close();
} catch(SQLException e) {
log.error("关闭ResultSet对象异常", e);
}
}
if(statement != null) {
try {
statement.close();
} catch(SQLException e) {
log.error("关闭Statement对象异常", e);
}
}
// 注意:这里不关闭连接
if(conn != null) {
try {
conn.close();
tl.remove();
} catch(SQLException e) {
log.error("关闭Connection对象异常", e);
}
}
}
/**
*开启事务
*/
public static void startTransaction() throws SQLException {
getConnection().setAutoCommit(false);
}
/**
*提交事务
*/
public static void commit() {
Connection connection = tl.get();
if(connection != null) {
try {
connection.commit();
connection.setAutoCommit(true);
} catch(SQLException e) {
log.error("提交事务失败", e);
}
}
}
/**
*回滚事务
*/
public static void rollback() {
Connection connection = tl.get();
if(connection != null) {
try {
connection.rollback();
connection.setAutoCommit(true);
} catch(SQLException e) {
log.error("回滚事务失败", e);
}
}
}
public static DataSource getDataSource() {
return dataSource;
}
public static void setDataSource(DataSource dataSource) {
JDBCUtils.dataSource = dataSource;
tl.remove();
}
/**
*创建数据库连接
*/
private static Connection createConnection() throws SQLException {
if(dataSource == null) {
throw new RuntimeException("创建数据源失败");
}
Connection conn = null;
// 获得连接
conn = dataSource.getConnection();
return conn;
}
/**
*根据指定配置文件创建数据源对象
*/
private static void init() {
try {
HikariConfig config = new HikariConfig("/hikari.properties");
dataSource = new HikariDataSource(config);
} catch(Exception e) {
log.error("创建数据源失败", e);
}
}
}
3.在src/main/resources下添加hikari.properties
根据本地数据库名称、用户名称、密码、驱动名称改变一下内容
jdbcUrl=jdbc:mysql://localhost:3306/mysql_database?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=true
username=root
password=123456
driverClassName=com.mysql.cj.jdbc.Driver
4.在StudentJdbc.class使用示例:
public void InsertStudent(Student student) {
Connection connection = null;
PreparedStatement stmt = null;
String sql;
sql = "INSERT INTO STUDENT VALUES (?)";
try {
// 获得连接
connection = JDBCUtils.getConnection();
// 开启事务设置非自动提交
JDBCUtils.startTransaction();
// 获得Statement对象
stmt = connection.prepareStatement(sql);
stmt.setString(1, student.getStudent_name());
stmt.executeUpdate();
// 提交事务
JDBCUtils.commit();
} catch(Exception e) {
JDBCUtils.rollback();
} finally {
// 释放资源
JDBCUtils.release(connection, stmt, null);
}
}
public List<Homework> QueryHomework(Student student) {
Connection connection = null;
PreparedStatement stmt = null;
List<Homework> homework_list = new ArrayList<>();
String sql;
sql = "SELECT * FROM HOMEWORK WHERE HOMEWORK.TEACHER_NAME IN (SELECT TEACH.TEACHER_NAME FROM TEACH WHERE STUDENT_NAME=?)";
try {
// 获得连接
connection = JDBCUtils.getConnection();
// 开启事务设置非自动提交
JDBCUtils.startTransaction();
// 获得Statement对象
stmt = connection.prepareStatement(sql);
stmt.setString(1, student.getStudent_name());
ResultSet rs = stmt.executeQuery();
while (rs.next()) {
Homework homework = new Homework();
homework.setHomework_title(rs.getString("homework_title"));
homework.setTeacher_name(rs.getString("teacher_name"));
homework_list.add(homework);
}
} catch(Exception e) {
JDBCUtils.rollback();
} finally {
// 释放资源
JDBCUtils.release(connection, stmt, null);
}
return homework_list;
}
三、问题及解决
问题
在 pom.xml 文件中添加依赖后,运行后仍因 slf4j-api、slf4j-log4j12、slf4j-simple 报错
原因
虽然添加了依赖,但是 lib 文件夹中仍未引入 jar 包,如图为引入 jar 包效果:
解决
(1)先移除
(2)再添加