JDBC访问数据库的步骤

JDBC

什么是JDBC?

Java数据库连接(Java Database Connectivity,简称JDBC) 是利用Java语言/程序连接并访问数据库的一门技术。
JDBC是Java语言中用来规范客户端程序如何访问数据库的应用程序接口,提供了如查询和更新数据库中数据的方法。通过JDBC API可以用统一的形式访问不同的关系数据库产品。
JDBC API中定义了一系列的接口,程序设计人员只需要针对接口进行业务逻辑的编程即可,不必关注接口的实现。接口的实现由各数据库厂商提供,通常把厂商提供的特定于数据库的访问API称为数据库JDBC驱动程序。
在这里插入图片描述

如何通过JDBC访问MySQL数据库?

1.注册数据库驱动

所谓的注册驱动就是让JDBC程序加载mysql驱动程序,并管理驱动;驱动程序实现了JDBC API定义的接口以及和数据库服务器交互的功能,加载驱动是为了方便使用这些功能。

Class.forName("com.mysql.jdbc.Driver");
2.获取数据库连接
//param1:url:"jdbc协议:数据库子协议://主机名:端口/数据库名"
//param2:数据库用户名
//param3:数据库密码
Connection conn = DriverManager.getConnection(
    "jdbc:mysql://localhost:3306/databaseName?characterEncoding=utf-8",
    "root", "root");
3.1获取Statement传输器对象
Statement stat = conn.createStatement();

该对象上提供了发送sql的方法:

//用于向数据库发送查询类型的sql语句,返回一个ResultSet对象中
ResultSet rs = executeQuery(String sql);
//用于向数据库发送更新(增加、删除、修改)类型的sql语句,返回一个int值,表示影响的记录行数
int rows = executeUpdate(String sql);
3.2或者 获取PreparedStatement对象(建议)

PreparedStatement是Statement的子接口,比Statement更加安全,并且能够提高程序执行的效率。

String sql = "select * from user where username=? and password=?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString( 1 , user );
ps.setString( 2 , pwd );
rs = ps.executeQuery();//这里不要再传输SQL语句
4.ResultSet结果集对象

ResultSet对象用于封装sql语句执行的结果。
该对象上提供了遍历数据及获取数据的方法。

(1)遍历数据行的方法

next() – ResultSet对象维护了一个指向数据行的游标,初始的时候,游标在第一行之前,调用next()方法,可以使游标从当前位置向下移动一行,并返回一个布尔类型的结果。true表示箭头指向了一行数据,false表示后面没有数据了,此时光标位于最后一行的后面。

(2)获取数据的方法

//rs.getInt(1),获取第一列的值,从1开始
getInt(int columnIndex)
getInt(String columnLable)
getString(int columnIndex)
getString(String columnLable)
getDouble(int columnIndex)
getDouble(String columnLable)
getObject(int columnIndex)
getObject(String columnLable)

注意:列的索引从1开始。参数中的列索引值是该列在sql语句中执行查询操作得到的临时表中的列索引,而不是指该列在数据库中表的列索引。
建议:使用时,不要使用列索引,而使用列名。

4.1发送SQL到服务器执行并返回执行结果
String sql = "select * from account";
ResultSet rs = stat.executeQuery( sql );
4.2处理结果
while( rs.next() ) {
    int id = rs.getInt("id");
    String name = rs.getString("name");
    double money = rs.getDouble("money");
    System.out.println(id+" : "+name+" : "+money);
}
5.释放资源

依次关闭用到的对象,且越晚获取的越先关闭。

  rs.close(); //结果集对象
  stat.close(); //语句对象
  conn.close(); //连接对象

另:为了避免上面的程序抛出异常,释放资源的代码不会执行,应该把释放资源的代码放在finally块中。

try{
	...
}catch(Exception e){
	...
}finally{
    if (rs != null) {
        try {
        	rs.close();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            rs = null;
        }
    }
    if (stat != null) {
        try {
        	stat.close();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            stat = null;
        }
    }
    if (conn != null) {
        try {
        	conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            conn = null;
        }
    }
}

扩展:SQL注入攻击

产生的原因

由于后台执行的SQL语句是拼接而来的:

select * from user where username='"+user+"' and password='"+pwd+"'

其中的参数是用户提交过来的,如果用户在提交参数时,在参数中掺杂了一些SQL关键字(比如or)或者特殊符号(#、-- 、’ 等)就可能会导致SQL语句语义的变化,从而执行一些意外的操作。

防止SQL注入攻击
(1)使用正则表达式对用户提交的参数进行校验。

如果参数中有(# – ’ or等)这些符号就直接结束程序,通知用户输入的参数不合法。

(2)使用PreparedStatement对象来替代Statement对象。

使用PreparedStatement对象是先将SQL语句的骨架发送给服务器编译,编译之后SQL语句的骨架和语义就不会再被改变了,再将SQL语句中的参数发送给服务器,即使参数中包含SQL关键字或者特殊符号,也不会导致SQL的骨架或语义被改变,只会被当作普通的文本来处理。

使用PreparedStatement对象的好处:

  • 可以防止SQL注入攻击
  • 通过方法设置参数更加的方便且不易出错
  • 可以从某些方面提高程序执行的效率

猜你喜欢

转载自blog.csdn.net/showLo1120/article/details/105821193