频道栏目
首页 > 资讯 > Java > 正文

jdbc的程序结构介绍

18-04-08        来源:[db:作者]  
收藏   我要投稿

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(List ai){//插入方法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(){
		List list = 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 List getAll(){	
		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;
 		}
 

}
相关TAG标签
上一篇:Windows Socket API函数的用法及理解(代码实例)
下一篇:react-redux的使用实例讲解
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站