JDBC

  一、概述:JDBC(java database connection),使用java语言连接数据库,是java提供一套操作数据库的接口(标准),实现对数据库的统一访问,是一个java引用应用程序与数据库交互的桥梁。

              

    二、组成:

     DriverManager类:驱动管理类,用户注册驱动,获取连接对象

       Connection接口:数据库的连接对象

       Statement接口:执行SQL语句,操作数据

       PreparedStatement接口:执行SQL语句,操作数据

       ResultSet接口:接收SQL查询结果(一张虚拟的表)

      

    三、通过JDBC实现Query操作

      第一步:在数据库中创建数据库、新建表等一系列操作。

      第二步:在myeclipse中新建Web Project,创建与数据库中数据表相对应的实体类 

      第三步:引入数据库厂商提供的数据库对应的驱动包(.jar格式...)到项目文件夹中的WebContent/WEB INF/lib/

      第四步:写代码

       使用JDBC访问数据库的步骤:

          1.加载数据库驱动(推荐方式二)

             import java.sql.DriverManager;

             方式一:DriverManager.registerDriver(new com.mysql.jdbc.Driver());//不推荐

             方式二:Class.forName("驱动类全称:包名+类名"); //通过反射加载驱动,此处JDBC4.0后自动加载,可不用写,但建议写。

                 Class.forName("com.mysql.jdbc.Driver");

          2.获取数据库的连接对象(三种方式)

                import java.sql.Connection;

              Connection conn = DriverManager.getConnection("url","user","password");

                 url:1)统一资源定位符,标识网络上的一个具体资源(一个网页,一张照片,一个视频等)

                   2)url格式是 协议+ip地址+端口+资源名称

                            jdbc:mysql :// localhost : 3306 / 数据库名称

                          jdbc:mysql :// 127.0.0.1 : 3306 / 数据库名称

                          jdbc:mysql :/// 数据库名称 (此种写法默认本机)

                    user:数据库用户名

                   password:数据库用户密码   

              Connection conn = DriverManager.getConnection("Path");//path等于url+user+password

                 path:jdbc:mysql://localhost:3306/数据库名称?user = ...&password = ...

              Connection conn = DriverManager.getConnection("url",properties);

                 properties:属性对象

                 Properties p = new Properties();

                 p.setProperty("user","...");

                 p.setProperty("password","...");

               3.编写SQL语句

                import java.sql.Statement;

                import java.sql.ResultSet;

              1)获取SQL语句对象

                Statement st = conn.CreateStatement();

              2)执行SQL语句,返回结果

                ResultSet rs = st.executeQuery("select * from student");//执行查询SQL语句,将查询结果返回到结果集中

                String sql = "delete ....";

                int num = st.executeUpdate(sql);//执行更新(增删改)SQL语句,返回的是int型的成功执行语句条数               

          4.处理结果集

              方式一:不建议使用

               while(rs.next()){//next()获取的一张表的一行,也称一条记录

                 Object  id = rs.getObject(1);//获取的是一张表的第一列,也称一个字段

                 Object  name = rs.getObject(2);//第二列

                 Object  age = rs.getObject(3);//第三列

               }

             方式二:方法中的参数名称需要和数据表中的字段名称一致,并且建议创建数据库中数据表的字段时不要使用中文!!!

               while(rs.next()){//next()获取的一张表的一行,也称一条记录

                     int id = rs.getInt("学号");//获取的是一张表的第一列,也称一个字段

                     String name = rs.getString("姓名");//第二列

                  int  age = rs.getInt("年龄");//第三列

                 //如果数据库中的Date类型,建议使用String接收

               }

          5.释放连接资源。

             import java.sql.SQLException;

               finally{  //finally意思是在结尾无论前面发生了啥,程序总会执行这段代码

               if(conn != null){

                   try{ conn.close();

                 }catch(SQLException e){

                   e.printStackTrace();

                 }} 

                if(st != null){ 

                 try{ st.close();

                 }catch(SQLException e){

                   e.printStackTrace();

                 } }

               if(rs != null){ 

                 try{ rs.close();

                 }catch(SQLException e){

                   e.printStackTrace();

                 } }//所有对象通通关闭

              }

   四、注意:

     1.JDBC使用Statement会存在数据库注入问题,因此需用PrepareStatement对象来解决

        String username = "1' or 1 = '1'";//设用户名

            String password = "1' or 1 = '1'";//设密码

        PreparedStatement pre = conn.prepareStatement("select * from student where username = ? and password = ?");//将SQL语句进行预处理,采用问号占位符的形式

         pre.setString(1,username);//给第一个问号的位置赋值

         pre.setString(2,password);//给第二个问号的位置赋值

          ResultSet rs = pre.executeQuery();//执行赋值后的SQL语句

       五、封装并调用JDBC工具类

      封装工具类的代码:

  1. public class JDBCfunction{
  2. //静态块 优先执行,并且只执行一次
  3. static{
  4. try{
  5. //加载驱动
  6. Class.forName("com.mysql.jdbc.Driver");
  7. }catch(ClassNotFoundExcption e){
  8. e.printStackTrack();
  9. }
  10. }
  11. //连接对象
  12. public static Connection getConnection(){
  13. Connection conn = null;
  14. try{
  15. conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/databasename","username","password");
  16. }catch(SQLExcption e){
  17. e.printStackTrack();
  18. }
  19. return conn;
  20. }
  21. //释放连接资源
  22. public static void close(Connection conn,Statement st,ResultSet rs){
  23. if(conn != null){
  24. try{
  25. conn.close();
  26. }catch(SQLExcption e){
  27. e.printStackTrack();
  28. }
  29. }
  30. if(st != null){
  31. try{
  32. st.close();
  33. }catch(SQLExcption e){
  34. e.printStackTrack();
  35. }
  36. }
  37. if(rs != null){
  38. try{
  39. rs.close();
  40. }catch(SQLExcption e){
  41. e.printStackTrack();
  42. }
  43. }
  44. }
  45. }

                调用工具类的代码:(使用时需导入Import JDBCfunction所在的文件包)

  1. public class UseJDBCfunction(){
  2. public static void main(String[] args) throws SQLException{
  3. //加载驱动,建立连接
  4. Connection conn = JDBCfunction.getConnection();
  5. //创建预处理对象
  6. PreparedStatement pre = conn.prepareStatement("select * from student");
  7. //查询
  8. ResultSet rs = pre.executeQuery();
  9. //遍历输出
  10. while(rs.next()){
  11. int uid = rs.getInt("uid");
  12. String username = rs.getString("username");
  13. String password = rs.getString("password");
  14. User user = new User(uid,username,password);
  15. System.out.println(user);
  16. }
  17. //释放资源
  18. JDBCfunction.close(conn,pre,rs);
  19. }
  20. }

        六、JDBC批量操作

     1.jdbc设置事务自动提交,处理异常

        在连接对象conn与数据库通过用户名和密码建立连接了之后,如果后续操作有catch异常,则不让其conn对象最终对数据库进行修改。

conn.setAutoCommit(false);//设置事务是否自动提交,默认为ture,自动提交。

conn.commit();//立即提交事务,对数据库进行修改。

conn.rollback();//如果异常,事务回滚   

  1. public class UseJDBCfunction(){
  2. public static void main(String[] args) throws SQLException{
  3. Connection conn = null;
  4. PrepareStatement pre = null;
  5. try{
  6. //加载驱动,建立连接
  7. conn = JDBCfunction.getConnection();
  8. conn.setAutoCommit(false);//禁止自动提交事务
  9. //创建预处理对象
  10. pre = conn.prepareStatement("insert into user(username,password) value(?,?)");
  11. pre.setString(1,"xiaoming");
  12. pre.setString(2,"123");
  13. //更新
  14. int update = pre.executeUpdate();
  15. if(update > 0){
  16. System.out.println("添加成功");
  17. conn.commit();//提交事务
  18. }
  19. }catch(SQLException e){
  20. e.printTrackTrace();
  21. try{
  22. conn.rollback();//出现异常,事务回滚
  23. }catch(SQLException e){
  24. e.printTrackTrace(); }
  25. }
  26. //释放资源
  27. JDBCfunction.close(conn,pre,rs);
  28. }
  29. }

        2.jdbc批量添加

        在给预处理对象赋值时,采用pre.addBatch();的方式,对数据库语句中的问号进行批量添加操作  

  1. public class UseJDBCfunction(){
  2. public static void main(String[] args) throws SQLException{
  3. Connection conn = null;
  4. PrepareStatement pre = null;
  5. try{
  6. //加载驱动,建立连接
  7. conn = JDBCfunction.getConnection();
  8. conn.setAutoCommit(false);//禁止自动提交事务
  9. //创建预处理对象
  10. pre = conn.prepareStatement("insert into user(username,password) value(?,?)");
  11. pre.addBatch();
  12. pre.setString(1,"m1");
  13. pre.setString(2,"123");
  14.  
  15. pre.addBatch();
  16. pre.setString(1,"m2");
  17. pre.setString(2,"1234");
  18.  
  19. pre.addBatch();
  20. pre.setString(1,"m3");
  21. pre.setString(2,"12345");
  22. //......
  23.  
  24. //更新(这是没用批量操作的写法)
  25. //int update = pre.executeUpdate();
  26. //更新(用批量操作的写法,返回的是一个数组,因为数据库添加了多条数据)
  27. int[] executeBatch = pre.executebatch();
  28. if(executeBatch.length > 0){
  29. System.out.println("添加成功");
  30. conn.commit();//提交事务
  31. }
  32. }catch(SQLException e){
  33. e.printTrackTrace();
  34. try{
  35. conn.rollback();//出现异常,事务回滚
  36. }catch(SQLException e){
  37. e.printTrackTrace();26 }
  38. }
  39. //释放资源
  40. JDBCfunction.close(conn,pre,rs);
  41. }
  42. }

11--Java--JDBC知识梳理的更多相关文章

  1. java基础知识梳理

    java基础知识梳理 1 基本数据类型

  2. 《面试补习》- Java集合知识梳理

    一.ArrayList ArrayList 底层数据结构为 动态数组 ,所以我们可以将之称为数组队列. ArrayList 的依赖关系: public class ArrayList<E> ...

  3. 新手上路---Java学习知识梳理

    我随笔 我相信也有那么一些人跟我一样,脱下军装后对未来感到迷茫,不知所措甚至怀疑起自己的能力,自身体会的经历过才能明白其中的辛酸!归咎一切:心态,信心,自信!再穷不过乞讨,不死终将出头.好了,闲言碎语 ...

  4. Java Web知识梳理

    今天给内部做了个培训,貌似搞错了对象,不该对新人讲这么原理性的东西. anyway,还是放上来吧,不知道有没有人能理清其中的逻辑 ^ _ ^ 问题:为什么要用tomcattomcat: servlet ...

  5. Java基础知识梳理《一》

    一.Java数据类型(简单称之为“四类八种”) java 基本的数据类型长度都是固定的,好处是在实现跨平台时就统一了. 1.整型 byte short int long (分别是1,2,4,8个字节) ...

  6. Java简单知识梳理

    1. Java是单根继承结构:每个类都继承于Object类 ,这也就保证了每个对象都具备某些功能 2. Java类权限关键字: public -> protected -> default ...

  7. JAVA JDBC(存储过程和事务管理)

    1.什么是存储过程 存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程 ...

  8. Java JDBC的基础知识(三)

    在前面的Java JDBC的基础知识(二)和(三)中,主要介绍JDBC的原理和简单的应用过程.尤其在(二)中,可以发现代码进行多次try/catch,还有在前面创建连接等过程中好多参数我都给写定了. ...

  9. Java JDBC的基础知识(二)

    在我的上一篇Java JDBC的基础知识(一)中,最后演示的代码在关闭资源的时候,仅仅用了try/catch语句,这里是有很大的隐患的.在程序创建连接之后,如果不进行关闭,会消耗更多的资源.创建连接之 ...

  10. MySQL 基础知识梳理

    MySQL 的安装方式有多种,但是对于不同场景,会有最适合该场景的 MySQL 安装方式,下面就介绍一下 MySQL 常见的安装方法,包括 rpm 安装,yum 安装,通用二进制安装以及源码编译安装, ...

随机推荐

  1. linux死机解决办法

    linux死机后不要长按电源建强制关机,容易对损坏系统配置或者电脑硬件,导致重启后产生不必要的麻烦 如果是在图形界面下死机的话,不要再依赖任何图形界面的工具,解决方法如下: 1.一种方式是进入终端界面 ...

  2. 小程序的<label>标签

    用来改进表单组件的可用性. 使用for属性找到对应的id,或者将控件放在该标签下,当点击时,就会触发对应的控件. for优先级高于内部控件,内部有多个控件的时候默认触发第一个控件. 目前可以绑定的控件 ...

  3. Adaboost和随机森林

    在集成学习中,主要分为bagging算法和boosting算法.随机森林属于集成学习(Ensemble Learning)中的bagging算法. Bagging和Boosting的概念与区别该部分主 ...

  4. win10内存泄漏怎么办

    我的电脑莫名的内存占用越来越高,但是实际内存很低 查了很多资料 下边是我找到的最有效的方法: 原因:是系统自带的网络数据监控和和Killer网卡的监控程序冲突,导致 非页面缓存无法释放. 解决方法:解 ...

  5. Jquery电子签名制作_jSignature

    今天用Jquery的jSignature库制作一个电子签名 后台.net core上传到指定文件夹 下载jquery库 提取码:rd9g html @{ Layout = null; } <!D ...

  6. Python知识体系框架 思维导图

    技术文档已经独立整理! 请移步个人技术文档:https://anxiangchegu.github.io/technical-doc 如需更多Java.Python.大数据体系知识,请稳移步个人技术文 ...

  7. Python Selenium定位元素常用解决办法

       在做web应用的自动化测试时,定位元素是必不可少的,这个过程经常会碰到定位不到元素的情况(报selenium.common.exceptions.NoSuchElementException), ...

  8. php--->使用callable强制指定回调类型

    php 使用callable强制指定回调类型 如果一个方法需要接受一个回调方法作为参数,我们可以这样写 <?php function dosth($callback){ call_user_fu ...

  9. C++从array数组向vector向量复制元素的两种方式

    #include <iostream> #include <vector> using namespace std; int main() { const int arr_si ...

  10. postman发送请求的简单操作

    发送请求常用的是post和get 两者的区别是: 1.post比get安全,因为参数直接暴露在url中,不能用来传递敏感信息 2.get参数通过url传递,post放在request body中 3. ...