【DataBase】连接数据库

对获取数据库连接的方法进行简要总结,以连接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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值