什么是JDBC
JDBC(Java DataBase Connectivity)就是Java数据库连接,说白了就是用Java语言来操作数据库。原来我们操作数据库是在控制台使用SQL语句来操作数据库,JDBC是用Java语言向数据库发送SQL语句。
JDBC核心类(接口)介绍
JDBC中的核心类有:DriverManager、Connection、Statement,和ResultSet!
DriverManger(驱动管理器)的作用有两个:
1、注册驱动:这可以让JDBC知道要使用的是哪个驱动;
2、获取Connection:如果可以获取到Connection,那么说明已经与数据库连接上了。
Connection对象表示连接,与数据库的通讯都是通过这个对象展开的:
3、Connection最为重要的一个方法就是用来获取Statement对象;
Statement是用来向数据库发送SQL语句的,这样数据库就会执行发送过来的SQL语句:
4、 void executeUpdate(String sql):执行更新操作(insert、update、delete等);
4.1、ResultSet executeQuery(String sql):执行查询操作,数据库在执行查询后会把查询结果,查询结果就是ResultSet;
ResultSet对象表示查询结果集,只有在执行查询操作后才会有结果集的产生。结果集是一个二维的表格,有行有列。操作结果集要学习移动ResultSet内部的“行光标”,以及获取当前行上的每一列上的数据:
boolean next():使“行光标”移动到下一行,并返回移动后的行是否存在;
XXX getXXX(int col):获取当前行指定列上的值,参数就是列数,列数从1开始,而不是0。
5、关闭(ResultSet,Statement,Connection)倒序关闭
增删改(Update)代码:
//导包,每种数据库的包都不一样,放在项目下,然后Build Path public static void main(String[] args) { //连接数据库, 得到Connection对象 Connection conn = null; Statement stmt = null; try { //1.加载驱动类 Driver 对象, 反射: Class.forName(包名.类名); Class.forName("oracle.jdbc.driver.OracleDriver"); //2.通过DriverManager(驱动管理器)的getConnection() 得到Connection对象 conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl","scott","tiger"); //3.通过Connection对象, 创建Statment对象 stmt = conn.createStatement(); //4.通过statement对象,发送sql语句,通过数据库执行之 //删除一条语句 String sql1 = "DELETE FROM empcopy WHERE empno = '7369'"; //修改一条语句 String sql2 = "UPDATE empcopy SET sal = 6666 WHERE empno = '7788'"; //添加一条语句 String sql3 = "INSERT INTO empcopy VALUES('4567','huhu','MANAGER','7839',
to_date('1998-12-21','yyyy-mm-dd'),'800',null,'30')"; int rs = stmt.executeUpdate(sql3); if(rs != 0){ System.out.println("执行了"+rs+"条sql语句"); }else{ System.out.println("未执行sql语句"); }; } catch (ClassNotFoundException e) { //如果抛这个类找不到异常, 原因: 1) 数据库驱动jar没导入 2) 包名.类名写错 e.printStackTrace(); } catch (SQLException e) { //如果抛出SQLException异常: 原因: 1) 三大参数写错 2) 数据库服务没有启动 e.printStackTrace(); }finally{ //5.关闭资源 推荐倒序关闭 try { if(stmt != null){stmt.close();} if(conn != null){conn.close();} } catch (SQLException e) { e.printStackTrace(); } } }
查询(Query):
//通过connection对象创建statement对象 stmt = conn.createStatement(); String sql = "select * from emp"; //通过statement对象执行executeQuery查 rs = stmt.executeQuery(sql); //循环使“行光标”移动到下一行,并返回移动后的行是否存在; while(rs.next()){ //打印每一行的相应数据类型的数据 //也可以通过rs.getString()或者rs.getObject(),推荐使用数据库中对应的数据类型 System.out.println(rs.getInt("empno") +","+rs.getString("ename") +","+rs.getString("job") +","+rs.getInt("mgr") +","+rs.getDate("hiredate") +","+rs.getInt("sal") +","+rs.getInt("comm") +","+rs.getInt("deptno") ); }
Statement存在sql注入(sql攻击)安全问题,不推荐使用
这行当前会使我们登录成功!因为是输入的用户名和密码是SQL语句片段,最终与我们的login()方法中的SQL语句组合在一起!我们来看看组合在一起的SQL语句: SELECT * FROM tab_user WHERE username='a' or '1'='1' and password='a' or '1'='1'
推荐使用:PreparedStatement 预编译声明
Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; try { //1.通过反射的获取Driver Class.forName("oracle.jdbc.driver.OracleDriver"); //2.通过获取DriverManager.getConnection得到connection对象 conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl","scott","tiger"); //3.使用connection返回prepareStatement对象 String sql = "SELECT COUNT(1) FROM EMP WHERE SAL > ?"; pstmt = conn.prepareStatement(sql); //给?赋值,从1开始 pstmt.setInt(1, 1000); rs = pstmt.executeQuery(); while(rs.next()){ System.out.println(rs.getInt(1)); }