JDBC (基础day01,day02)

1. JDBC的基本概念
	* Java DataBase Connectivity  Java 数据库连接, Java语言操作数据库
	* JDBC本质:其实是官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类。
	* 简而言之 : 官方定义接口 各大数据库厂商重写接口 并提供 jar 包供我们编程使用



2. 快速入门代码
	*  Connection connection = null;             			 // 创建连接数据库对象
	*  Statement statement = null;               			 // 创建操作Sql对象
	*  // ResultSet rs = null;					  			 // 创建结果集对象
	*  // list<Emp> list  = new ArrayLIst<Emp>; 		  	 // 创建集合
	*  
	*  Class.forName("com.mysql.jdbc.Driver");  			 // 注册驱动
	*  String sql_1 = "delate from account where id = 3 "; 
	*  String sql_2 = "insert account into (id, name, balabce) value (1, 'wang ', 1000)";
	*  String sql_3 = "update account set balance = 10000 where id = 1"; // DDL
	*  
	*  // String sql_4 = "select * from account"; //DML
	*  
	*  connection = DriverManager.getConnection();  // 为数据库连接对象赋值
	*  statement = connection.createStatement();	// 为操作Sql对象赋值
	*  int count = statement.excuteUpdate(sql_1);	
	*  // 获取操作结果执行excuteUpdate 方法的语句的返回值是 表中多少行数据发生了修改
	*  System.out.println(count); 


	*  /* 
	*  
	*  (注:/* */中的部分为DML查询语句的使用)
	*  
	*  // 外面自定义类 用来存储表的列中的数据 并放入集合
	*  re = statement.excuteQuery() 
	*  while(re.next){
	*      emp = new Emp;
	*      Int id = re.getInt(id);
	*      String name = re.getString(name);
	*      Double balance = re.getDouble(balance);
	*      emp.setId(id);
	*      emp.setName(name);
	*      emp.setBalance(balance);
	*      list.add(emp);
	*  }
	*     //遍历输出
	*     Iterator it = list.iterator;
	*     whlie(it.hasNext){
	*        System.out.println(it.next);
	*     }

	*	// 释放资源
	*	collection.close();
	*	statement.close();
	*	re.close();
	*  */
 

3. 详解各个接口和类
	* DriverManager 驱动管理对象
		1. 注册驱动 : 告诉程序应该使用哪个数据库驱动jar
			* 代码:
				**class.from("com.mysql.jdbc.Driver");**
				传入的参数是一个.class文件 
				在这个类中 有一个静态代码块 (注册驱动的底层方法)
				static {
				        try {
				            java.sql.DriverManager.registerDriver(new Driver());
				        } catch (SQLException E) {
				            throw new RuntimeException("Can't register driver!");
				        }
					}
			注:mysql5之后的驱动jar包可以省略注册驱动的步骤
			在jar包内有一个文件中 写了 "com.mysql.jdbc.Driver";
		2. 获取数据库连接
			* 方法: static Connection getConnection((String url, String user, String password)
			* 三个参数:
				* url :指定连接的路径
						* 语法:jdbc:mysql://ip地址(域名 本计算机是127.0.0.1):端口号(本机是3306)/数据库名称;
						* **jdbc:mysql://localhost:3306/db3;**
						* 如果连接的是本机mysql服务器,并且mysql服务默认端口是3306,则url可以简写为:jdbc:mysql:///数据库名称
				* user:用户名
				* password: 密码
		 Connection:数据库连接对象
			功能:
			 1. 获取执行sql 的对象
				* Statement createStatement()
				* PreparedStatement prepareStatement(String sql)  
			 2. 管理事务:
				* 开启事务:setAutoCommit(boolean autoCommit) :调用该方法设置参数为false,即开启事务
				* 提交事务:commit() 
				* 回滚事务:rollback() 
		3. Statement:执行sql的对象
				执行sql
				1. int executeUpdate(String sql) :执行DML(insert、update、delete)语句、DDL(create,alter、drop)语句
					* 返回值:影响的行数,可以通过这个影响的行数判断DML语句是否执行成功 返回值>0的则执行成功,反之,则失败。
				2. ResultSet executeQuery(String sql)  :执行DQL(select)语句
					* 返回值: ResultSet 结果集对象
		4. ResultSet:结果集对象,封装查询结果
			* boolean next(): 游标向下移动一行,判断当前行是否是最后一行末尾(是否有数据),如果是,则返回false,如果不是则返回true
			* getXxx(参数):获取数据
				* Xxx:代表数据类型   如: int getInt() ,	String getString()
				* 参数:
					1. int:代表列的编号,从1开始   如: getString(1)
					2. String:代表列名称。 如: getDouble("balance")
					【 使用举例 】
					    *   while(re.next){
						*      emp = new Emp;
						*      Int id = re.getInt(id);
						*      String name = re.getString(name);
						*      Double balance = re.getDouble(balance);
						*      emp.setId(id);
						*      emp.setName(name);
						*      emp.setBalance(balance);
						*      list.add(emp);
						*  }
											
		5. PreparedStatement:执行sql的对象
			1. SQL注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串的拼接。会造成安全性问题
				1. 输入用户随便,输入密码:a' or 'a' = 'a
				2. sql:select * from user where username = 'fhdsjkf' and password = 'a' or 'a' = 'a' 

			2. 解决sql注入问题:使用PreparedStatement对象来解决
			3. 预编译的SQL:参数使用?作为占位符
			4. 步骤:
				1. 导入驱动jar包 mysql-connector-java-5.1.37-bin.jar
				2. 注册驱动
				3. 获取数据库连接对象 Connection
				4. 定义sql
					* 注意:sql的参数使用?作为占位符。 如:select * from user where username = ? and password = ?;
				5. 获取执行sql语句的对象 PreparedStatement  Connection.prepareStatement(String sql) 
				6. 给?赋值:
					* 方法: setXxx(参数1,参数2)
						* 参数1:?的位置编号 从1 开始
						* 参数2:?的值
				7. 执行sql,接受返回结果,不需要传递sql语句
				8. 处理结果
				9. 释放资源

			5. 注意:后期都会使用PreparedStatement来完成增删改查的所有操作
				**1. 可以防止SQL注入**
				2. 效率更高

抽取JDBC工具类: JDBCUtils;

* 目的: 懒 (减少冗余) 
* 用到的类:
		*  Connection  方法 
		*  Classloder	方法: getResource() 返回当前加载类所在路径的工程文件  传入参数为文件名
		*  URL	方法:getpath()返回资源文件的地址
		*  Properties 	方法: lode() 获取键值对集合
							  getPropery()  根据键获取值
		*  Class		方法: getClassLoder
		*  DriverManager	方法:getConnection
* 实现
	1. 注册驱动
	2. 获取连接对象
	3. 释放资源

 * 书写 JDBC 工具类的步骤
 *  1. 创建静态变量 driver user password url
 *  2. 创建静态代码块(意义:)
 *      * 静态代码块的内容
 *        a. 要完成的事情是 把资源文件中的四个键值对属性 为本类中的静态变量赋值 以达到代码的高可用性
 *        b. 步骤
 *              (1). 创建 properties 资源对象
 *              (2). 拿到本类的类加载文件 ClassLoder cl = 类名.class.getClassLoder
 *              (3). 获取 资源文件中的资源  URL resource = cl.getResource("资源文件名");
 *              (4). 获取 工程资源文件对象的地址  resource.getPath();
 *              (5). 将工程资源文件的地址传入 properties.lode() 获取到资源文件中的键值对
 *              (6). 通过键值对给静态变量赋值 用到properties的getProperty方法
 *              (7). 注册驱动 Class.forName(driver);
 *  3. 构建静态方法获取连接
 *  4. 构建静态方法关闭资源

JDBC控制事务

1. 事务: 一个包含多个步骤的业务操作,如果这个业务操作被事务管理,那么如果有一步失败,整个事务也失败;
	1. 开启
	2. 提交
	3. 回滚
2. 使用connection对象来管理事务
	1. 开启:setAutoCommite()
	2. 提交:commit()
	3. 回滚:rollback()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值