首页 > 技术文章 > JDBC执行不同SQL语句调用的方法示例

linglongfang 2020-04-13 11:06 原文

一、执行DDL(数据库定义语言)   

CREATE , DROP , ALTER 语句 : 使用PreparedStatement对象的execute()方法

对于DDL是否执行成功:对于任何sql语句执行报错(不成功),都会报错SQLException错误

举例:CREATE语句

@Test
public void test() throws Exception {
    Connection conn = JDBCUtils.getConnection();
    String sql = "CREATE TABLE student(\n" +
                "  id INT PRIMARY KEY AUTO_INCREMENT,\n" +
                "  sname VARCHAR(200) NOT NULL,\n" +
                "  note VARCHAR(200) NOT NULL\n" +
                ")";
    PreparedStatement ps = conn.prepareStatement(sql);
    ps.execute();
  JDBCUtils.closeResource(conn,ps);//关闭资源 }

 

 二、执行DQL(数据库查询语言)

SELECT 语句 : 使用PreparedStatement对象的executeQuery()方法

对于DQL,只要执行成功,返回的必然是ResultSet对象,获取其中的值类似于迭代器。

 查询一行数据(这里的异常没有处理,简化代码,勿怪)

@Test
public void test() throws Exception {
    Connection conn = JDBCUtils.getConnection();
    String sql = "SELECT `id`,`name`,`email`,`birth` FROM customers WHERE id = ?";
    PreparedStatement ps = conn.prepareStatement(sql);
    ps.setObject(1,1);//设置第一个参数为1,填充?替代的值
    ResultSet rs = ps.executeQuery();
if(rs.next()){ int id = rs.getInt(1); String name = rs.getString(2); String email = rs.getString(3); Date date = rs.getDate(4); System.out.println(id+"\t"+name+"\t\t"+email+"\t"+date); //这里可以new一个对象接受 }
  JDBCUtils.closeResource(conn,ps,rs);//关闭资源
}

 

查询多行数据(这里的异常没有处理,简化代码,勿怪)

@Test
public void test() throws Exception {
    Connection conn = JDBCUtils.getConnection();
    String sql = "SELECT `id`,`name`,`email`,`birth` FROM customers WHERE id BETWEEN ? AND ?;";
    PreparedStatement ps = conn.prepareStatement(sql);
    ps.setInt(1,2);//设置第一个参数为2,填充?替代的值
    ps.setInt(2,5);//设置第二个参数为5,填充第二个?替代的值
    ResultSet rs = ps.executeQuery();
    while(rs.next()){
        int id = rs.getInt("id");
        String name = rs.getString("name");
        String email = rs.getString("email");
        Date date = rs.getDate("birth");
        System.out.println(id+"\t"+name+"\t"+email+"\t"+date); //这里可以new一个对象接受,然后添加到集合中去
    }
  JDBCUtils.closeResource(conn,ps,rs);//关闭资源
}

  如何做到通用查询,通过ResultSetMetaDate提取出结果集的元数据。

public <T> T getInstance(Class<T> clazz, String sql, Object... args) {

  Connection conn = null;
  PreparedStatement ps = null;
  ResultSet rs = null;
  try {
    // 1.获取数据库连接
    conn = JDBCUtils.getConnection();

    // 2.预编译sql语句,得到PreparedStatement对象
    ps = conn.prepareStatement(sql);

    // 3.填充占位符
    for (int i = 0; i < args.length; i++) {
      ps.setObject(i + 1, args[i]);
    }

    // 4.执行executeQuery(),得到结果集:ResultSet
     rs = ps.executeQuery();

    // 5.得到结果集的元数据:ResultSetMetaData
    ResultSetMetaData rsmd = rs.getMetaData();

    // 6.1通过ResultSetMetaData得到columnCount,columnLabel;通过ResultSet得到列值
    int columnCount = rsmd.getColumnCount();
    if (rs.next()) {
      T t = clazz.newInstance();
      for (int i = 0; i < columnCount; i++) {// 遍历每一个列

        // 获取列值
        Object columnVal = rs.getObject(i + 1);
        // 获取列的别名:列的别名,使用类的属性名充当
        String columnLabel = rsmd.getColumnLabel(i + 1);
        // 6.2使用反射,给对象的相应属性赋值
        Field field = clazz.getDeclaredField(columnLabel);
        field.setAccessible(true);
        field.set(t, columnVal);
      }
      return t;

       }
     } catch (Exception e) {

        e.printStackTrace();
     } finally {
        // 7.关闭资源
        JDBCUtils.closeResource(conn, ps, rs);
     }
        return null;
}

 

三、执行DML(数据库操作语言)

INSERT UPDATE DELETE 语句:使用PreparedStatement对象的executeUpdate()方法

//通用的增、删、改操作(体现一:增、删、改 ; 体现二:针对于不同的表):返回的是对数据库影响的行数
public int update(String sql,Object ... args){
    Connection conn = null;
    PreparedStatement ps = null;
    try {
       //1.获取数据库的连接
       conn = JDBCUtils.getConnection();
            
       //2.获取PreparedStatement的实例 (或:预编译sql语句)
       ps = conn.prepareStatement(sql);
       //3.填充占位符
       for(int i = 0;i < args.length;i++){
            ps.setObject(i + 1, args[i]);
       }
        
        //4.执行sql语句
        return ps.executeUpdate();
    } catch (Exception e) {
        
        e.printStackTrace();
    }finally{
        //5.关闭资源
       JDBCUtils.closeResource(conn, ps);
    }
  return 0;
}

 

推荐阅读