zoukankan      html  css  js  c++  java
  • jdbc 数据的增删改查的Statement Resultset PreparedStatement

    完成数据库的连接,就马上要对数据库进行增删改查操作了;先来了解一下Statement

    通过JDBC插入数据 (这里提供一个查找和插入方法)

    Statement:用于执行sql语句的对象;
    *1.通过Connection 的creatStatement()方法来获取;
    *2.通过executeUpdate(sql) 可以执行SQL语句
    *3.传入的SQL可以是insert update delete,但是不能是select;
    * 注意:在使用后要关闭connection和statement(在finally中关闭)
    * 关闭的顺序:先关statement ; 后关 connection

    @Test
    public void testStatement()throws Exception{
    //1.获取数据库连接
    Connection conn = null;
    Statement st = null;
    try {
    conn = getConnection();//参看最底下的附录(获取连接)
    //2.准备插入的sql
    String sql ="insert into contacts(name,address,phone)"+"value('xyz','abc','abc')";
    //3.执行插入
    //获取sql的statement对象:Connection的createStatement()方法来获取
    st = conn.createStatement();
    //调用statement对象的executeUpdate(sql)对象,插入sql语句
    st.executeUpdate(sql);
    } catch (Exception e) {
    e.printStackTrace();
    }finally{
    try{
    if(st !=null)
    //关闭Statement 对象
    st.close();
    }catch (Exception e) {
    e.printStackTrace();
    }finally{
    //关闭连接
    if(conn !=null)
    conn.close();
    }

    }


    }

    /**
    * ResultSet:结果集,封装了使用JDBC进行查询的接口
    * 1.调用Statement 对象的executeQuesry(sql)可以得到结果集
    * 2.返回一张数据表,有指针指向数据表的第一行的前面
    * 3.可以调用next方法检测下一行是否有效,若有效返回true且指针下移
    * 4.当指针对到一行时,可以通过getxxxx(index)或者getxxx(cloumName);
    * 获取每一列的值:getInt(1),getString("name")
    * @throws Exception
    */
    @Test
    public void testResultSet() throws Exception{
    //获取Id=19的记录值,并且每条打印
    Connection con = null;
    ResultSet rs = null;
    Statement st = null;
    try {
    //1.获取connection
    con = JdbcTools.getConnection();//JdbcTools.getConnection()同附录的方法
    //2.获取Statement
    st = con.createStatement();
    //3.准备sql
    String sql = "select * from contacts where id=19";
    //4.获取ResultSet
    rs = st.executeQuery(sql);
    //5.处理ResultSet
    if(rs.next()){//如果是多条记录,把if改成while
    int id = rs.getInt(1);//第一列
    String name = rs.getString("name");
    String address = rs.getString(3);
    System.out.println(id);
    System.out.println(name);
    System.out.println(address);
    }
    //6.关闭
    } catch (Exception e) {
    e.printStackTrace();
    }finally{
    JdbcTools.release(rs, st, con);//方法见附录
    }
    }

    //以上提供了插入和查询方法 

    *********************************************************************************************************************

     这里我们在来了解一个PreparedStatement方法,可以对比Stetement

    /**
    * PreparedStatement是Stetement的子接口;
    *preparedStatement:使用statement,sql需要拼接;
    *PerparedStatement:String sql="insert into contacts(name,address,phone) value(?,?,?)"
    *Statement:String sql = "insert into contacts(name,address,phone)"+"value('nn'+'121'+'1212')";
    *1.创建preparedStatement:
    *2.调动PreparedStatement的setxxx(int index,object value),设置占位符的值
    *这里index从1开始
    *3.执行sql语句:executeQuery()或者executeUpdate(),前者是查询,后者是更新
    *注意,执行时不再需要闯入sql语句
    *
    *好处:1防止SQl注入,即防止拼接过程中有加入其它东西,例如有OR···,这样,sql就可以正确执行;2提高性能;3····
    *
    * @throws Exception
    */
    @Test
    public void testPreparedStatement() throws Exception {
    Connection con = null;
    PreparedStatement p = null;
    ResultSet rs = null;
    try {
    con = JdbcTools.getConnection();
    String sql = " insert into contacts(name,address,phone)values(?,?,?)";
    p = con.prepareStatement(sql);
    p.setString(1, "tom");
    p.setString(2, "zhejiang");
    p.setString(3, "15988324290");
    p.executeUpdate();
    } catch (Exception e) {
    e.printStackTrace();
    }finally{
    JdbcTools.releaseDB(rs, p, con);
    }

    }

    附上

    public Connection getConnection() throws Exception{
    String driverClass = null;
    String jdbcUrl = null;
    String user = null;
    String password = null;

    //读取类路径下的properties
    InputStream in = getClass().getClassLoader().getResourceAsStream("jdbc.properties");
    Properties p = new Properties();
    p.load(in);
    driverClass=p.getProperty("driver");
    jdbcUrl = p.getProperty("jdbcUrl");
    user = p.getProperty("user");
    password = p.getProperty("password");


    Driver driver = (Driver) Class.forName(driverClass).newInstance();//实例化
    Properties info = new Properties();
    info.put("user",user);
    info.put("password",password);
    Connection connection = driver.connect(jdbcUrl, info);
    return connection;
    }

    public static void release(ResultSet rs, Statement statement ,Connection con) throws Exception{

    if(rs != null){

    try {

    rs.close();

    } catch (Exception e2) {

    e2.printStackTrace();

    }

    }

    if(statement !=null){

    try {

    statement.close();

    } catch (Exception e2) {

    e2.printStackTrace();

    }

    }

    if(con!=null){

    try {

    con.close();

    } catch (Exception e2) {

    e2.printStackTrace();

    }

    }

    }

    public static void releaseDB(ResultSet rs, PreparedStatement statement ,Connection con) throws Exception{

    if(rs != null){

    try {

    rs.close();

    } catch (Exception e2) {

    e2.printStackTrace();

    }

    }

    if(statement !=null){

    try {

    statement.close();

    } catch (Exception e2) {

    e2.printStackTrace();

    }

    }

    if(con!=null){

    try {

    con.close();

    } catch (Exception e2) {

    e2.printStackTrace();

    }

    }

    }

    需要导入的包

    mysql-connector-java-5.1.34.jar

  • 相关阅读:
    网络优化改进
    图像识别和卷积神经网路案例的实现
    卷积神经网络和图像识别
    ANA网络分析
    大数阶乘
    HDU 1002 A + B Problem II (大数加法)
    HDU 1232 畅通工程 (并查集)
    HDU 1231 最大连续子序列 (dp)
    HDU 2546 饭卡 (dp)
    HDU 1203 I NEED A OFFER! (dp)
  • 原文地址:https://www.cnblogs.com/lixiuming521125/p/5893206.html
Copyright © 2011-2022 走看看