JDBC初始版

#JDBC

  • JDBC
    java Database Connectivity java数据库连接
    JDBC的本质是java对所有关系型数据库进行连接操作所制定的一套规则,就是接口。
    不同的数据库针对这套规则制定相对应的实现类,我们使用这些已经做好的实现类
    来实现java对数据库进行连接和操作

  • 步骤

1、导入jar包

在项目的根目录中创建lib文件夹
将mysql-connector-java-5.1.37-bin.jar复制到lib中
右键点击该jar包,选择Build Path,点击Add to Build Path

2、注册驱动

Class.forName("com.mysql.jdbc.Driver");

3、获取连接对象

Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/库名", "用户名", "密码");	
访问本地数据库路径的简写:jdbc:mysql:///库名

4、编写SQL语句
5、获取执行对象

Statement state = conn.createStatement();

6、执行SQL语句

state.executeUpdate(sql) 实现增删改
state.executeQuery(sql) 实现查询

7、处理执行结果

如果是增删改,判断是否执行成功
	executeUpdate方法返回int,用于判断增删改影响的记录数
如果是查询,获取结果集
	executeQuery方法返回ResultSet结果集,查询得到的结果被封装在了这个结果集中。
	需要遍历集合来获取所有查询的结果
	使用方法:
	1、next():判断是否有下一个可以获取的查询结果,返回布尔值
	2、getXxx(int):在指定的记录中,通过字段的位置获取字段值
	3、getXxx(String):在指定的记录中,通过字段名获取字段值
	
	代码:
	ResultSet set = state.executeQuery();
	while(set.next()){
		set.getXxx(int/String);
	}

8、释放资源

if(conn != null){
	try {
		conn.close();
	} catch (SQLException e) {
		e.printStackTrace();
	}
}
if(state !=null){
	try {
		state.close();
	} catch (SQLException e) {
		e.printStackTrace();
	}
}

二. PreparedStatement

预编译的SQL
作用:防止SQL的注入问题
例如: xxx ’ or ‘1’=1,来完成登录功能

使用步骤:

  1. 获取对象、并传入要执行的SQL语句
    String sql="";
    PreparedStatement state =conn.prepareStatement(sql);
  2. 向SQL语句的占位符添加数据
    state.setXxx(位置,数据);
    例如:select * from 表名 where username = ? and password = ?
    state.setString(1,用户名);
    state.setString(2,密码);
  3. 执行SQL,不需要传入SQL语句
    state.executeUpdate();
    state.executeQuery();

三. 数据库连接池

概念:数据库连接池的本质是一个存储若干个数据库连接对象的容器(集合),用户在访问数据库时,可以直接从该容器中获取连接对象,对数据库进行操作,在使用完毕后将此连接对象归还到池中。

好处:
1、节省资源
2、提高访问效率

DataSource连接池接口
1、getConnection():获取连接

一般这个接口我们不会自己去实现,都用第三方做好的jar包
1、c3p0:Apache组织的

步骤:
1、导入c3p0-0.9.5.2.jar和mchange-commons-java-0.2.12.jar(这个c3p0的依赖)
2、在src下配置c3p0-config.xml文件
	在文件中配置:
		<c3p0-config>
			<named-config name="mypool">
				<property name="drvierClass">com.mysql.jdbc.Driver</property>
				<property name="jdbcUrl">jdbc:mysql://localhost:3306/库名</property>
				<property name="user">root</property>
				<property name="password">root</property>
				<property name="initialPoolSize">5</property>
			</named-config>
		</c3p0-config>
3、获取连接池
	DataSource ds = new ComboPooledDataSource("mypool");
4、获取连接对象
	ds.getConntion();
5、归还连接
	ds.close();

2、druid:阿里巴巴的

步骤:
1、导入druid-1.0.9.jar
2、在项目的任意位置配置任意文件名的properties文件
	在文件中配置
		driverClassName=com.mysql.jdbc.Driver
		url=jdbc:mysql://localhost:3306/库名
		username=root
		password=root
		initialSize=5
3、使用连接池工厂创建连接池
	// 专门用于读取properties文件的类
	Properties pro = new Properties();
	// 使用load方法将properties文件载入
	pro.load(JdbcUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
	// 使用DruidDataSourceFactory创建连接池
	ds = DruidDataSourceFactory.createDataSource(pro);
4、获取连接对象
	ds.getConntion();
5、归还连接
	ds.close();

第一次注册登录的地址相同,反复启动,浪费资源(connection),故此搞了一个数据库连接池
连接同一个数据库,确保连接对象相同
连接多个数据库时,连接多个对象,故此搞了一个数据库连接池

增删改全用update
查 query

dbutil的作用 不用自己关闭资源
DBUtils就是为了简化JDBC的快发而产生的开发工具包.对JDBC的一种封装
用池来管理Connection,这样可以重复使用Connection。有了池,所以我们就不用自己来创建Connection,而是通过池来获取Connection对象。当使用完Connection后,调用Connection的close()方法也不会真的关闭Connection,而是把Connection“归还”给池。池就可以再利用这个Connection对象了。
在开发中“获得连接”或“释放资源”是非常消耗系统资源的两个过程,所以通常用连接池结束,来共享连接Connection.这样就不用每次都创建连接,释放链接了,这些操作都交给连接池.

QreryRunner类(org.apache.commons.dbutils.QueryRunner) 是Dbutils的核心类之一,它显著的简化了SQL查询,并与ResultSetHandler协同工作将使编码量大为减少
QueryRunner qr= new QueryRunner(JdbcUtils.getDataSource());

query(sql,ResultSetHandler,Object…params);

c3p0的工具类

public class JdbcUtils {
	public static DataSource ds= null;
	
	static {
		ds= new ComboPooledDataSource("c3p0");
	}
	
	//获取池
	public static DataSource getDataSource() {
		return ds;
	}
	//获取连接
	public static Connection getConnection() throws SQLException {
		return ds.getConnection();
	}
	public static void close(PreparedStatement state, Connection conn) {
		if (state != null) {
			try {
				state.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		if (conn != null) {
			try {
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}

	public static void close(PreparedStatement state, Connection conn, ResultSet set) {
		close(state, conn);
		if (set != null) {
			try {
				set.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}

为了简化Jdbc技术的操作-----DBUtils
Apache组织提供的一个对JDBC进行简单封装的开源工具类库

作用:DBUtils主要负责转载驱动、关闭连接的工作

QreryRunner类(org.apache.commons.dbutils.QueryRunner) 是Dbutils的核心类之一,
它显著的简化了SQL查询,并与ResultSetHandler协同工作将使编码量大为减少。它包含以下几个方法:

  1. query(Connection conn, String sql, Object[] params, ResultSetHandler rsh):执行选择查询,在查询中,对象阵列的值被用来作为查询的置换参数。
  2. query(String sql, Object[] params, ResultSetHandler rsh):方法本身不提供数据库连接,执行选择查询,在查询中,对象阵列的值被用来作为查询的置换参数。
  3. query(Connection conn, String sql, ResultSetHandler rsh):执行无需参数的选择查询。
  4. update(Connection conn, String sql, Object[] params):被用来执行插入、更新或删除(DML)操作。

其中ResultSetHandler接口(org.apache.commons.dbutils.ResultSethandler)执行处理一个结果集对象,将数据转变并处理为任何一种形式,供其他应用使用。实现类如下:

ArrayHandler:把结果集中的第一行数据转成对象数组。
ArrayListHandler:把结果集中的每一行数据都转成一个对象数组,再存放到List中。
BeanHandler:将结果集中的第一行数据封装到一个对应的JavaBean实例中。
BeanListHandler:将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里。
//重点
MapHandler:将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值。//重点
MapListHandler:将结果集中的每一行数据都封装到一个Map里,然后再存放到List
ColumnListHandler:将结果集中某一列的数据存放到List中。
KeyedHandler(name):将结果集中的每一行数据都封装到一个Map里(List),再把这些map再存到一个map里,其key为指定的列。
ScalarHandler:将结果集第一行的某一列放到某个对象中。//重点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值