【Java基础】JDBC的手写Demo

一、 重点:

  1. 面向接口编程概念: (接口:规范)屏蔽了各个数据库之间的差异; 操作思想:通过jdbc中的接口,从驱动中取出实现类,调用实现类的重写方法,由他们操作数据库.
  2. JDBC开发的步骤
  3. JDBC里面接口和类的作用

二、 JDBC: (Java Database Connectivity)

1. 概念:Java数据库连接,Java语言操作数据库

2. 本质:

SUN公司定义了一套操作所有关系型数据库的规则(接口),各个数据库厂商去实现这套接口,提供数据库驱动Jar包.我们可以使用这套接口(JDBC)编程,真正执行的是驱动Jar包中的实现类;
驱动:两个设备之间通信的桥梁,电脑的驱动就是让计算机能够识别硬件;
数据库的驱动:JDBC的实现类,由各个数据库厂商提供的.

三、 快速入门:

1) 步骤:

1.	导入驱动jar包
2.	注册驱动
3.	获取数据库的连接对象 Connection
4.	定义sql语句
5.	获取执行sql的对象Statement语句
6.	执行sql,接受返回结果
7.	处理结果
8.	释放资源

2) 代码实现:

	/*1.导入jar包
		a.复制jar包到项目的新建libs目录下 
		b.右键Add As Libraray
	*/
	//2.注册驱动
	Class.forName(“com.mysql.jdbc.Driver”);
	//3.获取连接
	Connection	conn = DriverManager.getConnection(jdbc:mysql://localhost:3306/mydb3,”root”,”root”);
	//4.操作sql
		//编写sql语句
	String sql = “update student set age = 18 where id = 1;
		//获取执行sql的Statement对象
	Statement stmt = conn.createStatement();
		//执行sql
	int count = stmt.executeUpdate(sql);
		//处理结果
	System.out.println(count);
	//5.释放资源
	stmt.close();
	conn.close();

四、 详解各个对象:

1) DriverManager 类:驱动管理对象

功能:

1. 注册驱动

//代码:
Class.forName(“com.mysql.jdbc.Driver”);
static void registerDriver(Driver driver):
//注册与给定的驱动程序注册驱动;

//查看源码,发现在”com.mysql.jdbc.Driver”类中有一个静态代码块;
static{
	try{
		java.sql.DriverManager.registerDriver(new driver());
	}catch(SQLException e){
	e.printStackTrace();
	}
}

2. 获取数据库连接

方法:static Connection getConnection(String url,String user,String password)
URL: 协议名:子协议名://ip地址:端口号/数据库名 如果访问的是本地数据库,则可以省略ip地址和端口号
eg: jdbc:mysql:///数据库名

2) Connection 接口:数据库连接对象

功能:

//1.获取执行sql的对象
	Statement createStatement():
	PrepareStatement prepareStatement(String sql):
//2.管理事务:
		//开启事务:
		setAutoCommit(boolean autoCommit)
		//回滚事务:
		rollback()
		//提交事务:
		commit()

3) Statement 接口: 执行sql语句对象

方法:

1.	boolean execute(String sql):  (了解)可以执行任意的sql
2.	int executeUpdate(String sql):  --- 增删改
执行DML(insert,update,delete)语句/DDL(create,alter,drop)语句
int: 影响的行数 ---可以判断DML语句是否执行成功,返回值>0则执行成功
3.	ResultSet executeQuery(String sql) --- 查询语句
执行DQL(select)语句
[补充] 快捷键: ctrl alt + T: 快速try catch finally

4) ResultSet 接口:结果集对象,封装查询结果;

方法:

1.	boolean next(): 游标向下移动一行
判断当前行是否是最后一行(是否有数据),如果有则返回true,反之false;
2.	getXxx(参数): 获取数据  Xxx: 数据类型
		eg: getInt()  getString()
	 参数: 
 	 int: 代表列的编号 ,从1开始   eg: getString(1) 
	 String: 代表列的名称  eg: getInt(“age”)
	 注意:
		使用步骤:
	    1.	游标向下移动一行
	    2.	判断是否有数据
	    3.	获取数据
封装查询到的数据到JavaBean注意事项:
	    1.	JavaBean的属性名要和表中的列名一致
	    2.	JavaBean的属性数据类型要和表中的一致

5) PreparedStatement: 执行sql语句对象

1.	sql的注入问题:
	 在拼接sql时,有一些sql的特殊关键字参与字符串的拼接,会造成安全性问题;
2.	解决sql注入问题:使用PreparedStatement对象来解决,
	 参数使用?作为占位符

步骤:

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 ps = Connection.prepareStatement(String sql)

6. 给?赋值:
  • 方法: setXxx(参数1,参数2)
  • 参数1:?的位置编号 从1 开始
  • 参数2:?的值
7. 执行sql,接受返回结果,不需要传递sql语句
8. 处理结果
9. 释放资源
注意:后期都会使用PreparedStatement来完成增删改查的所有操作(可以防止SQL注入 / 效率更高)

五、 抽取JDBC工具类:

目的:简化书写

代码实现:

//1.	抽取注册驱动的代码  (使用静态代码块)
private static String driver;
private static String url;
private static String user;
private static String password;
static{
	try{
//(URL,USER,PASSWORD,DRIVER是需要修改的内容,可以都放入配置文件内,然后将配置文件放在**src**文件下)
		//1.	创建Properties对象
		Properties pro = new Properties();
		//2.	加载配置文件
		ClassLoader cl = JDBCUTils.class.getClassLoader();
		InputStream is=cl.getResourceAsStream("jdbc.properties");
		pro.load(is);
		//3.	获取数据并赋值
		//注意:key值都要和配置文件的一一对应
		url = pro.getProperty("url");  
		user = pro.getProperty("user");
		password = pro.getProperty("password");
		driver = pro.getProperty("driver");
		//4.	替换数据
		/*将“com.mysql.jdbc.Driver”替换为driver;
		将“jdbc:mysql://localhost:3306/myjdbc”替换为url;
		将”root”替换为user;
		将”root”替换为password;*/
		Class.forName("com.mysql.jdbc.Driver");
	}catch(SQLException e){
		e.printStackTrace();
	}
}
//2.	抽取获取连接对象的方法
public static Connection getConnection(){
	return DriverManager.getConnection("jdbc:mysql://localhost:3306/myjdbc","root","密码")
}
//3.	抽取释放资源的方法
public static void close(Connection conn,Statement stmt){
	if(stmt != null){
		try{
			stmt.close();
		}catch(SQLException e){
		e.printStackTrace();
		}
	}
	if(conn != null){
		try{
			conn.close();
		}catch(SQLException e){
			e.printStackTrace();
		}
	}
}
public static void close(ResultSet rs,Connection conn,Statement stmt){
	if(conn != null){
		try{
			conn.close();
		}catch(SQLException e){
			e.printStackTrace();
		}
	}
close(conn,stmt);
}

六、 JDBC控制事务:

使用Connection对象来管理事务

1. 开启事务:setAutoCommit(boolean autoCommit) :

调用该方法设置参数为false,即开启事务 在执行sql之前开启事务

2. 提交事务:commit()

当所有sql都执行完提交事务

3. 回滚事务:rollback()

在catch中回滚事务

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值