黑马程序员技术交流社区

标题: 【成都校区】JDBC部分的面试题及练习题一道 [打印本页]

作者: meikoYang    时间: 2018-12-11 13:51
标题: 【成都校区】JDBC部分的面试题及练习题一道
JDBC部分的面试题,
1.JDBC操作数据库的步骤 ?


1.注册数据库驱动。

2.建立数据库连接。

3.创建一个Statement。

4.执行SQL语句。

5.处理结果集。

6.关闭数据库连接。


2.JDBC中的Statement 和PreparedStatement的区别?


PreparedStatement是预编译的SQL语句,效率高于Statement。

PreparedStatement支持?操作符,相对于Statement更加灵活。

PreparedStatement可以防止SQL注入,安全性高于Statement。



3.JDBC中大数据量的分页解决方法?



最好的办法是利用sql语句进行分页,这样每次查询出的结果集中就只包含某页的数据内容。

sql语句分页,不同的数据库下的分页方案各不一样,
下面是主流的三种数据库的分页sql:


oracle:

        select * from
(select *,rownum as tempid from student )  t
where t.tempid between ” + pageSize*(pageNumber-1) + ” and ” + pageSize*pageNumber



mysql:
    select * from students limit ” + pageSize*(pageNumber-1) + “,” + pageSize;



sql server:
    select top ” + pageSize + ” * from students where id not in +
(select top ” + pageSize * (pageNumber-1) +  id from students order by id) +  
“order by id;




4.说说数据库连接池工作原理和实现方案?



工作原理:JAVA EE服务器启动时会建立一定数量的池连接,并一直维持不少于此数目的池连接。
客户端程序需要连接时,池驱动程序会返回一个未使用的池连接并将其表记为忙。
如果当前没有空闲连接,池驱动程序就新建一定数量的连接,新建连接的数量有配置参数决定。
当使用的池连接调用完成后,池驱动程序将此连接表记为空闲,其他调用就可以使用这个连接。  


实现方案:返回的Connection是原始Connection的代理,代理Connection的close方法,
当调用close方法时,不是真正关连接,而是把它代理的Connection对象放回到连接池中,
等待下一次重复利用。


赋练习题一道:

//          JDBC练习实例(实现注册登录等增删改查)

//        问题描述:流程如下,先登录,登录成功后显示操作界面,根据界面的提示,执行注册,修改,删除,查询的功能
//        1、实现用户的注册功能
//        2、实现用户的登陆功能
//        3、实现用户的修改,但要考虑用户是否真实存在
//        4、实现用户的删除功能。
//        5、实现用户的查询功能,查询全部及根据userName名去查询




代码实现方法一:(仅供参考):
package jdbcxiti_1;
   
   import java.sql.Connection;
   import java.sql.DriverManager;
   import java.sql.SQLException;
   import java.sql.Statement;
   import java.util.Scanner;
   import java.sql.PreparedStatement;
   import java.sql.ResultSet;
  
  public class text_1 {
  
      public static void main(String[] args) {
          // TODO Auto-generated method stub
           Scanner sc=new Scanner(System.in);
           String name,pass;
           person ob=new person();
           //注册
           System.out.println("输入要注册的用户名");
           name=sc.nextLine();
           System.out.println("输入要注册的密码");
           pass=sc.nextLine();
           ob.register(name, pass);
                  //登录
              System.out.println("输入登录用户名");
                 name=sc.nextLine();
              System.out.println("输入登录密码");
              pass=sc.nextLine();
              ob.login(name, pass);
           //修改
        System.out.println("输入修改用户名");
         String a=sc.nextLine();
         System.out.println("输入修改密码");
         String b=sc.nextLine();
        ob.update(a, b);
          //显示
        ob.show();
  }
  }
  class person{
      String name;
      String password;
      boolean islogin=false;
      
      void register(String name,String password)//用户注册
      {                  //1、连接
           try (Connection con=DriverManager.getConnection("jdbc:mysql://localhost:3306/test","数据库用户名","数据库密码");){
                         //sql语句
               String sql="insert into t_user(username,pwd) values (?,?)";
                  //2、声明(PrepareStatement是Statement类的子类,解决了sql注入问题
               PreparedStatement ps=con.prepareStatement(sql);
               ps.setString(1, name);
               ps.setString(2, password);
                 //3、执行
               ps.execute();
                //4、关闭
               ps.close();
              
          } catch (SQLException e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
          }
     }
      void login(String name,String password)//用户登录
      {
           try (Connection con=DriverManager.getConnection("jdbc:mysql://localhost:3306/test","数据库用户名","数据库密码");){
               String sql="select * from t_user where username=? and pwd=?";
               PreparedStatement ps=con.prepareStatement(sql);
               ps.setString(1, name);
               ps.setString(2, password);
               ps.execute();
               ResultSet re=ps.getResultSet();
               if(re.next())
               {
                   this.name=name;
                   this.password=password;
                   islogin=true;
                   System.out.println("登陆成功,欢迎"+name);
               }else
               {
                   System.out.println("用户名或密码错误!");
               }
               re.close();
              ps.close();
            
          } catch (SQLException e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
          }
      }
      
      void update(String a,String b)//更改用户名或密码
      {   if(islogin)
       {   
          try (Connection con=DriverManager.getConnection("jdbc:mysql://localhost:3306/test","数据库用户名","数据库密码");){
              String sql="update t_user set username=?,pwd=? where username=? and pwd=?";
             PreparedStatement ps=con.prepareStatement(sql);
             ps.setString(1, a);
             ps.setString(2, b);
            ps.setString(3, name);
            ps.setString(4, password);
             ps.execute();
             System.out.println("修改成功");
             ps.close();
             this.name=a;
             this.password=b;
         } catch (SQLException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         }
      }else
     {
         
     }
     
     }
     void show() //用户名及密码列表显示
     {
         try (Connection con=DriverManager.getConnection("jdbc:mysql://localhost:3306/test","数据库用户名","数据库密码");){
                Statement start=con.createStatement();
                ResultSet re=start.executeQuery("select * from t_user");
                String a,b;
                while(re.next()){
                    a=re.getString(2);
                    b=re.getString(3);
                    System.out.println("name:"+a+" password:"+b);
                }
                re.close();
                start.close();
         } catch (SQLException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         }
     }
     void delete()  //删除用户
     {
         if(islogin)
          {   
             try (Connection con=DriverManager.getConnection("jdbc:mysql://localhost:3306/test","数据库用户名","数据库密码");){
                 String sql="delete from t_user where username=? and pwd=?";
                 PreparedStatement ps=con.prepareStatement(sql);
                 ps.setString(1, name);
                ps.setString(2, password);
                 ps.execute();
                 System.out.println("删除成功");
                 ps.close();
                 islogin=false;
             } catch (SQLException e) {
                 // TODO Auto-generated catch block
                 e.printStackTrace();
             }
          }else
         {
            
         }
         
     }
}

方法二:


package cn.itcast.JDBCday02;

import org.springframework.jdbc.core.JdbcTemplate;

import javax.sql.DataSource;
import java.sql.*;
import java.util.List;
import java.util.Map;
import java.util.Scanner;

public class JDBCTest1 {
    public static void main(String[] args) {
        //JDBC练习实例(实现注册登录等增删改查)
//        问题描述:流程如下,先登录,登录成功后显示操作界面,根据界面的提示,执行注册,修改,删除,查询的功能
        Scanner sc = new Scanner(System.in);
        String usm,psw;
//        1、实现用户的注册功能,如果用户被注册了,则需要重新注册新用户;
        System.out.println("请先注册账号");
        System.out.println("请输入用户名:");
        usm = sc.nextLine();
        System.out.println("请输入密码:");
        psw = sc.nextLine();
        register(usm,psw);

//        2、实现用户的登陆功能
        System.out.println("请输入用户名");
        usm = sc.nextLine();
        System.out.println("请输入密码");
        psw = sc.nextLine();
        login(usm,psw);

        System.out.println("输入修改的用户名");
        String xgusm = sc.nextLine();
        System.out.println("输入修改的密码");
        String xgpsw = sc.nextLine();
        changeUser(xgusm,xgpsw);

        show();
        delete();

    }
//  注册用户
    public static void register(String usm,String psw){
        DataSource ds = JDBCUtils.getDataSource();//连接池中获取对象,JDBCUtils是自己写的工具类
        Connection conn = null;
        PreparedStatement pstmt = null;
        try {
            conn = ds.getConnection();//连接数据库
            String sql1 = "select * from t_user where username = ? and password = ?";
            pstmt = conn.prepareStatement(sql1);
            pstmt.setString(1,usm);
            pstmt.setString(2,psw);
            System.out.println("恭喜你,注册成功。请输入用户名和密码登录");
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            JDBCUtils.close(pstmt,conn);
        }
    }
    //  用户登录
    public static void login(String usm,String psw){
        DataSource ds = JDBCUtils.getDataSource();
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;

        try {
            conn = ds.getConnection();
            String sql = "SELECT * FROM t_user WHERE username = ? AND password = ?";
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1,usm);
            pstmt.setString(2,psw);
            rs = pstmt.executeQuery();
            if (rs.next()){
                System.out.println("登录成功");
            }else {
                System.out.println("登录失败,用户名或者密码错误");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            JDBCUtils.close(pstmt, conn, rs);
        }

    }
    //        3、实现用户的修改,但要考虑用户是否真实存在
    public static void changeUser(String xgusm,String xgpsw){
        DataSource ds = JDBCUtils.getDataSource();
        Connection conn = null;
        ResultSet rs = null;
        PreparedStatement pstmt = null;
        try {
            conn = ds.getConnection();
            String sql2 = "update t_user set username = ?, password = ? where id = ?";
            pstmt = conn.prepareStatement(sql2);
            pstmt.setString(1,xgusm);
            pstmt.setString(2,xgpsw);
            pstmt.setInt(3,3);
            int count = pstmt.executeUpdate();
            if (count > 0){
                System.out.println("修改成功");
            }else {
                System.out.println("修改失败");
            }

        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            JDBCUtils.close(pstmt, conn, rs);
        }
    }
    //        5、实现用户的查询功能,查询全部及根据userName名去查询
    public static void show(){
        DataSource ds = JDBCUtils.getDataSource();
        //这里用更简单的Spring JDBC template 来做
        JdbcTemplate template = new JdbcTemplate(ds);
        String sql3 = "select * from t_user";
        // 查询对象 ,将其封装为list集合
        List<Map<String, Object>> maps = template.queryForList(sql3);
        for (Map<String, Object> map : maps) {
            System.out.println("查询全部:"+map);
        }
        String sql4 = "select * from t_user where username = ?";
        Map<String, Object> som = template.queryForMap(sql4,"jack");
        System.out.println("根据username查询:"+som);
    }
    //       4、实现用户的删除功能。
    public static void delete(){
        DataSource ds = JDBCUtils.getDataSource();
        JdbcTemplate template = new JdbcTemplate(ds);
        String sql5 = "delete from t_user where username = ?,password = ?";

        int count = template.update(sql5,"grace","grace123");
        if (count>0){
            System.out.println("删除成功");
        }else{
            System.out.println("删除失败");
        }
    }
}


---------------------





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2