Java连接MySQL数据库-jdbc,连接池(DBCP,C3P0)和dbutils三种方式

本文介绍三种Java连接MySQL数据库的方式,jdbc,连接池(DBCP,C3P0)和dbutils

第一种:jdbc

jdbc是一套由oracle公司制定的规范,而驱动:jdbc的实现类则由数据库厂商提供。

使用步骤:

1.导入jar包(驱动)

2.注册驱动

Class.forName(“com.mysql.jdbc.Driver”);

3.获取连接

DriverManager.getConnection(“jdbc:mysql://loacalhost:3306/dayxx”,”root”,”123″);

4.编写sql

5.创建语句执行者

PreparedStatement st=conn.prepareStatement(sql);

6.设置参数

st.setXxx(int 第几个问号,Object 实参);

7.执行sql

ResultSet rs=st.executeQuery();

int i=st.executeUpdate();

8.处理结果:

if(rs.next()){

rs.getXxx(int|String)

}

9.释放资源

代码实例:

1.准备properties文件(jdbc.properties)

driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/databaseName?characterEncoding=utf8
user=root
password=root

Note: 文件jdbc.properties必须放在项目的src文件夹下。在使用ResourceBundle获取该文件的键值对时,只需要传入不包括扩展名的文件名即可。本例中只需要传入jdbc,不能传入jdbc.properties。

2.jdbcUtils包

package com.chengkaiblog.jdbcUtils;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ResourceBundle;

public class JdbcUtils {
	static final String DRIVERCLASS;
	static final String URL;
	static final String USER;
	static final String PASSWORD;
	
	static {
		// 获取ResourceBundle(load properties file)Note that: properties file must be in src folder.
		ResourceBundle bundle = ResourceBundle.getBundle("jdbc");
		
		// 获取指定的内容
		DRIVERCLASS = bundle.getString("driverClass");
		URL = bundle.getString("url");
		USER = bundle.getString("user");
		PASSWORD = bundle.getString("password");
	}
	
	static {
		// 注册驱动
		try {
			Class.forName(DRIVERCLASS);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
	

	// 获取连接
	public static Connection getConnection() throws SQLException {
		// 获取连接 ctrl+o 整理包
		return  DriverManager.getConnection(URL, USER, PASSWORD);
	}

	/**
	 * 释放资源
	 * 
	 * @param conn
	 *            连接
	 * @param st
	 *            语句执行者
	 * @param rs
	 *            结果集
	 */
	public static void closeResource(Connection conn, Statement st, ResultSet rs) {
		closeResultSet(rs);
		closeStatement(st);
		closeConn(conn);
	}

	/**
	 * 释放连接
	 * 
	 * @param conn
	 *            连接
	 */
	public static void closeConn(Connection conn) {
		if (conn != null) {
			try {
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
			conn = null;
		}
	}

	/**
	 * 释放语句执行者
	 * 
	 * @param st
	 *            语句执行者
	 */
	public static void closeStatement(Statement st) {
		if (st != null) {
			try {
				st.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
			st = null;
		}
	}

	/**
	 * 释放结果集
	 * 
	 * @param rs
	 *            结果集
	 */
	public static void closeResultSet(ResultSet rs) {
		if (rs != null) {
			try {
				rs.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
			rs = null;
		}
	}
}

3.使用

package com.itheima.a_jdbc.a_hello;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import org.junit.Test;

import com.itheima.utils.JdbcUtils;
import com.mysql.jdbc.Driver;

public class TestJdbcUtils {
	//插入一条数据
	@Test
	public void f1(){
		Connection conn=null;
		ResultSet rs=null;
		PreparedStatement st=null;
		
		try {
			//获取连接
			conn=JdbcUtils.getConnection();
			
			//编写sql
			String sql="insert into  category values(?,?)";
			
			//获取语句执行者
			st=conn.prepareStatement(sql);
			
			//设置参数
			st.setString(1, "c006");
			st.setString(2, "户外");
			
			//执行sql 
			int i=st.executeUpdate();
			
			//处理结果
			if(i==1){
				System.out.println("success");
			}else{
				System.out.println("fail");
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			//释放资源
			JdbcUtils.closeResource(conn, st, rs);
		}
	}
	
	//更新
	@Test
	public void f11(){
		Connection conn=null;
		PreparedStatement st=null;
		ResultSet rs=null;
		
		try {
			conn=JdbcUtils.getConnection();
			String sql="update category set cname = ? where cid = ?";
			st=conn.prepareStatement(sql);
			st.setString(1, "手机");
			st.setString(2, "c006");
			
			int i=st.executeUpdate();
			
			if(i==1){
				System.out.println("success");
			}else{
				System.out.println("fail");
			}
			
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			//释放资源
			JdbcUtils.closeResource(conn, st, rs);
		}
	}
	
	//删除
	@Test
	public void f12(){
		Connection conn=null;
		PreparedStatement st=null;
		ResultSet rs=null;
		
		try {
			conn=JdbcUtils.getConnection();
			String sql="delete from category where cid = ?";
			st=conn.prepareStatement(sql);
			
			st.setString(1, "c006");
			
			int i=st.executeUpdate();
			if(i==1){
				System.out.println("success");
			}else{
				System.out.println("fail");
			}
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			JdbcUtils.closeResource(conn, st, rs);
		}
	}
	
}

 

第二种:连接池

必须实现 javax.sql.DataSource 接口

获取连接:getConnnection();

归还连接:conn.close();

方法增前的方式:

1.继承

2.静态代理

3.动态代理

静态代理步骤:(与使用连接池无关,但是要理解这个思想,在使用conn.close()的时候不是关闭连接,而是将连接归还到连接池中。)

a.要求装饰者和被装饰者实现同一个接口或者继承同一个类

b.要求装饰者要有被装饰者的引用

c.对需要加强的方法进行加强

d.对不需要加强的方法调用原来的方法

常见的连接池:

DBCP:

使用步骤:

1.导入jar包(两个jar包)

2.编码方式:

a.硬编码

new BasicDataSource()

b.配置文件

Properties prop=new Properties()

prop.load(is);

new BasicDataSourceFactory().createDataSource(Properties prop);

C3P0:

使用步骤:

1.导入jar包(1个)

2.编码:

a.硬编码(不推荐)

new ComboPooledDataSource()

b.配置文件

配置文件的名称:c3p0.properties 或者 c3p0-config.xml

配置文件的位置:src目录下

编码中通过构造器创建:

new ComboPooledDataSource();

编码只需要一句话

new ComboPooledDataSource() //使用默认的配置

new ComboPooledDataSource(String configName) //使用命名的配置 若配置的名字找不到,使用默认的配置

DBCP的使用方法实例:

1.配置文件(dbcp.properties)

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/databaseName?characterEncoding=utf8
username=root
password=root

Note: 在使用类Properties导入配置文件的时候需要指定该配置文件的路径,具体看下面的代码。

2.代码实例

package com.chengkaiblog.datasource.dbcp;

import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Properties;

import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSource;
import org.apache.commons.dbcp.BasicDataSourceFactory;
import org.junit.Test;

import com.itheima.utils.JdbcUtils;

public class DbcpDemo {
	@Test
	//硬编码
	public void f1() throws Exception{
		//创建连接池
		BasicDataSource ds = new BasicDataSource();
		
		//配置信息
		ds.setDriverClassName("com.mysql.jdbc.Driver");
                // If it can not work for Chinese characters, please add "?characterEncoding=utf8" at the end of url string.
		ds.setUrl("jdbc:mysql:///databaseName"); // This url is short for jdbc:mysql://localhost:3306/javalearning
		ds.setUsername("root");
		ds.setPassword("1234");
		
		Connection conn=ds.getConnection();
		String sql="insert into category values(?,?);";
		PreparedStatement st=conn.prepareStatement(sql);
		
		//设置参数
		st.setString(1, "c011");
		st.setString(2, "饮料");
		
		int i = st.executeUpdate();
		System.out.println(i);
		JdbcUtils.closeResource(conn, st, null);
	}
	
	@Test
	public void f2() throws Exception{
		//存放配置文件
		Properties prop = new Properties();
		prop.load(new FileInputStream("src/dbcp.properties"));

		//创建连接池
		DataSource ds = BasicDataSourceFactory.createDataSource(prop);
		
		Connection conn=ds.getConnection();
		String sql="insert into category values(?,?);";
		PreparedStatement st=conn.prepareStatement(sql);
		
		//设置参数
		st.setString(1, "c013");
		st.setString(2, "饮料1");
		
		int i = st.executeUpdate();
		System.out.println(i);
		JdbcUtils.closeResource(conn, st, null);
	}
}

C3P0的使用方法实例:

1.配置文件(c3p0-config.xml)

<c3p0-config>
	<!-- 默认配置,如果没有指定则使用这个配置 -->
	<default-config>
		<!-- 基本配置 -->
		<property name="driverClass">com.mysql.jdbc.Driver</property>
		<property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/databaseName?characterEncoding=utf8</property>
		<property name="user">root</property>
		<property name="password">root</property>
	
		<!--扩展配置-->
		<property name="checkoutTimeout">30000</property>
		<property name="idleConnectionTestPeriod">30</property>
		<property name="initialPoolSize">10</property>
		<property name="maxIdleTime">30</property>
		<property name="maxPoolSize">100</property>
		<property name="minPoolSize">10</property>
		<property name="maxStatements">200</property>
	</default-config> 
	
	
	<!-- 命名的配置 -->
	<named-config name="chengkaiblog">
		<property name="driverClass">com.mysql.jdbc.Driver</property>
		<property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/databaseName?characterEncoding=utf8</property>
		<property name="user">root</property>
		<property name="password">root</property>
		
		
		<!-- 如果池中数据连接不够时一次增长多少个 -->
		<property name="acquireIncrement">5</property>
		<property name="initialPoolSize">20</property>
		<property name="minPoolSize">10</property>
		<property name="maxPoolSize">40</property>
		<property name="maxStatements">20</property>
		<property name="maxStatementsPerConnection">5</property>
	</named-config>
</c3p0-config> 

2.代码实例

package com.chengkaiblog.datasource.c3p0;

import java.sql.Connection;
import java.sql.PreparedStatement;
import org.junit.Test;

import com.itheima.utils.JdbcUtils;
import com.mchange.v2.c3p0.ComboPooledDataSource;

public class C3p0Demo {
	@Test
	//硬编码
	public void f1() throws Exception{
		ComboPooledDataSource ds = new ComboPooledDataSource();
		
		//设置基本参数
		ds.setDriverClass("com.mysql.jdbc.Driver");
		ds.setJdbcUrl("jdbc:mysql:///javalearning?characterEncoding=utf8");
		ds.setUser("root");
		ds.setPassword("root");
		
		Connection conn=ds.getConnection();
		String sql="insert into category values(?,?);";
		PreparedStatement st=conn.prepareStatement(sql);
		
		//设置参数
		st.setString(1, "c025");
		st.setString(2, "毒药");
		
		int i = st.executeUpdate();
		System.out.println(i);
		JdbcUtils.closeResource(conn, st, null);
	}
	
	@Test
	public void f2() throws Exception{
		//ComboPooledDataSource ds = new ComboPooledDataSource(); // use default configuration
		ComboPooledDataSource ds =new ComboPooledDataSource("chengkaiblog");//若查找不到命名的配置 使用默认的配置
		Connection conn=ds.getConnection();
		String sql="insert into category values(?,?);";
		PreparedStatement st=conn.prepareStatement(sql);
		
		//设置参数
		st.setString(1, "c124");
		st.setString(2, "解药");
		
		int i = st.executeUpdate();
		System.out.println(i);
		JdbcUtils.closeResource(conn, st, null);
	}
}

 

第三种:dbutils

dbutils是apache组织的一个工具类,jdbc的框架,更方便我们使用

使用步骤:

1.导入jar包(commons-dbutils-1.4.jar)

2.创建一个queryrunner类

queryrunner作用:操作sql语句

构造方法:

new QueryRunner(DataSource ds);

3.编写sql

4.执行sql

query(..):执行r操作

update(…):执行cud操作

核心类或接口:

QueryRunner:类名

作用:操作sql语句

构造器:

new QueryRunner(DataSource ds);

注意: 底层帮我们创建连接,创建语句执行者 ,释放资源.

常用方法:

query(..):

update(..):

DbUtils:释放资源,控制事务 类

closeQuietly(conn):内部处理了异常

commitAndClose(Connection conn):提交事务并释放连接….

ResultSetHandler:封装结果集 接口

  • ArrayHandler, ArrayListHandler, BeanHandler, BeanListHandler, ColumnListHandler, KeyedHandler, MapHandler, MapListHandler, ScalarHandler
    • (了解)ArrayHandler, 将查询结果的第一条记录封装成数组,返回
    • (了解)ArrayListHandler, 将查询结果的每一条记录封装成数组,将每一个数组放入list中返回
    • ★★BeanHandler, 将查询结果的第一条记录封装成指定的bean对象,返回
    • ★★BeanListHandler, 将查询结果的每一条记录封装成指定的bean对象,将每一个bean对象放入list中 返回.
    • (了解)ColumnListHandler, 将查询结果的指定一列放入list中返回
    • (了解)MapHandler, 将查询结果的第一条记录封装成map,字段名作为key,值为value 返回
    • ★MapListHandler, 将查询结果的每一条记录封装map集合,将每一个map集合放入list中返回
    • ★ScalarHandler,针对于聚合函数 例如:count(*) 返回的是一个Long值

dbutils的使用方法实例:

分析:①由于在使用dbutils的时候,创建QueryRunner qr=new QueryRunner(DataSource ds)需要传入一个DataSource对象,因此在使用dbutils之前必须首先创建一个DataSource的对象。本例首先创建一个名为DataSourceUtils的类,在该类中通过getDataSource方法获取DataSource对象。②由于需要测试BeanHandler和BeanListHandler,即将查询结果的记录封装成指定的bean对象,因此需要创建一个类,能够按照指定的格式输出查询结果。③在上面两步完成之后,就可以使用dbutils了。

1.创建DataSourceUtils类

package com.chengkaiblog.utils;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.sql.DataSource;

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class DataSourceUtils {
	private static ComboPooledDataSource ds=new ComboPooledDataSource();
	
	/**
	 * 获取数据源
	 * @return 连接池
	 */
	public static DataSource getDataSource(){
		return ds;
	}
	
	/**
	 * 获取连接
	 * @return 连接
	 * @throws SQLException
	 */
	public static Connection getConnection() throws SQLException{
		return ds.getConnection();
	}
	
	/**
	 * 释放资源
	 * 
	 * @param conn
	 *            连接
	 * @param st
	 *            语句执行者
	 * @param rs
	 *            结果集
	 */
	public static void closeResource(Connection conn, Statement st, ResultSet rs) {
		closeResultSet(rs);
		closeStatement(st);
		closeConn(conn);
	}

	/**
	 * 释放连接
	 * 
	 * @param conn
	 *            连接
	 */
	public static void closeConn(Connection conn) {
		if (conn != null) {
			try {
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
			conn = null;
		}

	}

	/**
	 * 释放语句执行者
	 * 
	 * @param st
	 *            语句执行者
	 */
	public static void closeStatement(Statement st) {
		if (st != null) {
			try {
				st.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
			st = null;
		}

	}

	/**
	 * 释放结果集
	 * 
	 * @param rs
	 *            结果集
	 */
	public static void closeResultSet(ResultSet rs) {
		if (rs != null) {
			try {
				rs.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
			rs = null;
		}

	}
}

2.创建一个Category类,使之能够格式化输出

package com.chengkaiblog.domain;

public class Category {
	private String cid;
	private String cname;
	public String getCid() {
		return cid;
	}
	public void setCid(String cid) {
		this.cid = cid;
	}
	public String getCname() {
		return cname;
	}
	public void setCname(String cname) {
		this.cname = cname;
	}
	@Override
	public String toString() {
		return "Category [cid=" + cid + ", cname=" + cname + "]";
	}
}

3.使用dbutils类(简单的插入和更新)

package com.chengkaiblog.dbuitls.curd;

import java.sql.SQLException;

import org.apache.commons.dbutils.QueryRunner;
import org.junit.Test;

import com.chengkaiblog.utils.DataSourceUtils;

public class CURDDemo {
	@Test
	public void insert() throws SQLException{
		//1.创建queryrunner类
		QueryRunner qr = new QueryRunner(DataSourceUtils.getDataSource());
		
		//2.编写sql
		String sql="insert into category values(?,?)";
		
		
		//3.执行sql
		qr.update(sql, "c201","厨房电器");
		
	}
	
	@Test
	public void update() throws SQLException{
		QueryRunner qr=new QueryRunner(DataSourceUtils.getDataSource());
		
		String sql="update category set cname = ? where cid = ?";
		
		qr.update(sql, "达电器","c000");
	}
}

3.使用dbutils类(使用结果集)

package com.chengkaiblog.dbuits.curdResultSets;

import java.sql.SQLException;
import java.util.Arrays;
import java.util.List;
import java.util.Map;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.ArrayHandler;
import org.apache.commons.dbutils.handlers.ArrayListHandler;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.MapHandler;
import org.apache.commons.dbutils.handlers.MapListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import org.junit.Test;

import com.chengkaiblog.domain.Category;
import com.chengkaiblog.utils.DataSourceUtils;

public class ResultHandleDemo {
	@Test
	public void arrayHandler() throws SQLException{
		QueryRunner qr=new QueryRunner(DataSourceUtils.getDataSource());
		
		String sql="select * from category";
		
		Object[] query = qr.query(sql, new ArrayHandler());
		System.out.println(Arrays.toString(query));
	}
	
	@Test
	public void arrayListHandler() throws SQLException{
		QueryRunner qr=new QueryRunner(DataSourceUtils.getDataSource());
		
		String sql="select * from category";
		List<Object[]> list = qr.query(sql, new ArrayListHandler());
		for (Object[] obj : list) {
			System.out.println(Arrays.toString(obj));
		}
	}
	
	
	@Test
	public void beanHandler() throws SQLException{
		QueryRunner qr=new QueryRunner(DataSourceUtils.getDataSource());
		
		String sql="select * from category";
		
		Category bean = qr.query(sql, new BeanHandler<>(Category.class));
		
		System.out.println(bean);
	}
	
	@Test
	public void beanListHandler() throws SQLException{
		QueryRunner qr=new QueryRunner(DataSourceUtils.getDataSource());
		
		String sql="select * from category";
		
		List<Category> list = qr.query(sql, new BeanListHandler<>(Category.class));
		
		for (Category bean : list) {
			
			System.out.println(bean);
		}
	}
	
	@Test
	public void mapHandler() throws SQLException{
		QueryRunner qr=new QueryRunner(DataSourceUtils.getDataSource());
		
		String sql="select * from category";
		
		Map<String, Object> map = qr.query(sql, new MapHandler());
		System.out.println(map);
	}
	
	@Test
	public void mapListHandler() throws SQLException{
		QueryRunner qr=new QueryRunner(DataSourceUtils.getDataSource());
		
		String sql="select * from category";
		
		List<Map<String, Object>> list = qr.query(sql, new MapListHandler());
		for (Map<String, Object> map : list) {
			System.out.println(map);
		}
	}
	
	@Test
	public void scalarHandler() throws SQLException{
		QueryRunner qr=new QueryRunner(DataSourceUtils.getDataSource());
		
		String sql="select count(*) from category";
		
		Object obj = qr.query(sql, new ScalarHandler());
		System.out.println(obj.getClass().getName());
	}
	
}

 

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

3 × 2 =

7 + 3 =