JDBC基础
2022/6/30 6:19:40
本文主要是介绍JDBC基础,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
1、使用JDBC连接数据库的步骤
- 注册驱动
- 获取连接
- 获取传输器
- 执行sql,返回结果
- 数据处理
- 关闭连接
2、示例
1.1、使用Statement进行查询操作
public class JDBC_01 { public static void main(String[] args) { String jdbc = "com.mysql.cj.jdbc.Driver"; String url = "jdbc:mysql://localhost:3306/student?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false"; String user = "root"; String password = "00000000"; try { //1、注册驱动 Class.forName("com.mysql.cj.jdbc.Driver"); //2、获取连接 Connection conn = DriverManager.getConnection(url, user, password); //3、获取传输器 Statement st = conn.createStatement(); //4、执行sql(查询所有数据),返回结果 ResultSet rs = st.executeQuery("select * from user"); //5、数据处理 while (rs.next()) { int id = rs.getInt("id"); String number = rs.getString("number"); String name = rs.getString("name"); int age = rs.getInt("age"); int chi = rs.getInt("chi"); int math = rs.getInt("math"); int eng = rs.getInt("eng"); System.out.println(id+""+number+""+name+""+age+""+chi+math+""+eng); } //6、关闭连接 try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } try { st.close(); } catch (SQLException e) { e.printStackTrace(); } try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } catch (ClassNotFoundException | SQLException e) { e.printStackTrace(); } } }
1.2、使用Statement进行更新操作
public class JDBC_01 { public static void main(String[] args) { String jdbc = "com.mysql.cj.jdbc.Driver"; String url = "jdbc:mysql://localhost:3306/student?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false"; String user = "root"; String password = "00000000"; try { //1、注册驱动 Class.forName("com.mysql.cj.jdbc.Driver"); //2、获取连接 Connection conn = DriverManager.getConnection(url, user, password); //3、获取传输器 Statement st = conn.createStatement(); //4、执行sql,返回结果 ResultSet rs = st.executeQuery("select * from user"); //5、数据处理 while (rs.next()) { int id = rs.getInt("id"); String number = rs.getString("number"); String name = rs.getString("name"); int age = rs.getInt("age"); int chi = rs.getInt("chi"); int math = rs.getInt("math"); int eng = rs.getInt("eng"); System.out.println(id+""+number+""+name+""+age+""+chi+math+""+eng); } //6、关闭连接 try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } try { st.close(); } catch (SQLException e) { e.printStackTrace(); } try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } catch (ClassNotFoundException | SQLException e) { e.printStackTrace(); } } }
1.3、使用PreparedStatement进行查询操作
public class JDBC_03 { public static void main(String[] args) { String jdbc = "com.mysql.cj.jdbc.Driver"; String url = "jdbc:mysql://localhost:3306/student?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false"; String user = "root"; String password = "00000000"; try { //1、注册驱动 Class.forName("com.mysql.cj.jdbc.Driver"); //2、获取连接 Connection conn = DriverManager.getConnection(url, user, password); //3、获取传输器 PreparedStatement ps = conn.prepareStatement("select * from user"); //4、执行sql,返回结果 ResultSet rs = ps.executeQuery(); //5、数据处理 while (rs.next()) { int id = rs.getInt("id"); String number = rs.getString("number"); String name = rs.getString("name"); int age = rs.getInt("age"); int chi = rs.getInt("chi"); int math = rs.getInt("math"); int eng = rs.getInt("eng"); System.out.println(id+""+number+""+name+""+age+""+chi+math+""+eng); } //6、关闭连接 try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } try { ps.close(); } catch (SQLException e) { e.printStackTrace(); } try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } catch (ClassNotFoundException | SQLException e) { e.printStackTrace(); } } }
1.4、使用PreparedStatement进行更新操作
public class JDBC_04 { public static void main(String[] args) { String jdbc = "com.mysql.cj.jdbc.Driver"; String url = "jdbc:mysql://localhost:3306/student?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false"; String user = "root"; String password = "00000000"; try { //1、注册驱动 Class.forName("com.mysql.cj.jdbc.Driver"); //2、获取连接 Connection conn = DriverManager.getConnection(url, user, password); //3、获取传输器 PreparedStatement ps = conn.prepareStatement("insert into user values(?, ?, ?, ?, ?, ?, ?)"); //4、执行sql,返回结果 ps.setInt(1, 22); ps.setString(2, "220"); ps.setString(3, "叶良辰"); ps.setInt(4, 100); ps.setInt(5, 100); ps.setInt(6, 100); ps.setInt(7, 100); int i = ps.executeUpdate(); //5、数据处理 System.out.println(i); //6、关闭连接 try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } try { ps.close(); } catch (SQLException e) { e.printStackTrace(); } } catch (ClassNotFoundException | SQLException e) { e.printStackTrace(); } } }
3、步骤详解
3.1、加载驱动
3.1.1、Driver接口
- java.sql.Driver 接口是所有 JDBC 驱动程序需要实现的接口,这个接口是提 供给数据库厂商使用的,不同数据库厂商提供不同的实现
- 在程序中不需要直接去访问实现了 Driver 接口的类,而是由驱动程序管理器类(java.sql.DriverManager)去调用这些Driver实现
3.1.2、mysql的驱动
-
mysql8之前
com.mysql.jdbc.Driver
-
mysql8之后
com.mysql.cj.jdbc.Driver
3.1.3、加载与注册JDBC驱动
-
调用Class类的静态方法forName()
Class.forName(“com.mysql.cj.jdbc.Driver”);
-
驱动程序管理器类的 registerDriver() 方法
DriverManager.registerDriver(com.mysql.jdbc.Driver);
3.2、建立连接
-
可以调用 DriverManager 类的 getConnection() 方法建立到数据库的连接
DriverManager.getConnection(url, user, password);
-
getConnection() 方法需要三个参数url、user、password
-
user、password是当前连接的数据库管理程序的用户名和密码
-
JDBC URL 用于标识一个被注册的驱动程序,驱动程序管理器通过这个 URL 选择正确的 驱动程序,从而建立到数据库的连接
-
JDBC URL的标准由三部分组成,各部分间用冒号分隔
-
jdbc:子协议:子名称
-
协议:JDBC URL中的协议总是jdbc
-
一种标识数据库的方法。子名称可以依不同的子协议而变化,用子名称的目的是为 了定位数据库提供足够的信息。包含主机名(对应服务端的ip地址),端口号,数据库名
-
3.3、获取传输器
3.3.1、主要接口
- Statement
- PreparedStatement
- CallableStatement
3.3.2、使用Statement
3.3.2.1、获取Statement
connection.createStatement();
3.3.2.1、使用Statement的弊端
sql注入攻击:
SQL 注入是利用某些系统没有对用户输入的数据进行充分的检查,而在 用户输入数据中注入非法的 SQL 语句段或命令(如:SELECT user, password FROM user_table WHERE user='a' OR 1 = ' AND password =' OR '1' = '1') ,从而利用系统的 SQL 引擎完成恶意行为的做法
因为Statement传输的sql语句是用+进行拼接处理的,所以有此漏洞
解决方法:
使用PreparedStatement,参数用?代替可以防止sql注入
3.3.3、使用PreparedStatement
3.3.3.1、获取PreparedStatement
connection.prepareStatement("//sql语句");
3.3.3.2、PreparedStatement的特点
-
PreparedStatement 接口是 Statement 的子接口,它表示一条预编译过的 SQL 语句
语句在被DBServer的编译器编译后的执行代码被缓存下来,那么下次调用时只要是相同的编译语句就不需要编译,只要将参数直接传入编译过的语句执行代码中就会得到执行
-
PreparedStatement 对象所代表的 SQL 语句中的参数用问号(?)来表示,PreparedStatement 对象的 setXxx() 方法来设置这些参数. setXxx() 方法有两个参数,第一个参数是要设置的 SQL 语句中的参数的索引(从 1 开始),第二个是设置的 SQL 语句中的参数的值
-
防止SQL注入
3.4、释放资源
-
释放ResultSet、Statement、Connection、PreparedStatement
-
数据库连接(Connection)是非常稀有的资源,用完后必须马上释放, 如果Connection不能及时正确的关闭将导致系统宕机。Connection的使用原则是
尽量晚创建,尽量早的释放
-
最晚获取的最先关闭
关闭顺序:ResultSet——>Statement(PreparedStatement)——>Connection
3.5、ResultSet
ResultSet rs = preparedstatement.executeQuery();
ResultSet rs = statement.executeQuery("//sql语句");
-
只有返回结果的sql语句才会使用execute创建ResultSet对象
-
ResultSet 对象以逻辑表格的形式封装了执行数据库操作的结果集,ResultSet 接口由数据库厂商实现
-
ResultSet 对象维护了一个指向当前数据行的游标,初始的时候,游标在第一行之前,可以通过 ResultSet 对象的 next() 方法移动到下一行
-
关于ResultSet
- 代表结果集,封装了使用 JDBC 进行查询的结果
- ResultSet 返回的实际上就是一张数据表. 有一个指针指向数据表的第一条记录的前面
-
可以调用 next() 方法检测下一行是否有效. 若有效该方法返回 true, 且指针下移. 相当于 Iterator 对象的 hasNext() 和 next() 方法的结合体
-
当指针指向一行时, 可以通过调用 getXxx(int index) 或 getXxx(int columnName) 获取每一 列的值
这篇关于JDBC基础的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-04-16软路由代理问题, tg 无法代理问题-icode9专业技术文章分享
- 2024-04-16程序猿用什么锅-icode9专业技术文章分享
- 2024-04-16自建 NAS 的方案-icode9专业技术文章分享
- 2024-04-14ansible 在远程主机上执行脚本,并传入参数-icode9专业技术文章分享
- 2024-04-14ansible 在远程主机上执行脚本,并传入参数, 加上remote_src: yes 配置-icode9专业技术文章分享
- 2024-04-14ansible 检测远程主机的8080端口,如果关闭,则echo 进程已关闭-icode9专业技术文章分享
- 2024-04-14result 成功怎么写-icode9专业技术文章分享
- 2024-04-14stopped 状态设置为变量,由外部传递进来-icode9专业技术文章分享
- 2024-04-14为什么ansible执行远程脚本需要放到后台-icode9专业技术文章分享
- 2024-04-14shell 正则判断字符串内是否含有th-icode9专业技术文章分享