开发基于Mysql+Servlet+JSP的作业管理系统(三)

开发基于Mysql+Servlet+JSP的作业管理系统(三)

一、使用project/module模式

1.创建maven工程

(1)new→project,选择maven,创建一个空的maven工程:
选择maven(2)填写名称、选择路径:
名称路径
(3)结果如下:
结果

2.创建module

(1)创建一个空的module:
module
(2)指定maven,点击next:
next
(3)指定Parent、编辑名称: Parent及名称
(4)如图可见新建的module,删除原有的src文件夹:
新建module
(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 包效果:
lib

解决

(1)先移除
移除
(2)再添加
添加1
添加2
添加3

四、上一篇

开发基于Mysql+Servlet+JSP的作业管理系统(二)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值