JDBC学习小结(一)

## JDBC学习小结 (一)###

一:什么是JDBC
JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。
JDBC结构图,它显示了驱动程序管理器方面的JDBC驱动程序和Java应用程序的位置
二:JDBC中主要设计的类与接口及其作用
JDBC API 提供的接口如下

  1. 列表内容
  2. 这里写图片描述
  3. 这里写图片描述
  4. 这里写图片描述
  5. 这里写图片描述
    三、在普通Java程序中实现数据库的连接的基本步骤
//数据库的连接信息
static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";  
static final String DB_URL = "jdbc:mysql://localhost:3306/example";
static final String USER = "root";
static final String PASS = "****";

Connection conn = null;
Statement stmt = null;
//注册驱动
Class.forName(JDBC_DRIVER);
//建立数据库的连接
conn = DriverManager.getConnection(DB_URL,USER,PASS);
stmt = conn.createStatement();
//编写sql语句
String sql = "SELECT NAME FROM `tbl_jxutcmeap_user` WHERE user_id='user20180226153614546'";
//执行查询
ResultSet rs =stmt.executeQuery(sql);
//处理结果
String name = null ;
   while(rs.next()){
    name= rs.getString("name");
    System.out.println(name);
   }
//关闭连接
rs.close();
stmt.close();
conn.close();

四、尝试封装自己的工具类

public class JdbcUtilImpl implements JdbcUtil {
    private Connection conn = null;
    private Statement stmt = null;
    private ResultSet rs =null;

    private void getConnection(){
        Properties prop = new Properties();
        try {
             InputStream in = new BufferedInputStream (new FileInputStream("D:\\java\\workspace\\TomcatTest\\WebContent\\jdbc.properties"));
             prop.load(in);     ///加载属性列表
             String driver = prop.getProperty("driver");
             String user = prop.getProperty("user");
             String pass = prop.getProperty("pass");
             String dbUrl = prop.getProperty("dbUrl");
             in.close();
             Class.forName(driver);
             conn = DriverManager.getConnection(dbUrl,user,pass);
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("get connection default......");
        }
    }

    @Override
    public void close(){
        try{
            if(null != rs)
                rs.close();
            if(null != stmt)
                stmt.close();
            if(null != conn)
                conn.close();
        }catch(Exception e){}

    }

    @Override
    public boolean update(String sql, Object... params) {
        getConnection();
        StringBuilder sb = new StringBuilder(sql);
        try {
            stmt = conn.createStatement();
            //处理sql 
            for(int i=0 ;i<params.length;i++){
                String param = params[i].toString();
                if(params[i] instanceof String){
                    param = "'"+param+"'";
                }
                int start = sb.indexOf("?");
                sb.replace(start, start+1, param);
            }
            int num =stmt.executeUpdate(sb.toString());
            close();
            if(num <=0){
                return false;
            } 
        } catch (Exception e) {
            e.printStackTrace();
            close();
            return false;
        }
        return true;
    }

    @Override
    public ResultSet query(String sql, Object... params) {
        getConnection();
        StringBuilder sb = new StringBuilder(sql);
        try{
            stmt = conn.createStatement();
            //处理sql 
            for(int i=0 ;i<params.length;i++){
                String param = params[i].toString();
                if(params[i] instanceof String){
                    param = "'"+param+"'";
                }
                int start = sb.indexOf("?");
                if(start==-1)
                    break;
                sb.replace(start, start+1, param);
            }
            ResultSet rs = stmt.executeQuery(sb.toString());
            return rs;
        }catch(Exception e){
            System.out.println(e.getMessage());
        }
        return rs;
    }

}

五、对在封装工具类中遇到的问题的总结

  • 首先是代码的优化:如建立连接过程中加载配置文件数据的部分代码可以使用静态代码块进行加载,这部分内容一般不会变,只需在加载类的时候执行一次即可。
  • 同时加载配置文件(.properties)可以使用ResourceBundle类来加载(注意:使用ResourceBundle读取配置文件,默认要把配置文件放在classpath下(默认的src目录下))
    将代码调整如下:
private static String driver; // 驱动
    private static String dbUrl;
    private static String user;
    private static String pass;

    static{
        ResourceBundle buldle = ResourceBundle.getBundle("jdbc");
        driver = buldle.getString("driver");
        user = buldle.getString("user");
        pass = buldle.getString("pass");
        dbUrl = buldle.getString("dbUrl");
    }
  • 执行的SQL语句中出现中文导致语句执行失败
    解决的办法:在dburl后加上?useUnicode=true&characterEncoding=utf8
driver=com.mysql.jdbc.Driver
dbUrl=jdbc:mysql://127.0.0.1:3306/example?useUnicode=true&characterEncoding=utf8
user=root
pass=****

未完待续。。。

猜你喜欢

转载自blog.csdn.net/zhangsuhua0702/article/details/81252819