JDBC,Java数据库连接。
使用该技术要导入mysql-connector-java-5.1.37-bin.jar
当我们使用Java连接数据库时,总会创建各种对象,比如 Connection、PreparedStatement、Statement、ResultSet等等。如果每次写代码都创建一次,是很麻烦的一件事。
所以 JDBCUtils (JDBC工具类) 应用而生,把这些对象的创建放在一个类中,每次使用从这个类中的相关方法获取即可。
下面介绍三种 JDBCUtils。
第一种比较简单,把对象简单封装即可。
public class DButil {
//获取数据库连接
public static Connection getConnection() {
Connection conn = null;
try {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/shz";
String uname = "root";
String upassword = "root";
conn = DriverManager.getConnection(url, uname, upassword);
}catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("加载失败!驱动类没有找到!");
} catch (SQLException e) {
e.printStackTrace();
System.out.println("数据库连接失败!请检查数据库名以及用户帐号!");
}
return conn;
}
//关闭数据库连接connection,statement,resultset
public static void closeAll(Connection conn,Statement stmt,ResultSet rs) {
if(conn != null) {
try {
conn.close();
}catch (Exception e) {
e.printStackTrace();
}
}
if(stmt != null) {
try {
stmt.close();
}catch (Exception e) {
e.printStackTrace();
}
}
if(rs != null) {
try {
rs.close();
}catch (Exception e) {
e.printStackTrace();
}
}
}
//创建数据库操作对象PreparedStatement
public static PreparedStatement PreparedStatement(Connection conn,String sql) {
PreparedStatement pstmt = null;
try {
pstmt=conn.prepareStatement(sql);
}catch (Exception e) {
e.printStackTrace();
}
return pstmt;
}
//创建数据库操作对象Statement
public static Statement getStatement(Connection conn) {
Statement statement = null;
try {
statement = conn.createStatement();
} catch (SQLException e) {
e.printStackTrace();
}
return statement;
}
//执行 增删改sql语句 的方法封装
public static int excuteDML(String sql,Object...objs) {
int n = 0;
Connection connection = null;
PreparedStatement preparedStatement = null;
try {
connection = getConnection();
preparedStatement = PreparedStatement(connection, sql);
for (int i = 0; i < objs.length; i++) {
preparedStatement.setObject(i+1, objs[i]);
}
n = preparedStatement.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}finally {
closeAll(connection, preparedStatement, null);
}
return n;
}
}
最后一个方法在工具类中可以舍去。
第二种工具类是对第一种的改进。
我们不难发现在第一种中,有关数据库的配置还是写死的,也就是说,如果数据库的密码、库等发生改变,还得修改源码。
所以我们把这些有关数据库的配置,抽取到后缀名为 properties 的文件中:
url=jdbc:mysql://localhost:3306/test
user=root
password=root
driver=com.mysql.jdbc.Driver
如果数据库配置发生改变,直接来修改该配置文件即可,不需要动源码。
public class JDBCUtils {
//静态变量,供静态代码块和静态方法使用
private static String url;
private static String user;
private static String password;
private static String driver;
//读取jdbc.properties文件
//静态代码块:随着类的加载而加载
static{
try {
//properties集合类
Properties pro = new Properties();
//加载文件
/*
* 1.绝对路径
* 2.获取src路径下的文件 ClassLoader
* */
ClassLoader classLoader = JDBCUtils.class.getClassLoader();
URL res = classLoader.getResource("jdbc.properties");
String path = res.getPath();//获取到properties文件的绝对路径
pro.load(new FileReader(path));
//获取属性
url=pro.getProperty("url");
user=pro.getProperty("user");
password=pro.getProperty("password");
driver=pro.getProperty("driver");
//注册驱动:数据库改变时,修改properties文件即可
Class.forName(driver);
} catch (Exception e) {
e.printStackTrace();
}
}
//获取连接
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(url,user,password);
}
//释放资源
public static void close(Statement stmt,Connection conn){
if(stmt!=null){
try {
stmt.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if(conn!=null){
try {
conn.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
public static void close(ResultSet rs,Statement stmt, Connection conn){
if(rs!=null){
try {
rs.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if(stmt!=null){
try {
stmt.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if(conn!=null){
try {
conn.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
}
第三种是对第二种的提升。
不仅使用 properties 配置文件,还使用了 druid 连接池技术。
使用连接池,要导入相关的包:
当然,配置文件可以自己编写:
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/db3
username=root
password=root
initialSize=5
maxActive=10
maxWait=3000
该配置文件可以放到项目的任意位置。
public class JDBCUtils {
private static DataSource ds;
static {
try {
Properties pro = new Properties();
pro.load(JdbcUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
ds=DruidDataSourceFactory.createDataSource(pro);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//获取连接
public static Connection getConnection() throws SQLException {
return ds.getConnection();
}
//关闭对象(不包含ResultSet)---重载方法
public static void close(Statement stmt,Connection conn) {
//调用三参的close方法
close(null,stmt,conn);
}
//关闭对象(包含ResultSet)
public static void close(ResultSet rs,Statement stmt,Connection conn) {
if(rs!=null) {
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(stmt!=null) {
try {
stmt.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(conn!=null) {
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}//归还连接
}
}
//获得数据库连接池
public static DataSource getDataSource() {
return ds;
}
}