1.StudentDao.java
import java.io.File; import java.io.FileInputStream; import java.io.OutputStream; import java.sql.Blob; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.List; import day1104jdbchigh2.MyDs; public class StudentDao { /* * 启动 jdbc事务的方式: * 1. 把connection的autoCommit的默认行提交方式,改为手动提交。 * 2. 在多个sql执行后,没有出现异常时,调用 conn.commit()手动提交数据; * 如果执行出现异常,则调用conn.rollback()回滚已经执行成功的数据到初始状态。 * * 3. 在finally中恢复conn的autoCommit提交的默认行模式--->true. * 恢复默认值的重要性:如果和别人共用connection数据时,没有恢复默认值,别人在提交时将提交不了。 */ private static final String INSERT = "INSERT INTO T_STUDENT2 " + "(STD_ID, STD_NAME, STD_SEX, STD_BDT, STD_DESC ) VALUES ( seq007.nextval, , , to_date(,'yyyy-mm-dd'), ) " ; public int insertBatch_1(Listai){//插入方法1. Connection conn = null ; try { conn = MyDs.getDs().getConnection();//数据库连接 。 if (conn == null){ return -1;} int x = 0 ; for(StudentInfo si : ai){ PreparedStatement stmt = conn.prepareStatement(INSERT);//获取对象。 stmt.setString(1,si.getStdName()); stmt.setString(2,si.getStdSex()); stmt.setString(3,si.getStdBdt2()); stmt.setString(4,si.getStdDesc()); int m = stmt.executeUpdate(); x = x + m ; //记录:insert的数量(个数。) stmt.close(); } return x; } catch (SQLException e) { e.printStackTrace(); }finally{ //建议把conn的关闭写入在finally中 try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } return -1; } public int insertBatch_2(List ai){//插入方法2. Connection conn = null ; try { conn = MyDs.getDs().getConnection();//获取数据。 if (conn == null){ return -1;} conn.setAutoCommit(false);//设置获取数据后,不自动提交。 int x = 0 ; for(StudentInfo si : ai){ PreparedStatement stmt = conn.prepareStatement(INSERT) ; stmt.setString(1,si.getStdName()); stmt.setString(2,si.getStdSex()); stmt.setString(3,si.getStdBdt2()); stmt.setString(4,si.getStdDesc()); int m = stmt.executeUpdate(); x = x + m ; stmt.close(); } conn.commit(); //执行未发生异常,进行commit。 1. return x; } catch (SQLException e) { e.printStackTrace(); try { conn.rollback();//执行发生异常,进行rollback。 2. } catch (SQLException e1) { e1.printStackTrace(); } }finally{ //建议把conn的关闭写入在finally中 try { conn.setAutoCommit(true);//恢复commit的默认值。 3. conn.close(); } catch (SQLException e) { e.printStackTrace(); } } return -1; } //************************************************************************************************************************************************************* /* * jdbc插入图片的方法。 oracle中处理二进制数据的方式: * 1. 把一个数按照正常的方式插入到数据中。 * 2. 把该数据的二进制部分,用 oracle的函数 empty_blob()来处理,更新为一个空的流,可以被取到。 * 以上1,2 两个顺序可以合并:在插入记录的时候,直接插入二进制字段为 empty_blob() * * 3. 用锁定的把该记录查询出来,尤其是blob部分。 * 4. 对blob部分用io进行操作。 * 5. 以上操作 放在同一个事务中。 * * -----------------------------------------------------error (注意:一定要把SQL语句字段 名写对 !!!!!!!!! ) */ private static final String INSERT2 ="insert into t_student " + "(std_xuehao, std_name, std_sex, std_age, std_from, std_major, std_Bdt, STD_DESC, std_img ) " + " VALUES ( ,,,,'陕西','机制',to_date( ,'yyyy-mm-dd'),'好学生', empty_blob() )"; //for update为了锁定该行记录,不允许别人访问。 private static final String SELECT_FOR_UPDATE ="select std_img from t_student where std_xuehao= for update "; public int insertWithImg_3(StudentInfo si){//StudentInfo si实例化学生信息类,做参数。 long key = getNextVal_4() ;//序列值key 。 if (key< 0 ) {return -1; } //如果序列值小于零,则说明出错了。 Connection conn = null ; try { conn = MyDs.getDs().getConnection(); if (conn == null){ //判断:没连接上,则说明出错了。 return -1; } conn.setAutoCommit(false);//设置手动commit。 PreparedStatement stmt = conn.prepareStatement(INSERT2); stmt.setLong(1, key); stmt.setString(2,si.getStdName());//对SQL语句中的 ?参数未知字段,提取出来,再按位准备放置内容。 stmt.setString(3,si.getStdSex()); stmt.setLong (4,si.getStdage()); stmt.setString(5,si.getStdBdt2()); System.out.println("-----------"); int m = stmt.executeUpdate(); stmt.close(); stmt = conn.prepareStatement(SELECT_FOR_UPDATE);//再次更新数据。 stmt.setLong(1,key); //获取该条记录。 ResultSet rs = stmt.executeQuery();//执行该条记录。[execut靠2]:理解为游标、鱼钩。它提供了next()方法。 if (rs.next()){ Blob bl = rs.getBlob(1);//获取这条记录、第一个字段,Blob字段。 oracle.sql.BLOB bl2 = (oracle.sql.BLOB)bl;//把该bl类型转换为oracle 的Blob类型, 如果是其他数据库,也转换为对应的Blob /* * 假设已有图片,想要更新图片: 就得先使用empty_blob()方法,将图片制空,然后再Output写入(生成)。 */ OutputStream os = bl2.getBinaryOutputStream();//转换为Blob的好处:可以获得它的输入输出流。 方法过时。 File ff = new File(si.getFileName()); int len = (int)ff.length() ; //改进该步骤:使用buffer 多次读入的方式 ?_____________________________________???? byte buffer[] = new byte[len] ; FileInputStream fis = new FileInputStream(ff); //读取文件到buffer,写入文件到流里;*************************** fis.read(buffer) ; os.write(buffer); fis.close(); os.close(); } stmt.close(); conn.commit(); return 1; } catch (Exception e) { e.printStackTrace(); try { conn.rollback(); } catch (SQLException e1) { e1.printStackTrace(); } } finally{ try { conn.setAutoCommit(true); conn.close(); } catch (SQLException e) { e.printStackTrace(); } } return -1; //如果出错,显示-1。 } public long getNextVal_4(){ //获取序列值 --seq007.nextval。 Connection conn = null ; try { conn = MyDs.getDs().getConnection(); if (conn == null){ return -1; } PreparedStatement stmt = conn.prepareStatement("select seq008.nextval from dual ") ; ResultSet rs = stmt.executeQuery(); //理解为:游标、鱼钩。 if (rs.next()){ long x = rs.getLong(1); //记录:序列值 rs.close(); stmt.close(); return x ;//记录序列值 } } catch (SQLException e) { e.printStackTrace(); }finally{ try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } return -1; } }
2. TestStd1.java
import java.util.ArrayList; import java.util.Date; import java.util.List; /* * 启动 jdbc事务的方式: * 1. 把connection的autoCommit的默认行提交方式,改为手动提交。 * 2. 在多个sql执行后,没有出现异常时,调用 conn.commit()手动提交数据; * 如果执行出现异常,则调用conn.rollback()回滚已经执行成功的数据到初始状态。 * * 3. 在finally中恢复conn的autoCommit提交的默认行模式--->true. * 恢复默认值的重要性:如果和别人共用connection数据时,没有恢复默认值,别人在提交时将提交不了。 */ public class TestStd1 { public static void main(String[] args) { //t1(); t2(); } static void t1(){ Listlist = new ArrayList (); for(int i = 0 ; i<5 ; i++){ StudentInfo si = new StudentInfo();//实例化类。 si.setStdName("测试05-" + i); si.setStdBdt(new Date()); si.setStdSex("男"); si.setStdDesc("好学生"); list.add(si); } StudentDao sd = new StudentDao ();//实例化类,进行插入操作。 int m = sd.insertBatch_1(list) ; System.out.println("over v:" + m); //int m = sd.insertBatch2(list) ; //System.out.println("over v:" + m); } static void t2(){ StudentDao sd = new StudentDao () ; StudentInfo si = new StudentInfo() ; si.setStdName("小花"); // 2 si.setStdSex("男"); // 3 si.setStdage(19L); // 4 si.setStdBdt2("1994-03-09"); // 5 si.setFileName("d:/桥.jpg");//照片。 int x = sd.insertWithImg_3(si) ; //插入照片方法: System.out.println("插入行数:"+ x ); } }
二.==============================================================
3. userDao.java
import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.List; import jdbc_tools.MyDs; public class Dao { private static String insert ="insert into tb_user(username,pwd,email,question,answer,city) value(,,,,,)"; //1.增加. public int insert_1(studentAction s) { Connection conn = null; try { conn = MyDs.getDs().getConnection();// 数据库连接 。 if (conn == null) { return -1; } PreparedStatement stmt = conn.prepareStatement(insert); stmt.setString(1, s.getStdName() ); stmt.setString(2, s.getStdPwd() ); stmt.setString(3, s.getStdEmail() ); stmt.setString(4, s.getStdQuest() ); stmt.setString(5, s.getStdAnswer() ); stmt.setString(6, s.getStdCity() ); int m =stmt.executeUpdate(); //插入的行数。 stmt.close(); return m; } catch (SQLException e) { e.printStackTrace(); } finally { try { conn.close(); //放finally中。---- 始终会执行语句。 } catch (SQLException e) { e.printStackTrace(); } } return -1; } private static String logon ="select id,username,pwd,email,question,answer,city from tb_user where username= and pwd="; // 占位符。 // 2.登录。 public studentAction logon_1(String s1,String s2){ Connection conn = null; try { conn = MyDs.getDs().getConnection(); if (conn == null) return null; PreparedStatement stmt = conn.prepareStatement(logon); stmt.setString(1, s1); stmt.setString(2, s2); ResultSet rs =stmt.executeQuery(); studentAction user= null; while(rs.next()){ String str2=rs.getString(2); String str3=rs.getString(3); String str4=rs.getString(4);//数据库的--字段的位置、 String str5=rs.getString(5); String str6=rs.getString(6); String str7=rs.getString(7); user=new studentAction(); user.setStdName(str2); user.setStdPwd(str3); user.setStdEmail(str4); user.setStdQuest(str5); user.setStdAnswer(str6); user.setStdCity(str7); } stmt.close(); return user; } catch (SQLException e) { e.printStackTrace(); } finally { try { conn.close(); //放finally中。---- 始终会执行语句。 } catch (SQLException e) { e.printStackTrace(); } } return null; } //3.查询全部。 public ListgetAll(){ List list=new ArrayList(); try { Connection conn=MyDs.getDs().getConnection() ; if (conn == null) return null ; Statement stmt =conn.createStatement(); ResultSet rs = stmt.executeQuery("select * from tb_user") ; studentAction mi = null; while(rs.next()){ int st1 = rs.getInt(1); String str2= rs.getString(2); String str3= rs.getString(3); String str4= rs.getString(4); String str5= rs.getString(5); String str6= rs.getString(6); String str7= rs.getString(7); mi = new studentAction() ; mi.setStdId(st1); mi.setStdName(str2); mi.setStdPwd(str3); mi.setStdEmail(str4); mi.setStdQuest(str5); mi.setStdAnswer(str6); mi.setStdCity(str7); list.add(mi) ; } stmt.close(); conn.close(); return list ; } catch (SQLException e) { e.printStackTrace(); } return null; } //4.根据id,删除。 private static String delete_BY_ID="delete tb_user where id= " ; public int deleteById(int id){ try { Connection conn = MyDs.getDs().getConnection() ; if (conn == null) { return -1;} PreparedStatement stmt = conn.prepareStatement(delete_BY_ID); stmt.setLong(1, id); int m = stmt.executeUpdate(); //删除的行数。 stmt.close(); conn.close(); return m ; } catch (SQLException e) { e.printStackTrace(); } return -1; } //-----------------------------------id,username,pwd,email,question,answer,city ---------------------------------------------------- String BY_ID="select id,username,pwd,email,question,answer,city from tb_user where id= "; //4.根据id查询。 public studentAction getById(int id){ try { Connection conn = MyDs.getDs().getConnection() ; if(conn == null) { return null ;} PreparedStatement stmt = conn.prepareStatement(BY_ID); stmt.setLong(1 , id); ResultSet rs = stmt.executeQuery() ; studentAction mi= null ; if(rs.next()){ mi = new studentAction() ; mi.setStdId(rs.getInt(id)); mi.setStdName(rs.getString(2)); mi.setStdPwd(rs.getString(3)) ; mi.setStdEmail(rs.getString(4)); mi.setStdQuest(rs.getString(5)); mi.setStdAnswer(rs.getString(6)); mi.setStdCity(rs.getString(7) ); } stmt.close(); conn.close(); return mi ; } catch (SQLException e) { e.printStackTrace(); } return null; } private static String update_BY_ID= "update tb_user set username=, pwd = ,email=,question=,answer=,city= where id= "; //5.根据id,更改。 public int update(studentAction mi, long oldId){ try { Connection conn = MyDs.getDs().getConnection(); if (conn == null) return -1; PreparedStatement stmt = conn.prepareStatement(update_BY_ID); stmt.setString(1 ,mi.getStdName()); stmt.setString(2 ,mi.getStdPwd()); stmt.setString(3 ,mi.getStdEmail()); stmt.setString(4 ,mi.getStdQuest()); stmt.setString(5 ,mi.getStdAnswer()); stmt.setString(6 ,mi.getStdCity()); stmt.setLong(7 , oldId); int rs = stmt.executeUpdate() ; //执行SQL语句对象。 stmt.close(); conn.close(); return rs ; } catch (SQLException e){ e.printStackTrace(); } return -1; } }