java核心技术第三篇之JDBC第一篇

01.JDBC_两个重要的概念: 1).什么是数据库驱动程序:由数据库厂商提供,面向某种特定的编程语言所开发的一套访问本数据库的类库。 驱动包一般由两种语言组成,前端是:面向某种特定编程语言的语言;后端是:本数据库的语言。 可以方便开发人员使用自己的语言来访问本公司的数据库软件。

2).什么是JDBC:是由SUN公司提出一套Java访问数据库的一套标准。它物理上由一组类和接口组成。要求数据库厂商的驱动程序
               必须遵守这套标准流程。也要求我们Java程序员也遵守这套流程。这样就使得我们Java程序员访问各种数据库软件
	       所使用的都是同一个流程。

02.JDBC_四个核心对象: 1).DriverManager:用来获取连接对象 2).Connection:一个连接对象,表示我们的程序和数据库之间的一个连接通道。 3).Statement:SQL执行平台,用于发送SQL语句; 4).ResultSet : 执行查询后将查询结果封装到ResultSet对象中,它就类似于一个集合。

JDBC是Java连接不同数据库的类库,它有三个核心功能:

  1. 连接数据库;
  2. 向数据库发送SQL语句;
  3. 操作SQL语句的返回结果。

A 、 JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API。 B 、 JDBC是Java访问数据库的标准规范,可以为不同的关系型数据库提供统一访问,它由一组用Java语言编写的接口和类组成。 C 、 JDBC需要连接驱动,驱动是两个设备要进行通信,满足一定通信数据格式,数据格式由设备提供商规定,设备提供商为设备提供驱动软件,通过软件可以与该设备进行通信。 D 、 JDBC是接口,驱动是接口的实现,没有驱动将无法完成数据库连接,从而不能操作数据库!

03.Java访问MySQL数据库: 1).将驱动包复制到项目目录下,添加到构建路径。 2).开发步骤: //1.注册驱动 Class.forName(“com.mysql.jdbc.Driver”); //2.获取连接对象 Connection conn = DriverManager.getConnection( “jdbc:mysql://127.0.0.1:3306/hei66_day21”, “root”, “123”); //3.获取SQL执行平台 Statement stmt = conn.createStatement(); //4.发送SQL语句,获取结果集 String sql = “select * from city”; ResultSet rs = stmt.executeQuery(sql); //5.处理结果集 while(rs.next()){ System.out.println(rs.getInt(“cid”) + “\t” + rs.getString(“cname”)); } //6.释放资源 rs.close(); stmt.close(); conn.close();

JDBC操作数据库的使用步骤顺序

1.导入mysql的驱动程序通过DriverManger注册驱动

2.通过DriverManager获取连接对象Connection

3.通过Connection获取一个可以向数据库发送sql语句的对象Statement

4.通过Statement对象执行sql语句(select) 得到一个结果集ResultSet

5.遍历结果集ResultSet,得到数据表中的数据

6.释放资源

04.开发步骤的详细说明: 1).注册驱动: 2).获取连接对象: getConnection(连接字符串,用户名,密码) 3).获取SQL执行平台–Statement Connection对象的createStatement() 4).发送SQL语句【重点掌握】: Statement的: a).public int executeUpdate(String sql):用于发送添加(insert)、修改(update)、删除(delete)语句的。 b).public ResultSet executeQuery(String sql):用于发送查询(select)语句的。 5).处理结果集:如果是发送的查询语句,会获取一个ResultSet结果集【重点掌握】 a).ResultSet–>next():让当前的游标位置下移一位;此方法会返回boolean值 b).获取某列的值:推荐使用getXxx(String 字段名) ResultSet–>getInt(String 字段名) getInt(int 字段索引):查询结果中的字段索引,是从1开始

			    getString(String 字段名)
			    getString(int 字段索引):
			
			    getObject(String 字段名)
			    getObject(int 字段索引):
6).释放资源:
	ResultSet-->close()
	Statement-->close()
	Connection-->close()

05.JDBC工具类的编写:

标准版:

1.5JDBC工具类 “获得数据库连接”操作,将在以后的增删改查所有功能中都存在,可以封装工具类JDBCUtils。提供获取连接对象的方法,从而达到代码的重复利用。 该工具类提供方法:public static Connection getConn ()。代码如下:

public class JdbcUtils {

private static String driver = "com.mysql.jdbc.Driver";
private static String url = "jdbc:mysql://localhost:3306/webdb_4";
private static String user = "root";
private static String password = "root";

static{
	try {
		//注册驱动
		Class.forName(driver);
	} catch (Exception e) {
		throw new RuntimeException(e);
	}
	
}

/**
 * 获得连接
 * @return
 * @throws SQLException 
 */
public static Connection getConnection() throws  SQLException{
	//获得连接
	Connection conn = DriverManager.getConnection(url, user, password);
	return conn;
}

/**
 * 释放资源
 * @param conn
 * @param st
 * @param rs
 */
public static void closeResource(Connection conn , Statement st , ResultSet rs){
	
	if(rs != null){
		try {
			rs.close();
		} catch (SQLException e) {
		}
	}
	
	if(st != null){
		try {
			st.close();
		} catch (SQLException e) {
		}
	}

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



//1.获取Connection对象--简单的代码复用,每次都会创建一个新的Connection对象
public static Connection getConnection() throws Exception{
	Class.forName("com.mysql.jdbc.Driver");
	Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/hei66_day21","root","123");
	return conn;
}

//2.释放所有资源
public static void closeAll(ResultSet rs,Statement stmt,Connection conn){
	if(rs != null){
		try {
			rs.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	if(stmt != null){
		try {
			stmt.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	if(conn != null){
		try {
			conn.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
}

06.SQL语句的拼接: Scanner sc = new Scanner(System.in); System.out.println(“学员姓名:”); String stuName = sc.next(); System.out.println(“年龄:”); int age = sc.nextInt(); System.out.println(“性别:”); String sex = sc.next(); System.out.println(“身高:”); double height = sc.nextDouble(); System.out.println(“地址:”); String address = sc.next(); System.out.println(“电话:”); String phoneNum = sc.next();

String sql = "insert into student values(null,'" + stuName + "'," + 
					age + ",'" + 
					sex + "'," + 
					height + ",'" + 
					address + "','" + 
					phoneNum + "')";
System.out.println(sql);
//1.获取连接
Connection conn = JDBCUtils.getConnection();
Statement stmt = conn.createStatement();
int row = stmt.executeUpdate(sql);
System.out.println("添加影响的行数:" + row);
JDBCUtils.closeAll(null, stmt, conn);

07.SQL注入的问题: 1.什么是SQL注入:用户输入的数据当中包含一些SQL的格式符号,如果我们不做处理,直接封装到SQL语句中,会导致 SQL语句出错,或者是得到不正确的结果。 2.解决方案:不使用Statement,改用:PreparedStatement,它是Statement的子接口,表示:预定义的SQL执行平台。 它能够将SQL语句和用户的数据分开管理,所以即使用户数据中包含SQL的格式符号,也不会解析为SQL的格式,所以 可以预防SQL注入的问题。 08.PreparedStatement的使用: 1).获取PreparedStatement对象: … PreparedStatement ps = conn.prepareStatement(String 预处理的SQL语句); //填充参数 ps.setString(1,xxx) ps.setInt(2,xxxx) //发送SQL语句 ps.executeUpdate();//注意:这里是无参调用–执行添加、修改、删除 ps.executeQuery();//无参。执行:查询

============================================================================================================================== 学习目标: 1.能够理解JDBC的概念: 1.JDBC是Sun公司提出一套Java连接数据库的标准。它的物理上由一些类和接口组成。 2.能够使用DriverManager类 Connection conn = DriverManager.getConnection(“jdbc:mysql://127.0.0.1:3306/hei66_day21”,“root”,“123”); 3.能够使用Connection接口 获取SQL执行平台: 1.Statement stmt = conn.createStatement(); 2.PreparedStatement ps = conn.parepareStatement(String 预处理的SQL语句)

4.能够使用Statement接口 1.public int executeUpdate(String sql):执行添加,修改,删除语句; 2.public ResultSet executeQuery(String sql):执行查询。 5.能够使用ResultSet接口 … ResultSet rs = stmt.executeQuery(“select * from student”); while(rs.next()){ rs.getInt(String 字段名称) rs.getInt(int 字段索引)

	rs.getString(String 字段名称)
	rs.getString(int 字段索引)
}

6.能够描述SQL注入的原理和解决方案: 1.SQL注入的原理:在用户的数据中包含了SQL的格式符号,我们将数据直接拼接SQL语句,会导致SQL语句错误或者执行结果错误。 2.解决方案:使用预处理的SQL执行平台:PreparedStatement 7.能够编写JDBC的工具类 public class JDBCUtils{ //1.获取连接对象的方法 public static Connection getConnection(){ Class.forName(“com.mysql.jdbc.Driver”); Connection conn = DriverManager.getConnection(“jdbc:mysql://127.0.0.1:3306/hei65_day21”,“root”,“123”); return conn; } //2.关闭所有连接的方法 public static void closeAll(ResultSet rs,Statement stmt,Connection conn) throws Exception{ if(rs != null){ rs.close(); } if(stmt != null){ stmt.close(); } if(conn != null){ conn.close(); } } } 8.能够使用PreparedStatement编写CURD(增删改查)代码 //1.添加 public void save() throws Exception{ //1.获取Connection对象 Connection conn = JDBCUtils.getConnection(); //2.获取预处理的SQL平台 PreparedStatement ps = conn.prepareStatement(“insert into student values(null,?,?,?,?,?,?)”); //3.填充数据 ps.setString(1, “汪峰”);//第一个?的位置,填充:汪峰 ps.setInt(2, 22); ps.setString(3, “男”); ps.setDouble(4, 1.80); ps.setString(5, “北京”); ps.setString(6, “00000000”);

	//4.执行SQL语句
	int row = ps.executeUpdate();
	System.out.println("添加影响的行数:" + row);
	//释放资源
	JDBCUtils.closeAll(null, ps, conn);
	
}

//2.修改
public void update() throws Exception{
	//1.获取Connection对象
	Connection conn = JDBCUtils.getConnection();
	//2.获取预处理的SQL平台
	String sql = "update student set stuName = ? , age = ?, sex = ?, height = ?, address = ?, phoneNum = ? where id = ?";
	PreparedStatement ps = conn.prepareStatement(sql);
	//3.填充数据
	ps.setString(1, "撒贝宁");
	ps.setInt(2, 22);
	ps.setString(3, "男");
	ps.setDouble(4, 1.5);
	ps.setString(5, "北京");
	ps.setString(6, "77777777");
	ps.setInt(7, 3);
	
	//4.执行SQL
	int row = ps.executeUpdate();
	System.out.println("修改影响的行数:" + row);
	
	//5.释放资源
	JDBCUtils.closeAll(null, ps, conn);
}

//3.查询
public void findById() throws Exception{
	//1.获取Connection
	Connection conn = JDBCUtils.getConnection();
	//2.获取SQL执行平台
	PreparedStatement ps = conn.prepareStatement("select * from student where id = ?");
	//3.填充数据
	ps.setInt(1, 3);
	//4.执行查询
	ResultSet rs = ps.executeQuery();
	if(rs.next()){
		System.out.println(rs.getInt("id") + "\t" + rs.getString("stuName"));
	}
	//5.释放资源
	JDBCUtils.closeAll(null, ps, conn);
}

//4.删除
@Test
public void deleteById() throws Exception{
	//1.获取Connection对象
	Connection conn = JDBCUtils.getConnection();
	//2.获取SQL执行平台
	PreparedStatement ps = conn.prepareStatement("delete from student where id = ?");
	ps.setInt(1, 3);
	//3.执行
	int row = ps.executeUpdate();
	System.out.println("删除影响的行数:" + row);
	//4.释放
	JDBCUtils.closeAll(null, ps, conn);
	
}

package cn.baidu.demo02_JDBC开发的增删改查;

import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement;

import org.junit.Test;

public class Demo { //1.添加 public void save() throws Exception{ //1.注册驱动 Class.forName(“com.mysql.jdbc.Driver”); //2.获取连接对象 Connection conn = DriverManager.getConnection(“jdbc:mysql://127.0.0.1:3306/hei66_day21”,“root”,“123”); //3.获取SQL执行平台 String sql = “insert into city values(null,‘洛阳’,3)”; Statement stmt = conn.createStatement(); int row = stmt.executeUpdate(sql); System.out.println(“添加影响的行数:” + row); //4.释放资源 stmt.close(); conn.close(); } //2.修改 public void update() throws Exception{ //1.注册驱动 Class.forName(“com.mysql.jdbc.Driver”); //2.获取连接对象 Connection conn = DriverManager.getConnection(“jdbc:mysql://127.0.0.1:3306/hei66_day21”,“root”,“123”); //3.获取SQL执行平台 String sql = “update city set cname = ‘信阳’ where cname = ‘洛阳’”; Statement stmt = conn.createStatement(); int row = stmt.executeUpdate(sql); System.out.println(“修改影响的行数:” + row); //4.释放资源 stmt.close(); conn.close(); } //3.删除 public void delete() throws Exception{ Class.forName(“com.mysql.jdbc.Driver”); Connection conn = DriverManager.getConnection(“jdbc:mysql://127.0.0.1:3306/hei66_day21”,“root”,“123”); Statement stmt = conn.createStatement(); String sql = “delete from city where cid = 7”; int row = stmt.executeUpdate(sql); System.out.println(“删除影响的行数:” + row); stmt.close(); conn.close(); } //4.查询所有记录 @Test public void findAll() throws Exception{ Class.forName(“com.mysql.jdbc.Driver”); Connection conn = DriverManager.getConnection(“jdbc:mysql://127.0.0.1:3306/hei66_day21”,“root”,“123”); Statement stmt = conn.createStatement(); String sql = “select * from city”; ResultSet rs = stmt.executeQuery(sql); //遍历 while(rs.next()){ System.out.println(rs.getInt(“cid”) + “\t” + rs.getString(“cname”) + “\t” + rs.getInt(“pid”)); } //释放资源 rs.close(); stmt.close(); conn.close(); } }

package cn.baidu.demo03_自定义工具类的编写;

import java.io.FileReader; import java.io.IOException; import java.sql.Connection; import java.sql.ResultSet; import java.sql.Statement;

import org.junit.Test;

public class Demo { //1.添加 public void save() throws Exception{

	//2.获取连接对象
	Connection conn = JDBCUtils.getConnection();
	//3.获取SQL执行平台
	String sql = "insert into city values(null,'洛阳',3)";
	Statement stmt = conn.createStatement();
	int row = stmt.executeUpdate(sql);
	System.out.println("添加影响的行数:" + row);
	//4.释放资源
	JDBCUtils.closeAll(null, stmt, conn);
}
//2.修改
public void update() throws Exception{
	
	//2.获取连接对象
	Connection conn = JDBCUtils.getConnection();
	//3.获取SQL执行平台
	String sql = "update city set cname = '信阳' where cname = '洛阳'";
	Statement stmt = conn.createStatement();
	int row = stmt.executeUpdate(sql);
	System.out.println("修改影响的行数:" + row);
	//4.释放资源
	/*stmt.close();
	conn.close();*/
	JDBCUtils.closeAll(null, stmt, conn);
}
//3.删除
public void delete() throws Exception{
	Connection conn = JDBCUtils.getConnection();
	Statement stmt = conn.createStatement();
	String sql = "delete from city where cid = 7";
	int row = stmt.executeUpdate(sql);
	System.out.println("删除影响的行数:" + row);
	/*stmt.close();
	conn.close();*/
	JDBCUtils.closeAll(null, stmt, conn);
}
//4.查询所有记录
@Test
public void findAll() throws Exception{
	
	Connection conn = JDBCUtils.getConnection();
	Statement stmt = conn.createStatement();
	String sql = "select * from city";
	ResultSet rs = stmt.executeQuery(sql);
	//遍历
	while(rs.next()){
		System.out.println(rs.getInt("cid") + "\t" + rs.getString("cname") + "\t" + rs.getInt("pid"));
	}
	//释放资源
	/*
	rs.close();
	stmt.close();
	conn.close();*/
	JDBCUtils.closeAll(rs, stmt, conn);
}

}

package cn.baidu.demo03_自定义工具类的编写;

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

public class JDBCUtils { //1.获取Connection对象–简单的代码复用,每次都会创建一个新的Connection对象 public static Connection getConnection() throws Exception{ Class.forName(“com.mysql.jdbc.Driver”); Connection conn = DriverManager.getConnection(“jdbc:mysql://127.0.0.1:3306/hei66_day21”,“root”,“123”); return conn; }

//2.释放所有资源
public static void closeAll(ResultSet rs,Statement stmt,Connection conn){
	if(rs != null){
		try {
			rs.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	if(stmt != null){
		try {
			stmt.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	if(conn != null){
		try {
			conn.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
}

}

package cn.baidu.demo04_封装SQL语句;

import java.sql.Connection; import java.sql.Statement; import java.util.Scanner;

import org.junit.Test;

import cn.baidu.demo03_自定义工具类的编写.JDBCUtils;

public class Demo { @Test public void save() throws Exception{ Scanner sc = new Scanner(System.in); System.out.println(“请输入一个河南的市名:”); String city = sc.next();

//	String sql = "insert into city values(null,'信阳',3)";
	String sql = "insert into city values(null,'" + city + "',3)";
	System.out.println(sql);
	//获取连接
	Connection conn = JDBCUtils.getConnection();
	Statement stmt = conn.createStatement();
	int row = stmt.executeUpdate(sql);
	System.out.println("添加影响的行数:" + row);
	//释放连接
	JDBCUtils.closeAll(null, stmt, conn);
}
public void saveStudent() throws Exception{
	Scanner sc = new Scanner(System.in);
	System.out.println("学员姓名:");
	String stuName = sc.next();
	System.out.println("年龄:");
	int age = sc.nextInt();
	System.out.println("性别:");
	String sex = sc.next();
	System.out.println("身高:");
	double height = sc.nextDouble();
	System.out.println("地址:");
	String address = sc.next();
	System.out.println("电话:");
	String phoneNum = sc.next();
	
	String sql = "insert into student values(null,'" + stuName + "'," + 
											age + ",'" + 
											sex + "'," + 
											height + ",'" + 
											address + "','" + 
											phoneNum + "')";
	System.out.println(sql);
	//1.获取连接
	Connection conn = JDBCUtils.getConnection();
	Statement stmt = conn.createStatement();
	int row = stmt.executeUpdate(sql);
	System.out.println("添加影响的行数:" + row);
	JDBCUtils.closeAll(null, stmt, conn);
	
	
}

}

package cn.baidu.demo05_关于SQL注入的问题;

import java.sql.Connection; import java.sql.ResultSet; import java.sql.Statement; import java.util.Scanner;

import cn.baidu.demo03_自定义工具类的编写.JDBCUtils;

public class Demo { public static void main(String[] args) throws Exception { Scanner sc = new Scanner(System.in); System.out.println(“请输入登录名:”); String loginName = sc.nextLine(); System.out.println(“请输入密码:”); String loginPwd = sc.nextLine();

	String sql = "select * from users where loginName = '" + loginName + 
									"' and loginPwd = '" + loginPwd + "'";
	System.out.println(sql);
	//1.获取连接对象
	Connection conn = JDBCUtils.getConnection();
	Statement stmt = conn.createStatement();
	ResultSet rs = stmt.executeQuery(sql);
	if(rs.next()){
		System.out.println("欢迎:" + loginName + " 登录系统!");
	}else{
		System.out.println("用户名或密码错误!");
	}
	JDBCUtils.closeAll(rs, stmt, conn);
}

}

package cn.baidu.demo06_使用PreparedStatement防止SQL注入;

import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.Scanner;

import cn.baidu.demo03_自定义工具类的编写.JDBCUtils;

public class Demo { public static void main(String[] args) throws Exception { Scanner sc = new Scanner(System.in); System.out.println(“请输入登录名:”); String loginName = sc.nextLine(); System.out.println(“请输入密码:”); String loginPwd = sc.nextLine();

	String sql = "select * from users where loginName = ? and loginPwd = ?";
	
	//1.获取连接对象
	Connection conn = JDBCUtils.getConnection();
	PreparedStatement ps = conn.prepareStatement(sql);
	//填充数据
	ps.setString(1, loginName);
	ps.setString(2, loginPwd);
	
	ResultSet rs = ps.executeQuery();
	if(rs.next()){
		System.out.println("欢迎:" + loginName + " 登录系统!");
	}else{
		System.out.println("用户名或密码错误!");
	}
	JDBCUtils.closeAll(rs, ps, conn);
}

}

package cn.baidu.demo06_使用PreparedStatement防止SQL注入;

import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.Scanner;

import cn.baidu.demo03_自定义工具类的编写.JDBCUtils;

public class Demo { public static void main(String[] args) throws Exception { Scanner sc = new Scanner(System.in); System.out.println(“请输入登录名:”); String loginName = sc.nextLine(); System.out.println(“请输入密码:”); String loginPwd = sc.nextLine();

	String sql = "select * from users where loginName = ? and loginPwd = ?";
	
	//1.获取连接对象
	Connection conn = JDBCUtils.getConnection();
	PreparedStatement ps = conn.prepareStatement(sql);
	//填充数据
	ps.setString(1, loginName);
	ps.setString(2, loginPwd);
	
	ResultSet rs = ps.executeQuery();
	if(rs.next()){
		System.out.println("欢迎:" + loginName + " 登录系统!");
	}else{
		System.out.println("用户名或密码错误!");
	}
	JDBCUtils.closeAll(rs, ps, conn);
}

}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券