java与sql数据库的使用记录(入门级)

时间:2021-10-13 19:59:21

java和sql数据库的使用(入门级)

刚学完java语法,第一个练手项目是一个java和sql的数据库管理程序,项目做了一大半,现在来总结一下在java程序中使用sql数据库以及简单的防sql注入(我用mysql,因为免费!)

以下按照使用sql所需要的顺序依次说明,后面的说明可能会用到前面程序中创建的对象

关于Connection,PreparedStatement和ResultSet

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

  • 这是官方文档的说法,用普通话来说,就是用它保存与数据库连接的“钥匙”。

  • 与数据库连接需要知道数据库的user、password和url,程序员设定好以上之后,通过DriverManager.getConnection(url,user,passwd)这个方法,,返回一个Connection对象

    (PS:类DriverManager,管理一组 JDBC 驱动程序的基本服务。简单地说是创建Connection这个“钥匙”对象的方法)
  • 以下为创建数据库连接(应该叫驱动程序?)的代码段

    public static Connection getconn()
    {
    Connection conn = null;
    String user = "";
    String passwd = "";
    String url = "";
    //加载驱动
    try
    {
    Class.forName("com.mysql.jdbc.Driver");//这里需要拿出来讲一讲
    conn = DriverManager.getConnection(url,user,passwd);
    }
    catch (SQLException e)
    {
    e.printStackTrace();
    }
    catch (ClassNotFoundException e)
    {
    e.printStackTrace();
    }

    return conn;
    }

PreparedStatement:表示预编译的 SQL 语句的对象。

  • 这个对象一般用来储存sql语句,也就是要在接下去的程序里执行的sql语句

    SELECT * FROM TABLES WHERE ID=?;

    类似以上的SQL语句(一般都是大写,为了更好地兼容性)

  • 通过前面创建的conn对象中的prepareStatement(String sql)方法,可以返回一个PreparedStatement的对象。

  • 中间之所以用问号,是为了做一个简单的防sql注入,通过PreparedStatement.setX(int parameterIndex, X x)方法,(有setDouble、setString等等)选择类型相对应的方法,将相应的数据放到“?”所在的位置。

  • 以下是随便找了一段代码,用来对应PreparedStatement

    conn = DbConn.getconn();
    String sqlName = "UPDATE SALESMAN SET SNAME=? WHERE SID=?";
    pstmt = conn.prepareStatement(sqlName);
    pstmt.setString(1, sName.getSName());
    pstmt.setInt(2, sName.getSId());

    此时sql语句中的两个“?”都已放入对应的量,预编译的处理结束

ResultSet:表示数据库结果集的数据表,通常通过执行查询数据库的语句生成。

  • 这个用来保存数据库操作之后的结果,由方法PreparedStatement.executeUpdate()或者PreparedStatement.executeQuery()生成。前一个用来实现插入更新删除等操作,后一个专门用来查询数据用。

  • 如果是 查询 操作则保存返回的一行行结果,如果是 插入更新删除 则保存

    1. (1) SQL 数据操作语言 (DML) 语句的行数
    2. (2) 对于无返回内容的 SQL 语句,返回 0

    暂时觉得并没有什么卵用,用到插入更新删除操作的时候只要 返回值 > 0 就表示操作OK。

  • 下面分别实现两类操作的代码

    //插入更新删除等操作
    int rs = pstmt.executeUpdate();

    //查询操作
    ResultSet rs = pstmt.executeQuery();

    在方法executeQuery()中,我们返回的是一个ResultSet对象,而在方法executeUpdate(),我们返回的是int类型的数据(行数?)。


到此为止,你已经可以通过java调用相应的SQL语句来获得数据了

然而数据库用完了还要关闭!


关闭数据库

通过前面的使用,我们把数据放在两种对象中:ResultSet和int,这也就意味着关闭数据库的方法不太一样

  • 如果我们使用了Resultset,那我们需要和前面用过的的Connection、PreparedStatement一起关闭。

  • 如果没有创建Resultset对象,那我们只需要关闭Connection和PreparedStatement。

  • 代码分别如下图

    public static void addClose(PreparedStatement pstmt, Connection conn)
    {
    try
    {
    if (pstmt != null)
    {
    pstmt.close();
    }
    }catch(SQLException e1)
    {
    e1.printStackTrace();
    }
    try
    {
    if(conn != null)
    {
    conn.close();
    }
    }catch(SQLException e)
    {
    e.printStackTrace();
    }
    }
    public static void queryClose(PreparedStatement pstmt, ResultSet rs, Connection conn)
    {
    try
    {
    if (pstmt != null)
    {
    pstmt.close();
    }
    }
    catch (SQLException e1)
    {
    e1.printStackTrace();
    }
    try
    {
    if(rs != null)
    {
    rs.close();
    }
    }
    catch (SQLException e2)
    {
    e2.printStackTrace();
    }
    try
    {
    if(conn != null)
    {
    conn.close();
    }
    }
    catch (SQLException e3)
    {
    e3.printStackTrace();
    }
    }

你需要在每一个数据库操作方法结束的时候关闭它们

好像没什么需要说的了吧。。明天写一些关于上面的具体内容的东西