参考Eclipse配置:https://blog.csdn.net/man_zuo/article/details/80245685
JDBC的使用:
https://blog.csdn.net/qq_22172133/article/details/81266048
数据库连接池c3p0 jar包:
https://mvnrepository.com/search?q=c3p0
文件目录:
后台Servlet:接口参数name和password
package test;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class RegisterDemo extends HttpServlet{
public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException{
doPost(request,response);
}
public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException{
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html");
String name = request.getParameter("name");
String password = request.getParameter("password");
PrintWriter out = response.getWriter();
IsRegisterUsers isregisterusers=new IsRegisterUsers();
HashMap data=isregisterusers.isUsers(name,password);
/**
Iterator it = data.keySet().iterator();
while (it.hasNext()) {
// 遍历 Map
Object key = it.next();
Object val = data.get(key);
System.out.println(key + ":" + val);
}
*/
if(data!=null) {
String successData = "{\"code\":\"200\",\"name\":\""+data.get("name")+"\",\"password\":\""+data.get("password")+"\",\"token\":\""+data.get("token")+"\"}";
out.write(successData);
}else{
String failData = "{\"code\":400,\"result\":\"账号或密码错误\"}";
out.write(failData);
}
}
}
自定义的工具类IsRegisterUsers:
package test;
import java.sql.*;
import java.util.HashMap;
public class IsRegisterUsers {
public HashMap isUsers(String name,String password) {
HashMap data=new HashMap();
try{
//DBUtils dbutils=new DBUtils();
Connection connection=DBUtils_c3p0.getConnection();
System.out.println("实例化Statement对象");
String sql = "select name,password,token from RegisterUsers where name=? and password=?";
PreparedStatement preparedstatement = connection.prepareStatement(sql);
preparedstatement.setString(1, name);
preparedstatement.setString(2, password);
ResultSet result = preparedstatement.executeQuery();
while(result.next()) {
String token=result.getString("token");
data.put("token", token);
data.put("name", result.getString("name"));
data.put("password", result.getString("password"));
System.out.print("姓名: " + name);
System.out.print(", 密码: " + password);
System.out.print(", token值: " + token);
System.out.print("\n");
}
// 完成后关闭
DBUtils_c3p0.release(connection, preparedstatement, result);
}catch(Exception e) {
e.printStackTrace();
}
return data;
}
}
工具类DBUtils:导入mysql-connector-java-5.1.39-bin.jar包
package test;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;
/**
*提供数据库连接connection对象
*/
public class DBUtils {
private static String JDBC_DRIVER;
private static String DB_URL;
private static String USER;
private static String PASS;
static {
try {
//通过读取同级目录下的配置文档db.properties获取数据库参数
InputStream in = DBUtils.class.getClassLoader().getResourceAsStream("db.properties");
Properties prop=new Properties();
prop.load(in);
JDBC_DRIVER=prop.getProperty("driver");
DB_URL=prop.getProperty("url");
USER=prop.getProperty("username");
PASS=prop.getProperty("password");
System.out.println("注册 JDBC 驱动...");
Class.forName(JDBC_DRIVER);
}catch(Exception e) {
e.printStackTrace();;
}
}
//MySQL 8.0 以下版本 - JDBC 驱动名及数据库 URL
//static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
//static final String DB_URL = "jdbc:mysql://localhost:3306/RUNOOB";
// MySQL 8.0 以上版本 - JDBC 驱动名及数据库 URL
//static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver";
//static final String DB_URL = "jdbc:mysql://localhost:3306/RUNOOB?useSSL=false&serverTimezone=UTC";
// 数据库的用户名与密码,需要根据自己的设置
//static final String USER = "zhangdingyi";
//static final String PASS = "Ensky123.";
public static Connection getConnection() throws SQLException{
return DriverManager.getConnection(DB_URL,USER,PASS);
}
public static void release(Connection connection,Statement statement,ResultSet result) {
// 关闭释放资源
try{
if(result!=null) {result.close();result=null;}
if(statement!=null) {statement.close();statement=null;}
if(connection!=null) {connection.close();connection=null;}
}catch(SQLException e){
e.printStackTrace();
}
System.out.println("断开数据库连接 Goodbye!");
}
}
添加连接池jar包c3p0,改造一下DBUtils -> DBUtils_c3p0:
package test;
import java.sql.*;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class DBUtils_c3p0 {
private static ComboPooledDataSource poolLink=new ComboPooledDataSource("RegisterDemoDB");
private static Connection conn;
public static Connection getConnection(){
try {
/**不用配置文档c3p0-config.xml的情况,用set方法
poolLink.setDriverClass("com.mysql.jdbc.Driver");
poolLink.setJdbcUrl("jdbc:mysql://localhost:3306/RUNOOB");
poolLink.setUser("zhangdingyi");
poolLink.setPassword("Ensky123.");
poolLink.setInitialPoolSize(3);
poolLink.setMaxPoolSize(20);
poolLink.setMaxIdleTime(60);
*/
conn=poolLink.getConnection();
}catch(Exception e) {
e.printStackTrace();
}
return conn;
}
public static void release(Connection connection,Statement statement,ResultSet result) {
// 关闭释放数据库连接资源
try{
if(result!=null) {result.close();result=null;}
if(statement!=null) {statement.close();statement=null;}
if(connection!=null) {connection.close();connection=null;}
}catch(SQLException e){
e.printStackTrace();
}
System.out.println("断开数据库连接 Goodbye!");
}
}
c3p0-config.xml配置在src目录下,c3p0 jar包内也是用类加载方式读取:
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<!-- 默认配置,如果没有指定则使用这个配置 -->
<default-config>
<property name="user">zhangdingyi</property>
<property name="password">Ensky123.</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/RUNOOB</property>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="checkoutTimeout">30000</property>
<property name="idleConnectionTestPeriod">30</property>
<property name="initialPoolSize">3</property>
<property name="maxIdleTime">30</property>
<property name="maxPoolSize">100</property>
<property name="minPoolSize">2</property>
<property name="maxStatements">200</property>
</default-config>
<!-- 命名的配置,可以通过方法调用实现 -->
<named-config name="RegisterDemoDB">
<property name="user">zhangdingyi</property>
<property name="password">Ensky123.</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/RUNOOB</property>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<!-- 如果池中数据连接不够时一次增长多少个 -->
<property name="acquireIncrement">5</property>
<!-- 初始化数据库连接池时连接的数量 -->
<property name="initialPoolSize">20</property>
<!-- 数据库连接池中的最大的数据库连接数 -->
<property name="maxPoolSize">25</property>
<!-- 数据库连接池中的最小的数据库连接数 -->
<property name="minPoolSize">5</property>
</named-config>
</c3p0-config>
试运行c3p0jar包的时候,总是报错初始化出错,初始化各项参数值为null,就是没有正确读取到xml文档,之前不知道到底为啥,还检查了半天xml文档是否配置错了,最后发现是我一开始导入jar包不对。
一开始我自建了一个jar文件夹导入,然后project->properties->Java Build Path->Add External jars去了, 甚至拷贝jar包到
java路径/jre/lib/ext/下。
但其实应该都导入到WebContent/WEB-INF/lib/下才对,Eclipse会自动把jar包加到路径下的。
servlet部署:
关于手动部署servlet:https://www.cnblogs.com/hellokitty1/p/4875750.html
web.xml:在<web-app>...</web-app>之间添加:
<servlet>
<!-- servlet类名 -->
<servlet-name>RegisterDemo</servlet-name>
<!-- 完整类名 -->
<servlet-class>test.RegisterDemo</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>RegisterDemo</servlet-name>
<!-- 访问的网址 http://localhost:8080/RegisterDemo/RegisterDemo?name=xxx&password=xxx-->
<url-pattern>/RegisterDemo</url-pattern>
</servlet-mapping>
c3p0和dbcp的一些区别参考了:https://www.cnblogs.com/zzsuje/articles/10444032.html
c3p0与dbcp的定义:
C3P0:C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate,Spring等。
dbcp:DBCP(DataBase Connection Pool)数据库连接池,是java数据库连接池的一种,由Apache开发,通过数据库连接池,可以让程序自动管理数据库连接的释放和断开。
c3p0与dbcp区别:
dbcp没有自动回收空闲连接的功能
c3p0有自动回收空闲连接功能
两者主要是对数据连接的处理不同c3p0提供最大空闲时间,dbcp提供最大连接数。
前者是如果连接时间超过最大连接时间,就会断开当前连接。dbcp如果超过最大连接数,就会断开所有连接。