JDBC编程步骤

JDBC编程步骤:
(1)加载数据库驱动,通过使用Class类的forName()静态方法来加载驱动。
Class.forName(driverClass)
加载MySQL的驱动:Class.forName(“com.mysql.jdbc.Driver”)
加载Oracle的驱动:Class.forName(“cracle.jdbc.driver.OracleDriver”)
(2)通过DriverManager获取数据库连接
DriverManager.getConnection(String url,String user,String pass);
三个参数:数据库url, 登陆数据库的用户名和密码,
数据库url通常写法:
jdbc : subprotocol : other stuff
subprotocol :连接到特定数据库的驱动

连接到MySQL数据库的URL写法:
jdbc : mysql : //hostname : port/databasename
连接到Oracle数据库的URL写法:
jdbc : oracle : thin : @hostname : port : databasename
(3) 通过Connection 对象创建Statement对象。
createStatement():创建基本的Statement对象
prepareStatement(String sql) : 根据传入的SQL语句创建预编译的Statement对象
prepareCall(String sql) : 根据传入的SQL语句创建CallableStatement对象。
(4)通过Statement执行SQL语句。
execute():可以执行任何SQL语句,但比较麻烦
executeUpdate(): 主要用于执行DML和DDL语句。执行DML语句返回受SQL影响的行数,执行DDL语句返回0.
executeQuery():只能执行查询语句,执行后返回代表查询结果的ResultSet对象。
DDL(Data Definition Languages)语句:数据定义语言,这些语句定义了不同的数据段、数据库、表、列、索引等数据库对象的定义。常用的语句关键字主要包括 create、drop、alter等。
DML(Data Manipulation Language)语句:数据操纵语句,用于添加、删除、更新和查询数据库记录,并检查数据完整性,常用的语句关键字主要包括 insert、delete、udpate 和select 等。(增添改查)
(5)操作结果集
如果执行的SQL语句是查询语句,执行后返回代表查询结果的ResultSet对象。程序可以通过操作该ResultSet对象来取出查询结果。ResultSet对象提供了如下两类方法:

  • next(), previous(), first(), last(), beforeFirst(), afterLast(),
    absolute()等移动记录指针的方法
  • getXXX()方法获取记录指针指向行、特定列的值,该方法既可以使用列索引作为参数,也可使用列名作参数。使用前者性能更好,使用后者可读性更好。

(6)回收数据库资源
包括关闭ResultSet、Statement和Connection等资源。

eclipse连接数据库过程:
https://jingyan.baidu.com/article/3aed632e1a4ceb70108091f6.html

JDBC全过程:
使用try语句来关闭各种数据库资源。

public static void main(String[] args) throws SQLException, Exception {
		//1.加载驱动,使用反射知识
		Class.forName("com.mysql.jdbc.Driver");
		try(
		//2.使用DriverManager获取数据库连接
		   Connection conn = DriverManager.getConnection(
				   "jdbc:mysql://127.0.0.1:3306/select_test?useSSL=true",
				   "root", "32147");
		//3.使用Connection创建一个Statement对象
			Statement stmt = conn.createStatement();
		//4.执行SQL语句
		//(1)执行execute():可执行任何SQL语句,返回一个boolean值
		//(2)executeUpdate():用于执行DML语句:返回一个整数,代表被SQL语句影响的记录条数
		//(3)executeQuery():执行select语句,返回查询到的结果集
			ResultSet rs = stmt.executeQuery("select s.*, teacher_name"+
		"from student_table s, teacher_table t"+
					"where t.teacher_id = s.java_teacher")
					
				)
		{
			//ResultSet有一系列的getXXX(索引|列名)方法,用于获取记录指针
			//指向行、特定列的值,不断地使用next()将记录指针下移一位。
			while(rs.next()) {
				System.out.println(rs.getInt(1)+"\t"
						+rs.getString(2)+"\t"
						+rs.getString(3)+"\t"
						+rs.getString(4));
			}
		}
	}
}

二、使用executeUpdate()方法执行DDL和DML
执行了DDL语句返回值为0
执行了DML语句返回值为受影响地记录条数
可以不将数据库连接信息写在程序里,而是使用一个mysql.ini文件(就是一个properties文件)来保存数据库连接信息。当需要把应用程序从开发环境移植到生产环境时,无须修改源代码,只需要修改mysql.ini配置文件即可
DDL操作:
JDBC编程步骤_第1张图片
运行上述程序,执行成功后会在select_test数据库中添加一个jdbc_test数据表,表明执行DDL成功。
DML操作:
JDBC编程步骤_第2张图片

运行上述程序,执行成功会看到jdbc_test数据表中多了几条记录。

三、使用execute方法执行SQL语句
如果不清楚SQL语句地类型,只能使用execute()方法来执行SQL语句
返回值是一个boolean类型地值,表明执行了该SQL语句是否返回了ResultSet对象。获取ResultSet对象地方法:
getResultSet():返回该Statement执行查询语句所返回地ResultSet 对象
getUpdateCount():获取该Statement()执行DML语句所影响地记录行数


四、使用PreparedStatement执行SQL语句
如果需要反复执行一条结构相似地操作,可以使用占位符(?)参数地SQL语句
insert into student_table values(null,?,?);
要想实现这个功能,可以使用PreparedStatement接口,它是Statement接口的子接口,它可以预编译SQL语句,预编译后地SQL语句被存储在PreparedStatement对象中,然后可以使用该对象多次高效地执行该语句。使用PreparedStatement比使用Statement效率高。
预编译:在创建PreparedStatement对象时就指定了sql语句,该语句立即发送给DBMS进行编译,当该语句被执行时,DBMS直接运行编译后的sql语句,而不需要像其他sql语句那样首先将被编译


SQL注入:所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
假设有一个登录表单,后台数据校验sql为select * from user where username = ‘XXX’ and password = ‘XXX’,XXX为传入的用户名和密码,根据sql返回的结果判断登录是否成功;(方便解释,简单处理)
这条sql是预先拼接好然后提交给数据库执行的,假设我们把password的内容改为1’ or ‘1’ = ‘1,注意里面的单引号!如果登录名为caojiantao,那么最终生成的sql便是:
在这里插入图片描述
!!这样一来不用知道用户caojiantao的密码也能够登录成功了,更有甚者,在密码处输入"1’;drop table user;",直接删除了数据表,十分的危险。

这就是一个最简单sql注入的例子,输入包含sql命令的内容,欺骗服务器执行破坏数据。
PreparedStatement实现类的setString();方法内部做了单引号的转义,而Statement不能防止sql注入,就是因为它没有把单引号做转义,而是简单粗暴的直接拼接字符串,所以达不到防止sql注入的目的。
System.out.println(preparedStatement.toString());

你们可以直接看看打印出来是不是
SELECT * FROM users WHERE userName = ‘令狐冲’ AND password = ‘anything’ OR’x’=‘x’
综上,PreparedStatement 比使用Statement的优点:
(1)前者预编译SQL语句,性能更好
(2)前者无须“拼接”SQL语句,编程更简单
(3)前者可以防止SQL注入,安全性更好

五、使用CallableStatement调用存储过程
通过Connection的prepareCall()方法来创建CallableStatement对象,创建该对象时需要传入调用存储过程的SQL语句。

你可能感兴趣的:(JAVA)