JDBC学习笔记

package myStudy_jdbc.com.xiaoqiang;

import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * 
* <p>Title: JDBCDemo</p>  
* <p>Description: JDBC示例</p>  
* @author xiaoqiang
* @date 2021年8月7日
* 
* JDBC概念:java Database Connectiity java语言操作数据库
* JDBC本质:java定义了操作所有关系型数据库的规则(接口),数据库厂商实现接口(数据库驱动),提供数据库驱动jar包,我们可以使用这套
* 		接口(JDBC)编程,真正执行的代码是jar包中的实现类
* 
* 使用步骤:
* 	1.导入驱动jar包
* 	2.注册驱动
* 	3.获取数据库连接对象 Connection
* 	4.定义sql
* 	5.获取执行sql语句的对象 Statement
* 	6.执行sql,接收返回结果
* 	7.处理结果
* 	8.释放数据链接
* 
* jdbc 对象介绍
* 	1.DriverManager:驱动管理对象
* 		功能:
* 			1.注册驱动,告诉程序使用什么数据库 static void registerDriver(Driver d)
* 			mysql驱动包源码有这样一段加载驱动的代码在com.mysql.cj.jdbc.Driver类中调用DriverManager注册驱动程序
*    		static {
*		        try {
*		            java.sql.DriverManager.registerDriver(new Driver());
*		        } catch (SQLException E) {
*		            throw new RuntimeException("Can't register driver!");
*		        }
*		    }
* 
* 			2.获取数据链接
* 				方法:static Connection getConnection(String url,String user,String  password)
* 	2.Connection:数据库连接对象
* 		功能:
* 			1.获取执行sql对象
* 				方法 Statement createStatement()
* 				方法 PreparedStatement preparedStatement(String sql)
* 			2.管理事务:
* 				开启:void setAutoCommit(boolean autoCommit) 参数设置为 false开启事务
* 				提交:void commit();
* 				回滚:void rollback();
* 	3.Statement:执行静态sql语句对象
* 		功能:执行静态sql并返回结果
* 		方法:
* 			1.int executeUpdate(String sql);
* 				执行DML(insert,update,delete)语句、DDL(create,alter,drop)语句,返回值是影响的行数
* 			2.ResultSet executeQuery(String sql):执行DQL(select)语句
* 	4.ResultSet:结果集对象,封装查询结果
* 		方法:
* 			1.boolean next();游标向下移动一行,光标位于最后一行之后返回false
* 			2.重载getXxx(int/String):获取数据,Xxx数据类型,例如 getInt获取 int类型数据
* 			重载参数:int:代表列的编号,编号从1开始
* 				String:代表列名(表字段名称)
* 
* 	5.PreparedStatement:执行预编译sql语句对象,解决sql注入问题
* 		sql注入问题:在拼接sql时,有一些sql的特殊关键字的字符串拼接,会造成安全性问题
* 		预编译sql:sql语句的参数使用占位符(?)
* 		获取sql执行对象 Connection.prepareStatement(String sql);
* 		给?赋值使用 setXxx(参数1(?的位置,从1开始),参数2(sql参数的值))
* 
* 	jdbc 控制事务
* 		使用Connection 管理事务
* 		开启:void setAutoCommit(boolean autoCommit) 参数设置为 false开启事务
* 		提交:void commit();
* 		回滚:void rollback();
* 
*/
public class JDBCDemo {
	public static void main(String[] args) throws ClassNotFoundException, SQLException {
//		JDBCMethod();
//		resultSetMethod();
//		preparedStatementMethod();
		transactionMethod(1,2,500);
	}
	
	/**
	 * 
	 * <p>Title: JDBCMethod</p>  
	 * <p>Description: JDBC 连接示例</p>
	 */
	public static void JDBCMethod() {
		Connection conn = null;
		Statement stmt = null;
		try {
			// 注册驱动
			Class.forName("com.mysql.cj.jdbc.Driver");// mysql8.0版本后驱动
//				Class.forName("com.mysql.jdbc.Driver");//mysql8.0版本前驱动
			// 获取数据库连接对象 Connection(mysql 8.0后的版本需要在url中指定时区属性 serverTimezone=UTC)
			conn = DriverManager.getConnection(
					"jdbc:mysql://localhost:3306/db1?characterEncoding=utf-8&serverTimezone=UTC&useSSL=false", "root",
					"Xiaoqiang1006");
//			获取数据库连接对象 Connection(mysql 8.0前的版本)
//			conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db1", "root","Xiaoqiang1006");
			// 定义sql语句
			String sql = "update students set age='28' where id='1'";
			// 获取执行sql语句的对象 Statement
			stmt = conn.createStatement();
			// 执行sql,接收返回结果
			int count = stmt.executeUpdate(sql);
			// 处理结果
			System.out.println(count);

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			// 释放数据链接
			try {
				if (stmt != null) {
					stmt.close();
				}
				if (conn != null) {
					conn.close();
				}

			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
	
	/**
	 * 
	 * <p>Title: resultSetMethod</p>  
	 * <p>Description: JDBC查询示例</p>
	 */
	public static void resultSetMethod() {
		Connection conn = null;
		Statement stmt = null;
		
		try {
			Class.forName("com.mysql.cj.jdbc.Driver");
			conn = DriverManager.getConnection(
					"jdbc:mysql://localhost:3306/db1?characterEncoding=utf-8&serverTimezone=UTC&useSSL=false", "root",
					"Xiaoqiang1006");
			String sql = "select * from students";
			stmt = conn.createStatement();
			ResultSet rs = stmt.executeQuery(sql);
			while (rs.next()) {
				int i = rs.getInt("id");
				String name = rs.getString("name");
				Date date = rs.getDate("birthday");
				System.out.println("id:"+ i +",姓名:"+name+",生日:"+date.toString());
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			try {
				if (stmt != null) {
					stmt.close();
				}
				if (conn != null) {
					conn.close();
				}

			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		
	}
	
	/**
	 * 
	 * <p>Title: preparedStatementMethod</p>  
	 * <p>Description:JDBC预编译防注入示例 </p>
	 */
	public static void preparedStatementMethod() {
		Connection conn = null;
		PreparedStatement ps = null;
		try {
			Class.forName("com.mysql.cj.jdbc.Driver");
			conn = DriverManager.getConnection(
					"jdbc:mysql://localhost:3306/db1?characterEncoding=utf-8&serverTimezone=UTC&useSSL=false", "root",
					"Xiaoqiang1006");
			
			//定义预编译sql
			String sql = "select * from students where id=? and password=?";
			//获取sql执行对象
			ps = conn.prepareStatement(sql);
			//传递where的占位符参数
			ps.setInt(1, 1);
			ps.setString(2, "12345");
			
			//执行sql
			ResultSet rs = ps.executeQuery();
			
			while (rs.next()) {
				int i = rs.getInt("id");
				String name = rs.getString("name");
				Date date = rs.getDate("birthday");
				System.out.println("id:"+ i +",姓名:"+name+",生日:"+date.toString());
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			JDBCCloseUtilMethod(ps, null);
		}
	}
	
	/**
	 * 
	 * <p>Title: transactionMethod</p>  
	 * <p>Description: JDBC事务示例</p>  
	 * @param id1
	 * @param id2
	 * @param amount
	 */
	public static void transactionMethod(int id1,int id2,double amount) {

		Connection conn = null;
		PreparedStatement ps1 = null;
		PreparedStatement ps2 = null;
		try {
			Class.forName("com.mysql.cj.jdbc.Driver");
			conn = DriverManager.getConnection(
					"jdbc:mysql://localhost:3306/db1?characterEncoding=utf-8&serverTimezone=UTC&useSSL=false", "root",
					"Xiaoqiang1006");
			
			//开启事务
			conn.setAutoCommit(false);
			
			//定义两个sql,一个数据加一个数据减
			String sql1 = "update students set amount = amount-? where id = ?";
			String sql2 = "update students set amount = amount+? where id = ?";
			
			//获取sql执行对象
			ps1 = conn.prepareStatement(sql1);
			//传递where的占位符参数
			ps1.setDouble(1, amount);
			ps1.setInt(2, id1);
			//执行sql1
			int rs1 = ps1.executeUpdate();
			
			//编写一个运行异常,测试是否回滚
//			int i = 10/0;
			
			//获取sql执行对象
			ps2 = conn.prepareStatement(sql2);
			//传递where的占位符参数
			ps2.setDouble(1, amount);
			ps2.setInt(2, id2);
			//执行sql1
			int rs2 = ps2.executeUpdate();
			
			//判断数据修改正常提交事务,否则回滚
			if(rs1>0 && rs2>0) {
				conn.commit();
			}else {
				conn.rollback();
			}
		} catch (Exception e) {
			try {
				//抛出异常回滚
				conn.rollback();
			} catch (SQLException e1) {
				e1.printStackTrace();
			}
			e.printStackTrace();
		}finally {
			JDBCCloseUtilMethod(ps1, null);
			JDBCCloseUtilMethod(ps2, conn);
		}
	
	}
	
	/**
	 * 
	 * <p>Title: JDBCCloseUtilMethod</p>  
	 * <p>Description: 释放jdbc资源</p>  
	 * @param ps
	 * @param conn
	 */
	public static void JDBCCloseUtilMethod(PreparedStatement ps, Connection conn) {
		try {
			if (ps != null) {
				ps.close();
			}

			if (conn != null) {
				conn.close();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}

	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值