对获取数据库连接的方法进行简要总结,以连接MySQL数据库为例。
文章目录
1、使用配置参数连接
按如下所示配置数据库连接的四大参数,然后进行进行数据库连接:
/*
*jdbc 四大配置参数
* 1、driverClassName: com.mysql.jdbc.Driver
* url书写时千万不能有空格
* 2、url: jdbc:mysql://localhost:3306/数据库名
* 3、username: root
* 4、password 123
*/
//加载驱动类
Class.forName("com.mysql.jdbc.Driver");
String url="jdbc:mysql://localhost:3306/数据库名";
String userName="用户名";
String password="密码";
//获取连接
Connection conn=DriverManager.getConnection(url,userName,password);
//执行增、删、改、查操作
//通过Connection对象来创建Statement(作用就是向数据库发送sql语句)
Statement stmt=conn.createStatement();
//通过Statement对象来发送sql语句,返回受影响的行数
String sql="";
//更新executeUpdate(sql);查询executeQuery(sql)....
int row=stmt.executeUpdate(sql);
//关闭资源
stmt.close();
conn.close();
也可以直接一步到位:
//加载驱动类
Class.forName("com.mysql.jdbc.Driver");
//获取连接
Connection conn=DriverManager
.getConnection("jdbc:mysql://localhost:3306/数据库名"
,"用户名","密码");
常见问题:
报错“Not suitable driver found for jdbc”的原因一般有如下两种:
原因一:没有写Class.forName();
原因二:url写的有错,千万不能以空格开头
2、使用JdbcUtils工具类
使用JdbcUtils工具类时,首先创建配置文件,一般命名为:dbconfig.properties;配置文件中进行数据库参数的配置。
driverClassName=com.jdbc.mysql.driver
url=jdbc:mysql://localhost:3306/mydb3
username=root
password=123456
JdbcUtils工具类内容如下:
public class JdbcUtils {
private static Properties props = null;
// 只在JdbcUtils类被加载时执行一次!
static {
// 给props进行初始化,即加载dbconfig.properties文件到props对象中
try {
InputStream in = JdbcUtils.class//
.getClassLoader()//
.getResourceAsStream("dbconfig.properties");
props = new Properties();
props.load(in);
} catch(IOException e) {
throw new RuntimeException(e);
}
// 加载驱动类
try {
Class.forName(props.getProperty("driverClassName"));
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
}
// 获取连接!
public static Connection getConnection() throws SQLException {
// 得到Connection
return DriverManager.getConnection(props.getProperty("url"),
props.getProperty("username"),
props.getProperty("password"));
}
}
3、使用c3p0数据库连接池
使用c3p0连接池时一般也需要写配置文件,但是如果要写配置文件则有两点要求:
- 1、文件名称:必须叫c3p0-config.xml
- 2、文件位置:必须在src下
c3p0-config.xml文件内容如下,两种形式均可:
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<!-- 默认配置-->
<default-config>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/数据库名</property>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="user">用户名</property>
<property name="password">密码</property>
<!--当连接池中的连接用完时,c3p0一次性创建新连接的数目3-->
<property name="acquireIncrement">3</property>
<property name="initialPoolSize">10</property>
<property name="minPoolSize">2</property>
<property name="maxPoolSize">10</property>
</default-config>
<!-- 命名配置 -->
<named-config name="oracle-config">
<property name="jdbcUrl">jdbc:mysql://localhost:3306/数据库名</property>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="user">用户名</property>
<property name="password">密码</property>
<property name="acquireIncrement">3</property>
<property name="initialPoolSize">10</property>
<property name="minPoolSize">2</property>
<property name="maxPoolSize">10</property>
</named-config>
</c3p0-config>
配置文件配置完成以后,可以对JdbcUtils工具类进行改进:
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class JDBCUtils {
//使用c3p0默认配置文件来配置,需要自己写c3p0-config.xml文件
private static ComboPooledDataSource cpds=new ComboPooledDataSource();
/*
* 返回连接对象
*/
public static Connection ReturnConn() throws Exception{
try {
return cpds.getConnection();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/*
* 返回连接池
*/
public static DataSource ReturnDS(){
return cpds;
}
}
3.1、JdbcUtils工具类优化写法
最优的JdbcUtils工具类写法:
public class JdbcUtils {
private static DataSource dataSource = new ComboPooledDataSource();
private static ThreadLocal<Connection> tl = new ThreadLocal<Connection>();
//获取连接池对象
public static DataSource getDataSource() {
return dataSource;
}
public static Connection getConnection() throws SQLException {
Connection con = tl.get();
if(con == null) {
return dataSource.getConnection();
}
return con;
}
public static void beginTranscation() throws SQLException {
Connection con = tl.get();
if(con != null ) {
throw new SQLException("事务已经开启,在没有结束当前事务时,不能再开启事务!");
}
con = dataSource.getConnection();
con.setAutoCommit(false); //开启事务
tl.set(con);
}
public static void commitTransaction() throws SQLException {
Connection con = tl.get();
if(con == null ) {
throw new SQLException("当前没有事务,所以不能提交事务!");
}
con.commit();
con.close();
tl.remove();
}
public static void rollbackTransaction() throws SQLException {
Connection con = tl.get();
if(con == null) {
throw new SQLException("当前没有事务,所以不能回滚事务!");
}
con.rollback();
con.close();
tl.remove();
}
}
3.2、DBUtils组件的使用
DBUtils的Jar包:
- dbutils.jar
DBUtils中的常见类:
- DbUtils:都是静态方法,一系列的close()方法;
- QueryRunner:
- update():执行insert、update、delete;
- query():执行select语句;
- batch():执行批处理。
3.2.1、ResultSetHandler接口
在执行select语句之后得到的是ResultSet,然后我们还需要对ResultSet进行转换,得到最终我们想要的数据。你可以希望把ResultSet的数据放到一个List中,也可能想把数据放到一个Map中,或是一个Bean中。
DBUtils提供了一个接口ResultSetHandler,它就是用来ResultSet转换成目标类型的工具。你可以自己去实现这个接口,把ResultSet转换成你想要的类型。
- MapHandler:单行处理器!把结果集转换成Map<String,Object>,其中列名为键;
- MapListHandler:多行处理器!把结果集转换成List<Map<String,Object>>;
- BeanHandler:单行处理器!把结果集转换成Bean,该处理器需要Class参数,即Bean的类型;
- BeanListHandler:多行处理器!把结果集转换成List;
- ColumnListHandler:多行单列处理器!把结果集转换成List,使用ColumnListHandler时需要指定某一列的名称或编号,例如:new ColumListHandler(“name”)表示把name列的数据放到List中。
- ScalarHandler:单行单列处理器!把结果集转换成Object。一般用于聚集查询,例如select count(*) from tab_student。
QueryRunner查询举例:
public void select() throws SQLException {
DataSource ds = JdbcUtils.getDataSource();
QueryRunner qr = new QueryRunner(ds);
String sql = "select * from 表名 where number=?";
//MapHandler:单行处理器,把结果集转换成Map<String,Object>,其中列名为键。
Map<String,Object> map = qr.query(sql, new MapHandler() , "S_2000");
System.out.println(map);
}
批处理举例:
public void batchProcess() throws SQLException {
DataSource ds = JdbcUtils.getDataSource();
QueryRunner qr = new QueryRunner(ds);
String sql = "insert into 表名 values(?,?,?,?)";
Object[][] params = new Object[10][]; //表示 要插入10行记录
for(int i = 0; i < params.length; i++) {
params[i] = new Object[]{"S_300" + i, "name" + i, 30 + i, i%2==0?"男":"女"};
}
qr.batch (sql, params);
}