20165301第八周課下作業
阿新 • • 發佈:2018-04-22
mage root png 排序 def cor [1] setbounds 代碼
第八周課下作業
相關知識點總結
- MYSQL數據庫的安裝與使用
- JDBC語句連接數據庫,關閉連接
- 循序查詢、條件與排序查詢
- 添加與刪除操作
- 通用查詢和事務管理
課下補做
代碼分析
Example11_1
import java.sql.*; public class Example11_1 { public static void main(String args[]) { Connection con=null; Statement sql; ResultSet rs; try{ Class.forName("com.mysql.jdbc.Driver"); //加載JDBC_MySQL驅動 } catch(Exception e){} String uri = "jdbc:mysql://localhost:3306/students?useSSL=true"; String user ="root"; String password =""; try{ con = DriverManager.getConnection(uri,user,password); //連接代碼 } catch(SQLException e){ } try { sql=con.createStatement(); rs=sql.executeQuery("SELECT * FROM mess"); //查詢mess表 while(rs.next()) {//當存在下一個數據是返回true String number=rs.getString(1);//將表第一列的數據傳給number String name=rs.getString(2); Date date=rs.getDate(3); float height=rs.getFloat(4); System.out.printf("%s\t",number); System.out.printf("%s\t",name); System.out.printf("%s\t",date); System.out.printf("%.2f\n",height); } con.close();//關閉連接 } catch(SQLException e) { System.out.println(e); } } }
- 這個代碼是用來查詢student數據庫中的mess表的全部記錄。
Example11_2
import java.sql.*; public class Example11_2 { public static void main(String args[]) { Connection con; Statement sql; ResultSet rs; con = GetDBConnection.connectDB("students","root",""); if(con == null ) return; try { sql=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY); rs = sql.executeQuery("SELECT * FROM mess "); rs.last(); int max = rs.getRow(); System.out.println("表共有"+max+"條記錄,隨機抽取2條記錄:"); int [] a =GetRandomNumber.getRandomNumber(max,2);//得到1-max之間2個不同隨機數 for(int i:a){ rs.absolute(i);//油標移動到第i行 String number = rs.getString(1); String name = rs.getString(2); Date date = rs.getDate(3); float h = rs.getFloat(4); System.out.printf("%s\t",number); System.out.printf("%s\t",name); System.out.printf("%s\t",date); System.out.printf("%.2f\n",h); } con.close(); } catch(SQLException e) { System.out.println(e); } } } import java.sql.*; public class GetDBConnection { public static Connection connectDB(String DBName,String id,String p) { Connection con = null; String uri = "jdbc:mysql://localhost:3306/"+DBName+"?useSSL=true&characterEncoding=utf-8"; try{ Class.forName("com.mysql.jdbc.Driver");//加載JDBC-MySQL驅動 } catch(Exception e){} try{ con = DriverManager.getConnection(uri,id,p); //連接代碼 } catch(SQLException e){} return con; } } import java.util.*; public class GetRandomNumber { public static int [] getRandomNumber(int max,int amount) { //1-max之間的amount個不同隨機整數 int [] randomNumber = new int[amount]; int index =0; randomNumber[0]= -1; Random random = new Random(); while(index<amount){ int number = random.nextInt(max)+1; boolean isInArrays=false; for(int m:randomNumber){//m依次取數組randomNumber元素的值(見3.7) if(m == number) isInArrays=true; //number在數組裏了 } if(isInArrays==false){ //如果number不在數組randomNumber中: randomNumber[index] = number; index++; } } return randomNumber; } }
- 將數據庫單獨分裝在一個GetDatabaseConnection類中。隨機查詢student數據庫中的mess表的兩條記錄。
Example11_3
import java.sql.*; public class Example11_3 { public static void main(String args[]) { Connection con; Statement sql; ResultSet rs; con = GetDBConnection.connectDB("students","root",""); if(con == null ) return; String c1=" year(birthday)<=2000 and month(birthday)>7";//條件1 String c2=" name Like ‘張_%‘"; String c3=" height >1.65"; String sqlStr = "select * from mess where "+c1+" and "+c2+" and "+c3+"order by birthday"; try { sql=con.createStatement(); rs = sql.executeQuery(sqlStr); while(rs.next()) { String number=rs.getString(1); String name=rs.getString(2); Date date=rs.getDate(3); float height=rs.getFloat(4); System.out.printf("%s\t",number); System.out.printf("%s\t",name); System.out.printf("%s\t",date); System.out.printf("%.2f\n",height); } con.close(); } catch(SQLException e) { System.out.println(e); } } } import java.sql.*; public class GetDBConnection { public static Connection connectDB(String DBName,String id,String p) { Connection con = null; String uri = "jdbc:mysql://localhost:3306/"+DBName+"?useSSL=true&characterEncoding=utf-8"; try{ Class.forName("com.mysql.jdbc.Driver");//加載JDBC-MySQL驅動 } catch(Exception e){} try{ con = DriverManager.getConnection(uri,id,p); //連接代碼 } catch(SQLException e){} return con; } }
- 這個代碼是查詢mess表中姓張,身高大於16.5,出生年份為2000或2000年之前,月份在七月份之後的學生,並按出生日期排序。
Example11_4
import java.sql.*;
public class Example11_4 {
public static void main(String args[]) {
Connection con;
Statement sql;
ResultSet rs;
con = GetDBConnection.connectDB("students","root","");
if(con == null ) return;
String jiLu="(‘R11q‘,‘王三‘,‘2000-10-23‘,1.66),"+
"(‘R10q‘,‘李武‘,‘1989-10-23‘,1.76)"; //2條記錄
String sqlStr ="insert into mess values"+jiLu;
try {
sql=con.createStatement();
int ok = sql.executeUpdate(sqlStr);
rs = sql.executeQuery("select * from mess");
while(rs.next()) {
String number=rs.getString(1);
String name=rs.getString(2);
Date date=rs.getDate(3);
float height=rs.getFloat(4);
System.out.printf("%s\t",number);
System.out.printf("%s\t",name);
System.out.printf("%s\t",date);
System.out.printf("%.2f\n",height);
}
con.close();
}
catch(SQLException e) {
System.out.println("記錄中number值不能重復"+e);
}
}
}
- 這個代碼是在mess表中插入兩條記錄。
Example11_5
import java.sql.*;
public class Example11_5 {
public static void main(String args[]) {
Connection con;
PreparedStatement preSql; //預處理語句對象preSql
ResultSet rs;
con = GetDBConnection.connectDB("students","root","");
if(con == null ) return;
String sqlStr ="insert into mess values(?,?,?,?)";
try {
preSql = con.prepareStatement(sqlStr);//得到預處理語句對象preSql
preSql.setString(1,"A001"); //設置第1個?代表的值
preSql.setString(2,"劉偉"); //設置第2個?代表的值
preSql.setString(3,"1999-9-10"); //設置第3個?代表的值
preSql.setFloat(4,1.77f); //設置第4個?代表的值
int ok = preSql.executeUpdate();
sqlStr="select * from mess where name like ? ";
preSql = con.prepareStatement(sqlStr);//得到預處理語句對象preSql
preSql.setString(1,"張%"); //設置第1個?代表的值
rs = preSql.executeQuery();
while(rs.next()) {
String number=rs.getString(1);
String name=rs.getString(2);
Date date=rs.getDate(3);
float height=rs.getFloat(4);
System.out.printf("%s\t",number);
System.out.printf("%s\t",name);
System.out.printf("%s\t",date);
System.out.printf("%.2f\n",height);
}
con.close();
}
catch(SQLException e) {
System.out.println("記錄中number值不能重復"+e);
}
}
}
import java.sql.*;
public class GetDBConnection {
public static Connection connectDB(String DBName,String id,String p) {
Connection con = null;
String uri =
"jdbc:mysql://localhost:3306/"+DBName+"?useSSL=true&characterEncoding=utf-8";
try{ Class.forName("com.mysql.jdbc.Driver");//加載JDBC-MySQL驅動
}
catch(Exception e){}
try{
con = DriverManager.getConnection(uri,id,p); //連接代碼
}
catch(SQLException e){}
return con;
}
}
- 此代碼是使用預處理語句向mess表添加並查詢了姓張的記錄
Example11_6
import javax.swing.*;
public class Example11_6 {
public static void main(String args[]) {
String [] tableHead;
String [][] content;
JTable table ;
JFrame win= new JFrame();
Query findRecord = new Query();
findRecord.setDatabaseName("students");
findRecord.setSQL("select * from mess");
content = findRecord.getRecord();
tableHead=findRecord.getColumnName();
table = new JTable(content,tableHead);
win.add(new JScrollPane(table));
win.setBounds(12,100,400,200);
win.setVisible(true);
win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
import java.sql.*;
public class Query {
String databaseName=""; //數據庫名
String SQL; //SQL語句
String [] columnName; //全部字段(列)名
String [][] record; //查詢到的記錄
public Query() {
try{ Class.forName("com.mysql.jdbc.Driver");//加載JDBC-MySQL驅動
}
catch(Exception e){}
}
public void setDatabaseName(String s) {
databaseName=s.trim();
}
public void setSQL(String SQL) {
this.SQL=SQL.trim();
}
public String[] getColumnName() {
if(columnName ==null ){
System.out.println("先查詢記錄");
return null;
}
return columnName;
}
public String[][] getRecord() {
startQuery();
return record;
}
private void startQuery() {
Connection con;
Statement sql;
ResultSet rs;
String uri =
"jdbc:mysql://localhost:3306/"+
databaseName+"?useSSL=true&characterEncoding=utf-8";
try {
con=DriverManager.getConnection(uri,"root","");
sql=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_READ_ONLY);
rs=sql.executeQuery(SQL);
ResultSetMetaData metaData = rs.getMetaData();
int columnCount = metaData.getColumnCount();//字段數目
columnName=new String[columnCount];
for(int i=1;i<=columnCount;i++){
columnName[i-1]=metaData.getColumnName(i);
}
rs.last();
int recordAmount =rs.getRow(); //結果集中的記錄數目
record = new String[recordAmount][columnCount];
int i=0;
rs.beforeFirst();
while(rs.next()) {
for(int j=1;j<=columnCount;j++){
record[i][j-1]=rs.getString(j); //第i條記錄,放入二維數組的第i行
}
i++;
}
con.close();
}
catch(SQLException e) {
System.out.println("請輸入正確的表名"+e);
}
}
}
- 這段代碼的功能是將數據庫名以及SQL語句傳遞給Query類的對象。
Example11_7
import java.sql.*;
public class Example11_7{
public static void main(String args[]){
Connection con = null;
Statement sql;
ResultSet rs;
String sqlStr;
con = GetDBConnection.connectDB("students","root","");
if(con == null ) return;
try{ float n = 0.02f;
con.setAutoCommit(false); //關閉自動提交模式
sql = con.createStatement();
sqlStr = "select name,height from mess where number=‘R1001‘";
rs = sql.executeQuery(sqlStr);
rs.next();
float h1 = rs.getFloat(2);
System.out.println("事務之前"+rs.getString(1)+"身高:"+h1);
sqlStr = "select name,height from mess where number=‘R1002‘";
rs = sql.executeQuery(sqlStr);
rs.next();
float h2 = rs.getFloat(2);
System.out.println("事務之前"+rs.getString(1)+"身高:"+h2);
h1 = h1-n;
h2 = h2+n;
sqlStr = "update mess set height ="+h1+" where number=‘R1001‘";
sql.executeUpdate(sqlStr);
sqlStr = "update mess set height ="+h2+" where number=‘R1002‘";
sql.executeUpdate(sqlStr);
con.commit(); //開始事務處理,如果發生異常直接執行catch塊
con.setAutoCommit(true); //恢復自動提交模式
String s = "select name,height from mess"+
" where number=‘R1001‘or number=‘R1002‘";
rs =
sql.executeQuery(s);
while(rs.next()){
System.out.println("事務後"+rs.getString(1)+
"身高:"+rs.getFloat(2));
}
con.close();
}
catch(SQLException e){
try{ con.rollback(); //撤銷事務所做的操作
}
catch(SQLException exp){}
}
}
}
import java.sql.*;
public class GetDBConnection {
public static Connection connectDB(String DBName,String id,String p) {
Connection con = null;
String uri =
"jdbc:mysql://localhost:3306/"+DBName+"?useSSL=true&characterEncoding=utf-8";
try{ Class.forName("com.mysql.jdbc.Driver");//加載JDBC-MySQL驅動
}
catch(Exception e){}
try{
con = DriverManager.getConnection(uri,id,p); //連接代碼
}
catch(SQLException e){}
return con;
}
}
- 這段代碼的功能是將mess表中的number字段R1001的height值減少n,並將減少的n增加到字段是R1002的height上。
Example11_8
import java.sql.*;
public class Example11_8 {
public static void main(String[] args) {
Connection con =null;
Statement sta = null;
ResultSet rs;
String SQL;
try {
Class.forName("org.apache.derby.jdbc.EmbeddedDriver");//加載驅動
}
catch(Exception e) {
System.out.println(e);
return;
}
try {
String uri ="jdbc:derby:students;create=true";
con=DriverManager.getConnection(uri); //連接數據庫
sta = con.createStatement();
}
catch(Exception e) {
System.out.println(e);
return;
}
try { SQL = "create table chengji(name varchar(40),score float)";
sta.execute(SQL);//創建表
}
catch(SQLException e) {
//System.out.println("該表已經存在");
}
SQL ="insert into chengji values"+
"(‘張三‘, 90),(‘李斯‘, 88),(‘劉二‘, 67)";
try {
sta.execute(SQL);
rs = sta.executeQuery("select * from chengji "); // 查詢表中的記錄
while(rs.next()) {
String name=rs.getString(1);
System.out.print(name+"\t");
float score=rs.getFloat(2);
System.out.println(score);
}
con.close();
}
catch(SQLException e) {
System.out.println(e);
}
}
}
- 這段代碼的功能是使用了Derby數據庫系統創建了名字是student的數據庫,並在數據庫中建立了chengji表
補做教材第十一章的編程題目
習題11編程題
第一題
import java.sql.*; public class test1 { public static void main(String args[]) { Connection con; Statement sql; ResultSet rs; con = GetDBConnection.connectDB("students","root","");//連接數據庫 if(con == null ) return; String sqlStr = "select * from mess "+"order by birthday"; //通過order by排序 try { sql=con.createStatement(); rs = sql.executeQuery(sqlStr); while(rs.next()) { String number=rs.getString(1); String name=rs.getString(2); Date date=rs.getDate(3); float height=rs.getFloat(4); System.out.printf("%s\t",number); System.out.printf("%s\t",name); System.out.printf("%s\t",date); System.out.printf("%.2f\n",height); } con.close(); } catch(SQLException e) { System.out.println(e); } } }
import java.sql.*;
public class GetDBConnection {
public static Connection connectDB(String DBName,String id,String p) {
Connection con = null;
String
uri = "jdbc:mysql://localhost:3306/"+DBName+"?useSSL=true&characterEncoding=utf-8";
try{ Class.forName("com.mysql.jdbc.Driver");//加載JDBC-MySQL驅動
}
catch(Exception e){}
try{
con = DriverManager.getConnection(uri,id,p); //連接代碼
}
catch(SQLException e){}
return con;
}
}
第二題
import java.sql.*; public class Query { String databaseName=""; //數據庫名 String SQL; //SQL語句 String [] columnName; //全部字段(列)名 String [][] record; //查詢到的記錄 public Query() { try{ Class.forName("com.mysql.jdbc.Driver");//加載JDBC-MySQL驅動 } catch(Exception e){} } public void setDatabaseName(String s) { databaseName=s.trim(); } public void setSQL(String SQL) { this.SQL=SQL.trim(); } public String[] getColumnName() { if(columnName ==null ){ System.out.println("先查詢記錄"); return null; } return columnName; } public String[][] getRecord() { startQuery(); return record; } private void startQuery() { Connection con; Statement sql; ResultSet rs; String uri = "jdbc:mysql://localhost:3306/"+ databaseName+"?useSSL=true&characterEncoding=utf-8"; try { con=DriverManager.getConnection(uri,"root",""); sql=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY); rs=sql.executeQuery(SQL); ResultSetMetaData metaData = rs.getMetaData(); int columnCount = metaData.getColumnCount();//字段數目 columnName=new String[columnCount]; for(int i=1;i<=columnCount;i++){ columnName[i-1]=metaData.getColumnName(i); } rs.last(); int recordAmount =rs.getRow(); //結果集中的記錄數目 record = new String[recordAmount][columnCount]; int i=0; rs.beforeFirst(); while(rs.next()) { for(int j=1;j<=columnCount;j++){ record[i][j-1]=rs.getString(j); //第i條記錄,放入二維數組的第i行 } i++; } con.close(); } catch(SQLException e) { System.out.println("請輸入正確的表名"+e); } } }
import javax.management.Query;
import javax.swing.*;
public class test2 {
public static void main (String args[]) {
String [] tableHead;
String [] content;
JTable table;
JFrame win= new JFrame();
Query findRecord = new Query();
findRecord.setDatabaseName(args[0]);
findRecord.setSQL("select * from "+args[1]);
content = findRecord.getRecord();
tableHead=findRecord.getColumnName();
table = new JTable(content,tableHead);
win.add(new JScrollPane(table));
win.setBounds(12,100,400,200);
win.setVisible(true);
win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
20165301第八周課下作業