版权声明:本文为博主原创文章,如需转载请注明出处,谢谢。喜欢请关注哟~ https://blog.csdn.net/sjt223857130/article/details/83180656
在java中连接mysql数据库,是一个老生常谈的问题。
到今天为止,网上能搜到相当多的教程和示例了,原理都差不多。
用到的jar包如下,可以到官网下载找到。
- commons-dbcp2-2.5.0.jar
- commons-pool2-2.6.0.jar
- commons-logging-1.2.jar
- mysql-connector-java-8.0.12.jar
这里主要写一下新版的jdbc2连接需要注意的地方,整理成类,供大家参考使用。
DBUtil.java 类:负责管理Connection连接
package core.mysql;
import org.apache.commons.dbcp2.BasicDataSource;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class DBUtil {
// 声明一个basicDataSource
private static BasicDataSource dataSource = new BasicDataSource();
// 设置数据源
static {
// 连接参数
String parameters = "&useUnicode=true";//使用Unicode
parameters += "&characterEncoding=utf-8";//编码UTF8
parameters += "&serverTimezone=GMT%2B8";//时区GMT+8
parameters += "&useSSL=false";//禁用SSL
// 数据库名称
String dbName = "sggames";
// 数据库驱动,以使用mysql-connector-java包版本为准
// 按照官方提示支持将Mysql5(com.mysql.jdbc.Driver)改为Mysql6(com.mysql.cj.jdbc.Driver)
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
// 连接数据库的url,使用(serverTimezone=GMT+8)如果设定serverTimezone=UTC,会比中国时间早8个小时
dataSource.setUrl("jdbc:mysql://localhost:3306/" + dbName + "?" + parameters);
// 连接数据库的用户名
dataSource.setUsername("root");
// 连接数据库的密码
dataSource.setPassword("root");
// 初始化链接数量(默认值:0)
dataSource.setInitialSize(10);
// 最大活动连接数,设置负值不限制
dataSource.setMaxTotal(8);
// 最大空闲连接数,设置负值不限制
dataSource.setMaxIdle(5);
// 设置最小空闲连接数量
dataSource.setMinIdle(1);
//只会发现当前连接失效,再创建一个连接供当前查询使用
dataSource.setTestOnBorrow(true);
//超过时间限制,回收没有用(废弃)的连接(默认为 300秒,调整为180)
dataSource.setRemoveAbandonedTimeout(180);
}
/**
* 获取数据库连接
*/
public static Connection getConnection() {
Connection conn = null;
try {
// 从本地线程管理对象中获取
if (dataSource != null) {
conn = dataSource.getConnection();
}
conn.setAutoCommit(false);
} catch (SQLException e) {
System.out.println("获取数据库边接失败:" + e);
throw new RuntimeException(e);
}
return conn;
}
/**
* 仅关闭数据库连接
*/
public static void closeConnection() {
Connection conn = null;
try {
if (conn != null) {
conn.close();
System.out.println("关闭数据库边接成功");
}
} catch (Exception e) {
System.out.println("关闭数据库连接失败:" + e);
throw new RuntimeException(e);
}
}
/**
* 释放资源并关闭连接
*/
public static void free(ResultSet rs, Statement st, Connection conn) {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
System.out.println("关闭RS失败:" + e);
e.printStackTrace();
}
}
if (st != null) {
try {
st.close();
} catch (SQLException e) {
System.out.println("关闭ST失败:" + e);
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
System.out.println("关闭CONN失败:" + e);
e.printStackTrace();
}
}
}
/**
* 数据池信息输出
*/
public static void debugConnection() {
System.out.println(" 最小空闲连接MinIdle=" + dataSource.getMinIdle());
System.out.println(" 最大空闲连接MaxIdle=" + dataSource.getMaxIdle());
System.out.println(" 最大连接数量MaxTotal=" + dataSource.getMaxTotal());
System.out.println(" 初始大小InitialSize=" + dataSource.getInitialSize());
System.out.println(" 超时等待时间MaxWaitMillis=" + (dataSource.getMaxWaitMillis() / 1000));
System.out.println(" 获取活动的连接数getNumActive()=" + dataSource.getNumActive());
System.out.println(" 获取连接数getNumIdle=" + dataSource.getNumIdle());
}
}
DBManager.java 类:负责操作数据库,增,查,删,改。
package core.mysql;
import java.sql.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class DBManager {
/**
* 从连接池中获取连接
*/
private static Connection getConnection() throws Exception {
return DBUtil.getConnection();
}
/**
* 用于查询,返回结果集
*
* @param sql
* @return 结果集
* @throws java.sql.SQLException
*/
@SuppressWarnings("rawtypes")
public static List query(String sql) throws Exception {
ResultSet rs = null;
PreparedStatement ts = null;
Connection conn = getConnection();
try {
ts = conn.prepareStatement(sql);
rs = ts.executeQuery();
return ResultToListMap(rs);
} catch (SQLException e) {
throw new SQLException(e);
} finally {
DBUtil.free(rs, ts, conn);
}
}
/**
* 结果集映射为hash
*/
@SuppressWarnings({"unchecked", "rawtypes"})
private static List ResultToListMap(ResultSet rs) throws SQLException {
List list = new ArrayList();
while (rs.next()) {
ResultSetMetaData md = rs.getMetaData();
Map map = new HashMap();
int mdCount = md.getColumnCount();
for (int i = 1; i <= mdCount; i++) {
map.put(md.getColumnLabel(i), rs.getObject(i));
}
list.add(map);
}
return list;
}
}
使用方法:
String sql = "select * from 表";
try {
List<Map> rs = DBManager.query(sql);
System.out.println(rs.get(0).get("字段"));
System.out.println("查询成功");
} catch (Exception e) {
System.out.println("查询失败");
e.printStackTrace();
}
就这么简单!