JDBC与连接池

JDBC (Java DataBase Connectivity)

1. 概念
	JDBC 是Java 访问数据库的标准规范,真正怎么操作数据库还需要具体的实现类,也就是数据库驱动。每个数据库厂商根据自家数据库的通信格式编写好自己的数据库驱动。所以我们只需要调用 JDBC 接口中的方法即可,数据库驱动由数据库厂商提供。
2. 相关的包
	* java.sql
	* javax.sql
	* 数据库厂商提供的jar包
3. 核心的API
	* DriverManager 类
		 1)管理和注册数据库驱动
		 2)得到数据库连接对象
	
	* Connection 接口
		 一个连接对象,可以用于创建Statement 和PreparedStatement
	
	* Statement 接口
		 一个SQL语句对象,用于将SQL语句发送给数据库服务器
	
	* PreparedStatement 接口
		 一个SQL语句对象,是Statement的子接口
	
	* ResultSet 接口
		 用于封装数据库查询的结果集,返回给客户端Java程序

4. 配置环境导入Jar包

	* MySQL需要导入的驱动Jar包:
		mysql-connector-java-5.1.37-bin.jar
	
	*注册驱动
		Class.forName("com.mysql.jdbc.Driver");

核心接口和类

1. DriverManager 
	
	*注册驱动
		Class.forName("com.mysql.jdbc.Driver");
		
	* 获取数据库连接方法
		1)Connection getConnection (String url, String user, String password)
			1. url
				连接数据库字符串 
				格式:协议名:子协议://服务器或者IP:端口号/数据库名?参数=参数值
				MySQL写法:jdbc:mysql://localhost:3306/test?characterEncoding=utf8
			2. user
				用户名
			3. password
				密码		
		2)Connection getConnection (String url, Properties info)
			1. url
				连接数据库字符串
			2. info
				Properties 属性对象

2. Connection 接口
	由具体的厂商提供,代表一个连接对象,
	
	* 获取执行SQL的对象	
		
		//创建一个 Statement对象,用于将SQL语句发送到数据库。 
		Statement createStatement() 
		
	    //创建一个 PreparedStatement对象,用于将参数化SQL语句发送到数据库。
		PreparedStatement prepareStatement(String sql)

	*事务管理
		1)开启事务 : 
			
			//将此连接的自动提交模式设置为给定状态。 
			//autoCommit=true 自动提交 autoCommit=false 关闭自动提交相当于开启事务
			setAutoCommit(boolean autoCommit) 
		
		2) 回滚事务:
			rollback()
		
		3)提交事务:
			commit()

3. 	Statement 接口
	 代表一条SQL语句对象,发送SQL给服务器,并返回结果对象
	 *	发送  DDL DML 语句
	 	int executeUpdate(String sql)  
	 
	 *  发送 DQL 语句
	 	ResultSet executeQuery(String sql)  

4. 	ResultSet 接口
	表示数据库结果集的数据表,通常通过执行查询数据库的语句生成。
	ResultSet对象保持一个光标指向其当前的数据行。 最初,光标位于第一行之前。 next方法将光标移动到下一行,并且由于在ResultSet对象中没有更多行时返回false ,因此可以在while循环中使用循环来遍历结果集。 
	
    * boolean next()
    
	  	//游标向下移动 1 行 
		//如果还有下一条记录返回 true,否则返回 false

	* getter 方法
	 
	 //通过字段名 或者列号获取不同类型的列值
		参见PDF 2.8 节
	
	* 使用步骤
		1. 游标向下移动一行
		2. 判断是否有数据
		3. 获取数据

	* 注意资源释放
		使用完毕以后要关闭结果集 ResultSet,再关闭 Statement,再关闭 Connection

5. 使用示例
	1. DDL 操作
		使用 JDBC 在 MySQL 的数据库中创建一张学生表
		字段 id 类型int 非空 主键 自增
		字段 name 类型varchar 长度20 非空
		字段 gender 类型 tinyint 长度1 默认值 1 
		字段 birthday 类型 date 

	2. DML 操作
		向学生表添加4条记录,主键是自增的。
		 name   gender  birthday
		孙悟空   1	   	1993-03-24
		白骨精	0		1995-03-24
		猪八戒	1		1903-03-24
		嫦娥		0		1993-03-11

	3. DQL 操作
		查询学生表记录,并打印出学生信息


	4. 抽取工具类
		抽出的公共代码分析:
		1) 用户名,密码, URL,驱动类配置
			使用配置文件
		2) 数据库连接 getConnection
		3) 关闭所有打开的资源

	5. 登录验证
	 	编写程序得到从控制台输入的用户名和密码来查询数据库, 验证输入的用户名和密码是否正确


	6. PreparedStatement 接口 改造验证登录
		使用步骤:
			1)编写 SQL 语句,未知内容使用? 占位 
				如: SELECT * FROM user WHERE name=? AND password=? 
			2)获得 PreparedStatement 对象
			3)设置实际参数: setXXX(占位符的位置,真实的值)
			4)执行参数化 SQL 语句				
			5)关闭资源
		优点:
	   		1)有预编译的功能,提高 SQL 的执行效率
			2)可以有效的防止 SQL 注入的问题,安全性更高。
		
	7. 事务管理示例
		使用事务完成张三向李四转账操作

JDBC连接池

1. 存放数据库连接的容器
	1) 节约资源
	2) 用户访问高效
2. DataSource 接口
	DataSource 接口,在 javax.sql 包下, 用于连接物理数据源的工厂, 作为 DriverManager 工具的替代方案, DataSource 对象是获取连接的首选方法。 DataSource 接口由驱动程序供应商实现。

	1)方法
		* 获取连接
			getConnection()
		* 释放连接
		    Connection.close()
	2)常用连接池技术
		* C3P0   :  开源JDBC连接池  
		* Druid : 阿里巴巴提供
3. C3P0 使用
	* 步骤
		1)导入依赖jar包:
		c3p0-0.9.5.2.jar mchange-commons-java-0.2.12.jar
		2)定义配置文件:
			* 名称: c3p0.properties 或者 c3p0-config.xml
			* 路径:直接将文件放在src目录下即可。
		3) 创建核心对象 数据库连接池对象 ComboPooledDataSource
		4) 获取连接: getConnection
4. druid 使用
	* 步骤:
		1) 导入jar包 druid-1.0.9.jar
		2) 定义配置文件:
			* 是properties形式的
			* 可以叫任意名称,可以放在任意目录下
		3) 加载配置文件。Properties
		4) 获取数据库连接池对象:通过工厂来来获取  	DruidDataSourceFactory
		5) 获取连接:getConnection	 

5. 编写连接池工具类DataSourceUtil
	* 提供静态代码块加载配置文件,初始化连接池对象
	* 提供方法
		1) 获取连接方法:通过数据库连接池获取连接
		2) 释放资源
		3) 获取连接池的方法

JdbcTemplate

 Spring对JDBC的封装,目的是使JDBC更加易于使用,简化JDBC的开发
(Spring 是最受欢迎的企业级 Java 应用程序开发框架)

1. 使用步骤
 
	1) 导入jar包 
		
	2) 创建JdbcTemplate对象。依赖于数据源DataSource
		* JdbcTemplate template = new JdbcTemplate(ds);

	3) 调用JdbcTemplate的方法来完成CRUD的操作
		1. update()
			执行DML语句。增、删、改语句
		2. queryForMap()
			查询结果将结果集封装为map集合,将列名作为key,将值作为value 将这条记录封装为一个map集合
			* 注意:这个方法查询的结果集长度只能是1
		3. queryForList()
			查询结果将结果集封装为list集合
			* 注意:将每一条记录封装为一个Map集合,再将Map集合装载到List集合中
		4. query()
			查询结果,将结果封装为JavaBean对象
			* query的参数:RowMapper
				  一般我们使用BeanPropertyRowMapper实现类。可以完成数据到JavaBean的自动封装
				  new BeanPropertyRowMapper<类型>(类型.class)
		5. queryForObject
			查询结果,将结果封装为对象
			* 一般用于聚合函数的查询

2. 练习:
	* 需求 (使用员工表emp ):
		1) 修改1号数据的 salary 为 10000
		2) 添加一条记录
		3) 删除刚才添加的记录
		4) 查询id为1的记录,将其封装为Map集合
		5) 查询所有记录,将其封装为List
		6) 查询所有记录,将其封装为Emp对象的List集合
		7) 查询总记录数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值