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<StudentInfo> 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<StudentInfo> 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<StudentInfo> list = new ArrayList<StudentInfo> ();
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<studentAction> 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;
}
}
4.