实验 JDBC基础(综合)
一、相关知识点
1、JDBC基本概念
2、元数据
二、实验目的:
理解元数据的概念,利用jdbc完成复杂业务逻辑。
三、实验内容:
1、 在booklib工程的DBUtil类中增加main函数,并在main函数中编写代码,列出booklib数据库中所有表的名字。
提示:会用到如下代码片段,请自行测试resultt中那一列为表名
【实验结果与分析】
A、写出代码部分。
public static void main(String[] args) throws SQLException {
DatabaMetaData dbmd = null;
Connection conn = null;
conn = DBUtil.getConnection();
dbmd = conn.getMetaData();
String types[] = {"VIEW","TABLE"};
ResultSet rs = dbmd.getTables(null, null, "%", types);
while(rs.next())
{
System.out.print(rs.getString("TABLE_NAME")+"\t");
}
}
悬而不决2、在上述main函数中,增加代码,提取特定表中的字段信息,要求输出字段名字和数据类型。
提示:除了用课件中的方法,还可以用如下代码片段:
A、写出代码部分。
public static void main(String[] args) throws SQLException {
DatabaMetaData dbmd = null;
Connection conn = null;
conn = DBUtil.getConnection();
dbmd = conn.getMetaData();
//String types[] = {"VIEW","TABLE"};
ResultSet rs = Columns(null, "%", "beanbook","%");
while(rs.next())
{
System.out.print(rs.getString("COLUMN_NAME")+" ");
System.out.println(rs.getString("TYPE_NAME"));
}
}
3、在BookLendManager类中设计函数public void calPenal();完成如下功能:提取所有超期未归还的借阅记录,输出其读者id、图书条码、借阅时间、超期天数(假设用户仅能借阅30天,请自行将数据库表中的已有数据的借阅时间往前调);计算每条数据的罚金(罚金算法为超期30天内每天0.1元,31-60天每天0.15元,60天以上每天0.2元),并写入数据库表的penalSum字段中。函数编写完成后,通过main函数进行测试验证。
注:请注意事务控制
【实验结果与分析】
A、 请提供程序代码。
public void calPenal() throws DbException {
avoidable
List<BeanBookLendRecord> result=new ArrayList<BeanBookLendRecord>();
Connection conn=null;
try {
conn=DBUtil.getConnection();
String sql="lect readerid,bookBarcode,lendDate,TIMESTAMPDIFF(DAY,lendDate,now()) from BeanBookLendRecord where TIMESTAMPDIFF(DAY,lendDate,now())>30 and returndate is null";
准备的英文
java.sql.PreparedStatement pst=conn.prepareStatement(sql);
java.sql.ResultSet rs=pst.executeQuery();
while(rs.next()){
String readerid = rs.getString(1);
String bookBarcode = rs.getString(2);
java.sql.Date lendDate = (rs.getDate(3));
int days = rs.getInt(4)-30;
double中英网 penalSum = -1.0;
if(days<=30){
penalSum = 0.1*days;
}
el if(days>30 && days<=60){
penalSum = 0.15*(days-30)+3;
}
el if(days>60){
penalSum = 0.2*(typedefdays-60)+4.5+3;
}
System.out.println(readerid);
System.out.println(bookBarcode);
System.out.println(lendDate);
System.out.println(penalSum+"\n");
sql="update beanbooklendrecord t penalSum=? where readerid=? and bookBarcode=?";
java.sql.PreparedStatement koripst2=conn.prepareStatement(sql);
pst2.tDouble(1, penalSum);
pst2.tString(2, readerid);
pst2.tString(3, bookBarcode);
pst2.execute();
pst2.clo();
}
pst.clo();
rs.clo();
} catch (SQLException e) {
e.printStackTrace();
throw new DbException(e);
}
finally{
if(conn!=null)
try {
conn.clo();
} catch (SQLException e) {
otdr // TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void main(String[] args) throws DbException{
BookLendManager b = new BookLendManager();
b.calPenal();
}
4、在BookLendManager类中设计函数public void stopReader(),完成如下功能:停止总罚金超过10元的读者服务(将其stopDate字段值设为当前时间,stopUrId值设为任意一个管理员)。
要求:(1)任意一个管理员的账号需要通过sql语句查询出来,不能为常量
(2)统计读者罚金时,仅统计未归还的图书罚金
(3)再编写函数public void stopReader2(),要求采用不同的方法(一种方法是找到相应的读者一个一个的停止服务,另一种方式是通过一个sql语句完成设置;注意第一种方法时需要进行事务控制)
【实验结果与分析】
A、请给出两个函数的代码。
public void stopReader() {
Connection conn=null;
String ad = null;
try {
conn=DBUtil.getConnection();
conn.tAutoCommit(fal);
String sql=mbl"lect urid from beansystemur WHERE urtype like \"管理员\"";
java.sql.Statement st=conn.createStatement();
java.sql.ResultSet rs= st.executeQuery(sql);
if(rs.next()) ad=rs.getString(1);
// st.clo();
sql="lect readerid,penalSum from beanbooklendrecord where penalSum>10 and returnDate is null";
java.sql.Statement st2=conn.createStatement();
java.sql.ResultSet rs2= st2.executeQuery(sql);
// st2.clo();
while(rs2.next()) {
sql="update beanreader t stopDate=? WHERE readerid=?";
java.sql.PreparedStatement pst=conn.prepareStatement(sql);
pst.tTimestamp(1, new java.sql.Timestamp(System.currentTimeMillis()));
pst.tString(2, rs2普及的意思杯酒人生在线观看.getString(1));
pst.executeUpdate();
// pst.clo();
sql="update beanreader t stopUrId=? WHERE readerid=?";
java.sql.PreparedStatement pst2=conn.prepareStatement(sql);
pst2.tString(1, ad);
pst2.tString(2, rs2.getString(1));
pst2.executeUpdate();
// pst2.clo();
}
conn.commit();
conn.clo();
}catch (SQLException e) {
e.printStackTrace();