一、执行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;
}