天天看点

web后端数据库JDBC学习

1.什么是JDBC

  -1.JDBC(Java Database Connection)为Java开发者使用数据库提供了统一的编程接口,它由一组Java类和接口组成。是Java程序与数据库通信的标准API。

JDBC API使得开发人员可以使用纯Java的方式来连接数 据库,并执行操作。

  -2.sun公司由于不知道各个主流商用数据库的程序代码,因此无法自己写代码连接各个数据库,因此,sun公司自己提供了一套API,只要数据库想要和Java连接的,

数据库厂商必须自己实现JDBC这套接口。而数据库厂商的JDBC实现,我们就叫它此数据库的驱动。

2.JDBC访问数据库流程

  1.加载JDBC驱动程序

  2.建立与数据库的连接

  3.发送SQL语句

  4.得到SQL执行结果

3.使用mysql后台链接

mysql自带workbench可以进行图形化查看,对于不熟练的人来说命令行有点不直观,所以选择了可视化查看,当然也可以用navicat,因为本次项目较小我就没特地下载了。

4.JDBC常用接口

  Driver接口

    - Driver接口由数据库厂家提供,对于Java开发者而言,只需要使用Driver接口就可以了。

    - 在编程中要连接数据库,必须先装载特定厂商的数据库驱动程序。不同的数据库有不同的装载方法。

    - 驱动:就是各个厂商实现Sun公司提出的JDBC接口。即对Connection等接口的实现类的jar文件。

    - 装载mysql驱动:Class.forName("com.mysql.jdbc.Driver"--固定样式);

    - 装载oracle驱动:Class.forName("com.jdbc.driver.OracleDriver");

在这里要注意的一点是,用IDEA编译器的话,在program structure里增加jar库后,aritifacts那里可能没有配置完成,所以跑的时候后台还是会报错CLASSNOTFOUND EXCEPTION其实只要到aritifact里fix一下就行。当时查错查了好久,又全是驱动类的根本不知道错在哪。

  DriverManager接口

    - DriverManager接口是JDBC的管理层,作用于用户和驱动程序之间。

    - DriverManager跟踪可用的驱动程序,并在数据库和相应的驱动之间建立连接。

 Connection接口

    - Connection与特定数据库的连接(会话),在连接上下文中执行SQL语句并返回结果。

    - DriverManager的getConnection()方法建立在JDBC URL中定义的数据库Connection连接上

      -Mysql

        Connection con = DriverManager.getConnection("jdbc:mysql://host:port/database", "user", "password"); 

 Statement接口

    - 用于执行静态SQL语句并返回它所生成结果的对象。

    - 三种Statement类:

      - Statement:

        由createStatement创建,用于发送简单的SQL语句(不带参数)

      - PreparedStatement:(便利,推荐)

        - 继承自Statement接口,有preparedStatement创建,用于发送含有一个或者多个输入参数的SQL语句。PreparedStatement对象

         比Statement对象效率更高,并且是防止SQL注入。我们一般都使用PreparedStatement。

                               使用PreparedStatment的时候可以将不确定的servlet或前端要传的值设为?,后续用setInt/SetString/setXXX即可,下面给出一个例子:

//pstm语句 插入数据库
BaseDb db = null;
        PreparedStatement pstm = null;
        String update = "insert into user(iduser,user_name,Id_Num,Pwd,Tel,Email,Nickname,image)values(?,?,?,?,?,?,?,?)";
        try {
            System.out.println("数据库中");
            db = new BaseDb();
            pstm = (PreparedStatement) db.getconnection().prepareStatement(update);
            pstm.setString(1, String.valueOf(user.getUserid()));
            pstm.setString(2, user.getUserName());
            pstm.setString(3, user.getId_num());
            pstm.setString(4, user.getPwd());
            pstm.setString(5, user.getTel());
            pstm.setString(6, user.getEmail());
            pstm.setString(7, user.getNickname());
            pstm.setString(8,user.getImg());
            result = pstm.executeUpdate();


        } catch (SQLException e) {
            e.printStackTrace();
            System.out.println(e.getMessage());
        }

           

     同样的还有select语句

//select语句实例 
 public ResultSet select_comment_double(BoardBean bb){
        ResultSet rs = null;
        BaseDb db =null;
        PreparedStatement pstm = null;
        String select = "SELECT image,user.iduser,title,content,sub_time from board inner join user on user.iduser=board.iduser and title=?;";//问号的区域在下面用set方法填充值。
        try {
            db = new BaseDb();
            pstm=(PreparedStatement)db.getconnection().prepareStatement(select);
            pstm.setString(1,bb.getTitle());
            rs=pstm.executeQuery();
        }catch (SQLException e){
            System.out.println(e.getMessage());
        }
        return rs;
    }
           

 注意resultset返回的是一个结果集,个人理解为类似迭代器的东西,以行为标准。初始为0行,使用时用rs.next判断是否有下一行。要获得所有的行,可以用循环while(rs.next())加上一个计数器实现,同时也可以用rs.last到最后一行。但是要注意的是因为类似于迭代器所以无法在next迭代以后再重新获得值了。

下面是例子

public ArrayList<BoardBean> get_board(){
        ArrayList<BoardBean> board_comment = new ArrayList<BoardBean>();
        IBoardDaoImpl bd = new IBoardDaoImpl();
        ResultSet rs = bd.select_comment();
        try{
            if(rs!=null){
                while (rs.next()){
                    BoardBean bb = new BoardBean();
                    int iduser = rs.getInt("iduser");
                    String title = rs.getString("title");
                    String content = rs.getString("content");
                    Timestamp sub_time = rs.getTimestamp("sub_time");
                    String img=rs.getString("image");
                    System.out.println("img "+img);
                    bb.setIduser(iduser);
                    bb.setTitle(title);
                    bb.setContent(content);
                    bb.setSub_time(sub_time);
                    bb.setImg(img);
                    board_comment.add(bb);
                }
            }
            else
                System.out.println("留言板选择null");
        }catch (Exception e){
            e.printStackTrace();
        }
        return board_comment;
           

通过rs.get获取一行中的不同内容,配合数据库表中的键值使用,个人比较推荐按照String获取值,int太容易搞乱了。

- CallableStatement:

        - 继承自preparedStatement。由方法prePareCall创建,用于调用存储过程。

    - 常用的Statement方法

        - execute():运行语句,返回是否有结果集。

        - executeQuery():运行select语句,返回ResultSet结果节

        - executeUpdate():运行insert/update/delete操作,返回更新的行数。