static void template(){ Connection comm = null; Statement st = null; ResultSet rs = null ; //因为我们是和接口打交道,所以我们这里选的是java.sql.ResultSet这个,我们要接口不要实现 try{ Class.forName("com.mysql.jdbc.Driver"); //驱动只应该注册一次 Connection conn = DriverManager.getConnection(url,user,pwd); }finally{ } } public final class JdbcUtils{ //因为工具类是直接使用的,所以不允许继承,所以写final private static String url = "jdbc:mysql://localhost:3306/jdbc"; //能够私有,尽量私有,因为你修改不会对别人造成影响,被人根本就不可能使用你的赛 private static String user = "root"; private static String password = ""; private JdbcUtils(){} //因为工具类是不需要实例的,所以不允许new static{ try{ Class.forName("com.mysql.jdbc.Driver"); //因为静态代码块只会在加载到jvm中被执行一次,所以我们把只要注册一次的东西放到这里 }catch(Exception e){ throw new Exception(e); } } public static Connection getConnection(){ return DriverManager.getConnection(url,user,password); } public static void free(ResultSet rs,Statement st,Connection conn){ try{ if(rs != null){//判断空是因为,如果某个地方出错,这里很可能就是空 rs.close(); }catch(Exception e){ }finally{ try{ if(st != null) st.close(); }catch(Exception e){ }finally{ try{ if(conn != null){ conn.close(); } }catch(Exception e){ } } } } } ResultSet rs = st.executeQuery(sql); int i = st.executeUpdate(sql); //这个方法是 insert和update,delete都可以用,是插入和更新语句的通用方法 如果在数据库中插入成功,那么返回1,其实意思是有一条记录受到了改语句的影响 如果是插入呢? sql = "update user set money = money+10"; int i = st.executeUpdate(sql); //这个i当然也是被影响的行数啦 String sql = "select id,name,money,birthday from user where name ='"+name+"'"; //这样写的毛病 如果 name = " ' or 1 or ' ";那么会把所有的数据都查出来,为什么呢?因为 name=" ",因为两个单引号之间什么也没有,当然是空, 这个当然没有, or 1 表示 or true,这样就把所有的记录都查询出来了 所以拼串很不安全,(但是如果输入的是int ,拼字符串也是可以的)那么怎么办呢? 使用预处理的车子哈。。。他会过滤掉一些系统的保留字,还会对sql做些优化。。,可以解决sql注入哈 PreparedStatement ps = null; ps = conn.prepareStatement(sql); //这里是在构造这个车子的时候就给他了哈,所以才叫预处理嘛。。 rs = ps.executeQuery(sql); //他是能调用Statement的所有方法。。这个方法就是。。因为PreparedStatement是从Statement继承过来的 rs = ps.executeQuery(); //我们一般用这个 Statement会使数据库频繁编译sql,可能造成数据库缓冲区溢出 所以,只要带有参数的sql,一定要用PreparedStatement,不带参数的就不要用了 java.util.Date date = rs.getDate(); //这个Date是java.sql.Date,而我们通常用的是java.util.Date , 他们的关系是java.sql.Date是继承了java.util.Date //java.util.Date 是既有日期又有时间的,而java.sql.Date 只有日期没有时间,如果想转行也可以,赋值就可以了 ps.setDate(2,java.sql.Date); //如何将java.util.Date转化成java.sql.Date.... new java.sql.Date(birthday.getTime());----通过毫秒来转 注意:java.sql.Date做了些格式化的工作,所以他们输出的结果是 : 2008-09-24这样的字符串 注意: mysql中的text字段是大的文本串类型,这种大文本的专业术语是: clobText 因为是字符流,当然用字符流的读取器 BufferedReader reader = new BufferedReader(new FileReader(new File("src/cn/itcast/jdbc/JdbcUtils.java"))); ps.setCharacterStream(1,reader,(int)file.length); //使用字符流处理大文本、 或者可以ps.setString(1,new String(buf,0,len)); //可以用字符流,难道还不可以用字符串啊。。。 Writer writer = new BufferedWriter(new FileWriter(new File("XXXX.java"))); Clob clob = rs.getClob(1);//这个可以读取大文本 或者最好是 rs.getString(1); //这样也可以拿出来大文本 Reader reader = clob.getCharacterStream(); //也可以直接使用rs.getCharacterStream(); char[] buff = new char[1024]; int len; while((len = reader.read(buff))>0){ writer.write(buff,0,len); } writer.close(); reader.close();