4.1 jdbc

回顾一下java的jdbc例子。这是类配置了数据库的地址、账号、密码,然后提供了一个函数getCon,进行数据库连接。getCon的操作就好像网站登录输入网址、账号、密码一样。
import java.sql.Connection;
import java.sql.SQLException;
public class DBConfig{
    public static String DB_URL="jdbc:mysql://localhost/javaidc_jssp?characterEncoding=utf-8";
    public static String DB_USER="root";
    public static String DB_PSW="123456";
    public static Connection getCon(){
        try{
            Class.forName("com.mysql.jdbc.Driver").newInstance();
        }
        catch(ClassNotFoundException e){
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        catch(InstantiationException e){
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        catch(IllegalAccessException e){
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        Connection con=null;
        try{
            con=java
                .sql
                .DriverManager
                .getConnection(DBConfig
                .DB_URL,DBConfig.DB_USER,DBConfig.DB_PSW);
        }
        catch(SQLException e){
            System.out.println("连接失败");
            e.printStackTrace();
        }
        return con;
    }
}
先来看看地址jdbc:mysql://localhost/testDB?characterEncoding=utf-8,这里面mysql是要连接的数据库类型,如果连的是oracle,那前面就是jdbc:oracle。接下来是数据库所在的域名或ip地址,这个localhost表面数据库在本机,在开发的过程中一般都是这样,然后是数据库的名字testDB,最后的characterEncoding=utf-8是为了支持数据库里的中文,没有它可能会导致乱码。 数据库的账号和密码不多讲,这三个静态属性,在getCon里面会被使用到。 至于getCon() 方法内部,现在完全可以不深究。只需要知道这个方法会得到一个Connection对象,这个对象表示和数据库的一个连接。 接下来,我们在使用这个连接,执行一个sql查询语句:
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class UserData{
    public static boolean userValidate(String userName,String psw){
        String pswFromDB="";
        // 要执行的sql语句,通过字符串拼接出来
        String SQLTEXT="select password from user where userName = '"
            +userName+"'";
        try{
            //使用上面的DBConifg类的getCon方法,建立一个连接
            Connection con=DBConfig.getCon();
            //准备执行sql的实体
            Statement stmt=con.createStatement();
            //执行sql,并把查询结果赋给rst
            ResultSet rst=stmt.executeQuery(SQLTEXT);
            while(rst.next()){
                //查询结果,在这里是查询字段为password的值
                pswFromDB=rst.getString("password");
            }
            //后使用先关闭原则,关闭各个对象,特别是con如果不关闭,会造成连接泄露
            rst.close();
            stmt.close();
            con.close();
        }
        catch(SQLException e){
            e.printStackTrace();
        }
        if(pswFromDB.equals(psw)){
            //比较数据库查到的密码和参数传进来的密码是否相等
            return true;
        }
        return false;
    }
    //通过用户名查找昵称
    public static String getNicknameByUsername(String userName){
        String result="";
        // 要执行的sql语句,通过字符串拼接出来
        String SQLTEXT="select nickname from user where userName = '"
            +userName+"'";
        try{
            // 使用上面的DBConifg类的getCon方法,建立一个连接
            Connection con=DBConfig.getCon();
            // 准备执行sql的实体
            Statement stmt=con.createStatement();
            // 执行sql,并把查询结果赋给rst
            ResultSet rst=stmt.executeQuery(SQLTEXT);
            while(rst.next()){
                // 查询结果,在这里是查询字段为password的值
                result=rst.getString("nickname");
            }
            // 后使用先关闭原则,关闭各个对象,特别是con如果不关闭,会造成连接泄露
            rst.close();
            stmt.close();
            con.close();
        }
        catch(SQLException e){
            e.printStackTrace();
        }
        return result;
    }
    //通过角色查找用户
    public static List getUsernamesByRole(String role){
        List result=new ArrayList();
        // 要执行的sql语句,通过字符串拼接出来
        String SQLTEXT="select username from user where role = '"
            +role+"'";
        try{
            // 使用上面的DBConifg类的getCon方法,建立一个连接
            Connection con=DBConfig.getCon();
            // 准备执行sql的实体
            Statement stmt=con.createStatement();
            // 执行sql,并把查询结果赋给rst
            ResultSet rst=stmt.executeQuery(SQLTEXT);
            while(rst.next()){
                // 查询结果,在这里是查询字段为password的值
                String username=rst.getString("username");
                result.add(username);
            }
            // 后使用先关闭原则,关闭各个对象,特别是con如果不关闭,会造成连接泄露
            rst.close();
            stmt.close();
            con.close();
        }
        catch(SQLException e){
            e.printStackTrace();
        }
        return result;
    }
}
下面的情形,是用于查询一条记录,一条记录,需要一个Class文件来“装”,否则几个字段就是散的,并不是一个整体。
public class User{
    private String username;
    private String password;
    private String role;
    private String nickname;
    private String createDate;
    public String getUsername(){
        return username;
    }
    public void setUsername(String username){
        this.username=username;
    }
    public String getPassword(){
        return password;
    }
    public void setPassword(String password){
        this.password=password;
    }
    public String getRole(){
        return role;
    }
    public void setRole(String role){
        this.role=role;
    }
    public String getNickname(){
        return nickname;
    }
    public void setNickname(String nickname){
        this.nickname=nickname;
    }
    public String getCreateDate(){
        return createDate;
    }
    public void setCreateDate(String createDate){
        this.createDate=createDate;
    }
}
然后在UserData类后面,添加这个方法
public static User getUserByUsername(String username){
    User user=new User();
    // 要执行的sql语句,通过字符串拼接出来
    String SQLTEXT="select * from user where username = '"+username+"'";
    try{
        // 使用上面的DBConifg类的getCon方法,建立一个连接
        Connection con=DBConfig.getCon();
        // 准备执行sql的实体
        Statement stmt=con.createStatement();
        // 执行sql,并把查询结果赋给rst
        ResultSet rst=stmt.executeQuery(SQLTEXT);
        while(rst.next()){
            // 查询结果,在这里是查询字段为password的值
            user.setUsername(rst.getString("username"));
            user.setPassword(rst.getString("password"));
            user.setNickname(rst.getString("nickname"));
            user.setRole(rst.getString("role"));
            user.setCreateDate(rst.getString("create_date"));
        }
        // 后使用先关闭原则,关闭各个对象,特别是con如果不关闭,会造成连接泄露
        rst.close();
        stmt.close();
        con.close();
    }
    catch(SQLException e){
        e.printStackTrace();
    }
    return user;
}
//通过角色查找用户
public static List getUsersByRole(String role){
    // List result=new ArrayList ();
    // // 要执行的sql语句,通过字符串拼接出来
    // String SQLTEXT= "select username from user where role = '"+role+ "'";
    // try{
    // // 使用上面的DBConifg类的getCon方法,建立一个连接
    // Connection con=DBConfig.getCon();
    // // 准备执行sql的实体
    // Statement stmt=con.createStatement();
    // // 执行sql,并把查询结果赋给rst
    // ResultSet rst=stmt.executeQuery(SQLTEXT);
    // while(rst.next()){
    // // 查询结果,在这里是查询字段为password的值
    // String username=rst.getString( "username");
    // result.add(username);
    // }
    // // 后使用先关闭原则,关闭各个对象,特别是con如果不关闭,会造成连接泄露
    // rst.close();
    // stmt.close();
    // con.close();
    // }
    // catch(SQLException e){
    // e.printStackTrace();
    // }
    // return result;
    return null;
}