zoukankan      html  css  js  c++  java
  • 课下作业(选做)第八周

    课下作业(选做)第八周

    课上内容补做:

    由于我的电脑之前始终不能连接上数据库,无法通过http://localhost来进入,总是显示服务器被拒绝,导致当时我没能做出。后来,查阅了许多资料并在王老师的帮助下,更改了端口、设置等之后,才可以进入数据库并进行操作。但后来在运行代码的过程中,我的电脑只能通过MySQL管理软件进行一些执行,运行其他的就又会有如图错误提示,这个错误是空指针的意思,我的理解是无法连接到数据库,没有解决,只能用同学的电脑来完成。

    相关知识点:

    第一道道题用到的知识点主要是一些操作,就是xampp的安装、MySQL客户端管理工具的安装与使用和在IDEA中配置驱动mysql-connector-java-5.1.41-bin.jar。配置驱动和加入junit.jar的操作类似,配置好即可。第二道题设计的是在数据库中进行寻找、比较、求和的知识。

    第二题代码:
    test1:

    import java.sql.*;
    public class test1 {
        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/world?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 city"); //查询mess表
                while(rs.next()) {
                    int id=rs.getInt(1);
                    String name=rs.getString(2);
                    String countrycode=rs.getString(3);
                    String district=rs.getString(4);
                    int population=rs.getInt(5);
                    if(population>8016520){    //20165206
                        System.out.printf("%d	",id);
                        System.out.printf("%s	",name);
                        System.out.printf("%s	",countrycode);
                        System.out.printf("%s	",district);
                        System.out.printf("%d
    ",population);
                    }
                }
                con.close();
            }
            catch(SQLException e) {
                System.out.println(e);
            }
        }
    }
    
    

    test2:

    import java.sql.*;
    public class test2 {
        public static void main(String [] args) {
            Connection con=null;
            Statement sql;
            ResultSet rs;
            String sqlStr = "select * from country where Region = 'Middle East'";
            try{  Class.forName("com.mysql.jdbc.Driver"); //加载JDBC_MySQL驱动
            }
            catch(Exception e){}
            String uri = "jdbc:mysql://localhost:3306/world?useSSL=true";
            String user ="root";
            String password ="";
            try{
                con = DriverManager.getConnection(uri,user,password); //连接代码
            }
            catch(SQLException e){ }
            try {
                sql=con.createStatement();
                rs = sql.executeQuery(sqlStr);
                int sum=0;
                while(rs.next()) {
                    int population=rs.getInt(7);
                    sum =sum+population;
                }
                System.out.printf("中东国家的总人口为:"+sum);
                con.close();
            }
            catch(SQLException e) {
                System.out.println(e);
            }
        }
    }
    
    

    test3:

    import java.sql.*;
    public class test3 {
        public static void main(String [] args) {
            Connection con=null;
            Statement sql;
            ResultSet rs;
            float smzd=1000.0f,smzc=0.0f;
            String c=new String("");
            String d=new String("");
            String sqlStr =
                    "select * from country order by LifeExpectancy";
            try{  Class.forName("com.mysql.jdbc.Driver"); //加载JDBC_MySQL驱动
            }
            catch(Exception e){}
            String uri = "jdbc:mysql://localhost:3306/world?useSSL=true";
            String user ="root";
            String password ="";
            try{
                con = DriverManager.getConnection(uri,user,password); //连接代码
            }
            catch(SQLException e){ }
            try {
                sql=con.createStatement();
                rs = sql.executeQuery(sqlStr);
                while(rs.next()) {
                    String Name=rs.getString(2);
                    Float LifeExpectancy=rs.getFloat(8);
                    if(LifeExpectancy>smzc) {
                        smzc =LifeExpectancy;
                        c =Name;
                    }
                    else if(LifeExpectancy<smzd){
                        {
                            smzd = LifeExpectancy;
                            d = Name;
                        }
                    }
    
                }
                con.close();
                System.out.printf("世界上平均寿命最长的国家为:"+c+",平均寿命为:"+smzc+"
    ");
                System.out.printf("世界上平均寿命最短的国家为:"+d+",平均寿命为:"+smzd+"
    ");
            }
            catch(SQLException e) {
                System.out.println(e);
            }
        }
    }
    
    

    运行截图:

    在Navicat for MySQL 中添加数据并修改,在idea中运行就可以了。

    导入world.sql,提交导入成功的截图。

    查询世界上超过8016520的所有城市列表的运行截图:

    查询世界上的所有中东国家的总人口的运行截图:

    查询世界上的平均寿命最长和最短的国家的运行截图:

    代码分析:

    • 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()) {   //读取数据
                 String number=rs.getString(1);
                 String name=rs.getString(2);
                 Date date=rs.getDate(3);
                 float height=rs.getFloat(4);
                 System.out.printf("%s	",number);
                 System.out.printf("%s	",name);
                 System.out.printf("%s	",date); 
                 System.out.printf("%.2f
    ",height);        
              }
              con.close();
          }
          catch(SQLException e) { 
             System.out.println(e);
          }
      }
    }
    

    这段代码的功能是查询students数据库中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 ");
              //根据参数ResultSet.TYPE_SCROLL_SENSITIVE和ResultSet.CONCUR_READ_ONLY的情况,sql返回相应类型的结果集
              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	",number);
                 System.out.printf("%s	",name);
                 System.out.printf("%s	",date); 
                 System.out.printf("%.2f
    ",h);
              }
              con.close();
          }
          catch(SQLException e) { 
             System.out.println(e);
          }
      }
    }
    

    Example11_2的功能是随机查询students数据库mess表中的2条记录。

    • 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:若出生的年份在2000年或者2000年之前,月份在7月之后
          String c2=" name Like '张_%'";
          //条件2:学生姓张
          String c3=" height >1.65";
          //条件3:身高大于1.65
          String sqlStr =
          "select * from mess where "+c1+" and "+c2+" and "+c3+"order by birthday";
          //通过where查找和通过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	",number);
                 System.out.printf("%s	",name);
                 System.out.printf("%s	",date); 
                 System.out.printf("%.2f
    ",height);
              }
              con.close();
          }
          catch(SQLException e) { 
             System.out.println(e);
          }
      }
    }
    

    这段代码的功能是查询mess表中姓张,身高大于1.65,出生的年份在2000年或者2000年之前,月份在7月之后的学生,并按照出生日期排序。

    • 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;
          //通过insert into mess values语句进行插入记录
          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	",number);
                 System.out.printf("%s	",name);
                 System.out.printf("%s	",date); 
                 System.out.printf("%.2f
    ",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(?,?,?,?)";
          //在对SQL进行预处理时可以使用通配符?来代替字段的值
          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	",number);
                 System.out.printf("%s	",name);
                 System.out.printf("%s	",date); 
                 System.out.printf("%.2f
    ",height);
              }
              con.close();
          }
          catch(SQLException e) { 
             System.out.println("记录中number值不能重复"+e);
          }
      }
    }
    
    

    这段代码的功能是使用预处理语句向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); 
          //表格JTable
          win.add(new JScrollPane(table));
          win.setBounds(12,100,400,200);
          win.setVisible(true); 
          win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       }
    }
    
    

    这段代码的功能是将数据库的名字以及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;  //R1001的height的值减少n
                h2 = h2+n;  //将减少的n增加到字段是R1002的height上
                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){}
             }
        }
    }
    

    这段代码的功能是进行事物处理,将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+"	");
                float score=rs.getFloat(2);
                System.out.println(score);
             }
             con.close();
          } 
          catch(SQLException e) {
              System.out.println(e);  
          }
      }
    }
    

    这段代码的功能是使用Derby数据库管理系统创建了名为students的数据库,并在数据库中建立了chengji表。

    第十一章的编程题目

    • test1
    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	",number);
                    System.out.printf("%s	",name);
                    System.out.printf("%s	",date);
                    System.out.printf("%.2f
    ",height);
                }
                con.close();
            }
            catch(SQLException e) {
                System.out.println(e);
            }
        }
    }
    
    • GetDBConnection
    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;
       }
    }
    
    

    -Query

    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);
          }
       }    
    }
    
    • test2
    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);
        }
    }
    
  • 相关阅读:
    Educational Codeforces Round 88 (Rated for Div. 2) D. Yet Another Yet Another Task(枚举/最大连续子序列)
    Educational Codeforces Round 88 (Rated for Div. 2) A. Berland Poker(数学)
    Educational Codeforces Round 88 (Rated for Div. 2) E. Modular Stability(数论)
    Educational Codeforces Round 88 (Rated for Div. 2) C. Mixing Water(数学/二分)
    Codeforces Round #644 (Div. 3)
    Educational Codeforces Round 76 (Rated for Div. 2)
    Educational Codeforces Round 77 (Rated for Div. 2)
    Educational Codeforces Round 87 (Rated for Div. 2)
    AtCoder Beginner Contest 168
    Codeforces Round #643 (Div. 2)
  • 原文地址:https://www.cnblogs.com/brs666/p/8886745.html
Copyright © 2011-2022 走看看