JDBC中主要的类及常用方法
Class类
Class类全称java.lang.Class,Java程序运行时会自动创建程序中的每个类的Class对象,通过Class类的方法,可以得到程序中每个类的信息。Class类方法主要包括:
public static Class forName(String className):该方法根据给定的字符串参数返回相应的Class对象。例:Class.forName("com.mysql.jdbc.Driver")的作用是加载Oracle驱动。
DriverManager类
DriverManager类在用户程序和数据库系统之间维护着与数据库驱动程序之间的连接。它实现驱动程序的装载、创建与数据库系统连接的Connection类对象。DriverManager类的方法主要包括
public static Connection getConnection(String url, String user, String password)
//根据url、数据库登录的用户名、密码获取一个数据库的连接对象。
Connection接口
Connection用于管理到指定数据库的连接。
Connection con=DriverManager.getConnection (url, username, password);
Connetction类中重要的成员方法包括:
createStatement()方法:创建Statement类的实例。
prepareStatement()方法:创建PreparedStatement类的实例。
close():立即释放此Connection对象的数据库和JDBC资源,而不是等待它们被自动释放
Statement接口
Statement数据库操作类提供执行数据库操作的方法,如更新、查询数据库记录等。
Statement对象的创建方式如下:
Statement stmt=con.createStatement();
Statement类中重要的成员方法包括:
executeQuery()方法:它用来执行一个查询语句,参数是一个String对象,就是一个SELECT语句。它的返回值是ResultSet类的对象,查询结果封装在该对象中
ResultSet接口
ResultSet结果集类提供对查询结果集进行处理的方法。例:
ResultSet rs=stmt.executeQuery(" select * from users ");
ResultSet对象维持着一个指向表格的行的指针,开始时指向表格的起始位置(第一行之前)。 ResultSet类常用的方法包括:
next()方法:光标移到下一条记录,返回一个boolean值。
previous()方法:光标移到前一条记录。
getXXX()方法:获取指定类型的字段的值。调用方式 getXXX("字段名") 或 getXXX(int i)。i值从1开始表示结果集中第一列的字段。
close():关闭ResultSet对象
JDBC的时间处理
- 日期类型用java.sql.Date
- 时间类型用java.sql.Time
- 日期/时间类型用java.sql.Timestamp
getTimestamp()可以把年月日时分秒都取出来,getDate()只能取出年月日,getTime()只能取出时分秒。
要把JDBC的日期/时间类型转换为字符串:
Timestamp timeStamp = rs.getTimestamp("birth"); //通过数据库访问获取到该数据
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //格式化日期
String str = sdf.format(timeStamp);
JDBC封装工具类
无论是对数据进行查询操作,还是进行增删改操作,都需要打开连接,关闭资源等操作,因此,可以把对把打开连接和关闭连接封装到一个工具类
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class DBUtil {//该段代码完成加载数据库驱动,整个程序只需要加载一次,所以放在静态块中。static{try {Class.forName("com.mysql.jdbc.Driver");//oracle数据库驱动程序} catch (ClassNotFoundException e) {e.printStackTrace();}}//获取数据库连接方法public static Connection getConnection() throws SQLException{String url = "jdbc:mysql://127.0.0.1:3306/neuedu";Connection conn = DriverManager.getConnection(url,"root","root");return conn;}//释放资源(方法重载)public static void close(Statement st,Connection conn){try{if(st != null){try {st.close();} catch (SQLException e) { e.printStackTrace();}}}finally{if(conn != null){try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}}public static void close(ResultSet rs, Statement st, Connection conn) {try {if (rs != null) {try {rs.close();} catch (SQLException e) {e.printStackTrace();}}} finally {try {if (st != null) {try {st.close();} catch (SQLException e) {e.printStackTrace();}}} finally {if (conn != null) {try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}}}
}
SQL注入问题
使用Statement对象查询数据库时,由于定义的SQL语句是拼接的,有可能出现SQL注入问题。所谓SQL注入,就是通过把SQL命令插入到查询字符串,最终达到欺骗服务器执行恶意的SQL命令
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class SqlInject { public static void login (String name,String pwd) throws SQLException{Connection conn = null;Statement st = null;ResultSet rs = null;try{conn = DBUtil.getConnection();st = conn.createStatement();// 因为拼接SQL语句导致的SQL注入式攻击风险String sql = "SELECT * FROM t_user WHERE NAME='"+name+"' AND PWD='"+pwd+"'";rs = st.executeQuery(sql); if(rs.next()){System.out.println("登录成功..");}else{System.out.println("登录失败..");}}finally{DBUtils.close(rs, st, conn);}}public static void main(String[] args) throws SQLException {login("123123", "sadfsdf or 1=1");//注入SQL }
}