JDBC连接数据库和改进

一、原生jdbc连接数据库

使用最原始的方法连接数据库,步骤如下:

  1. 注册驱动
  2. 获得连接对象
  3. 获得执行语句的平台对象
  4. 执行sql语句
  5. 处理结果
  6. 释放连接
//1.注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");	//数据库版本是8.0.15
//2.获得连接对象,url,数据库用户名,数据库密码
Connection conn =
    DriverManager.getConnection("jdbc:mysql://localhost:3306/test?serverTimezone=UTC",
                                "root", "root");
//3.获得执行语句的平台对象
PreparedStatement ps = conn.prepareStatement("insert into stu values (5,'张三')");
//4.执行sql语句
int i = ps.executeUpdate();
//5.处理结果
if (i > 0) {
    System.out.println("添加成功!");
} else {
    System.out.println("添加失败!");
}
//释放连接
if (ps != null) {
    ps.close();
}
if (conn != null) {
    conn.close();
}

二、将原生jdbc封装成DBUtil

封装成DBUtil

public class DBUtil {
    //声明url,user,password
    private static String url = "jdbc:mysql:///test?serverTimezone=UTC";
    private static String user = "root";
    private static String password = "root";

    //1.注册驱动
    static{
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    //2.获取数据库连接
    public static Connection getConnection(){
        Connection connection=null;
        try {
            connection = DriverManager.getConnection(url, user, password);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return connection;
    }

    //3.释放资源,传入参数rs:结果集对象,没有则传入null,ps:执行sql语句的平台对象,conn:连接对象
    public static void close(ResultSet rs, PreparedStatement  ps,Connection conn){
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (ps != null) {
            try {
                ps.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

在外部调用DBUtil。

    public static void main(String[] args) throws SQLException, ClassNotFoundException {
        Connection connection = DBUtil.getConnection();
        PreparedStatement ps = connection.prepareStatement("select * from stu");
        ResultSet rs = ps.executeQuery();
        while (rs.next()) {
            int sid = rs.getInt("sid");
            String sname = rs.getString("sname");
            System.out.println("学号:" + sid + "  姓名:" + sname);
        }
        DBUtil.close(rs, ps, connection);
    }
}

三、使用Apache提供的DBUtils

进一步改进原生jdbc.

DbUtils(org.apache.commons.dbutils.DbUtils)是Apache组织提供的一个对JDBC进行简单封装的开源工具类库,使用它能够简化JDBC应用程序的开发,同时也不会影响程序的性能。DbUtils类主要负责装载驱动、关闭连接的常规工作。

步骤:

  1. 注册驱动。
  2. 获得Connection连接对象。
  3. 获得执行sql语句的QueryRunner对象。
  4. 执行sql语句。
  5. 处理结果。
  6. 释放资源。

其中ResultSetHandler接口(org.apache.commons.dbutils.ResultSethandler)执行处理一个结果集对象,将数据转变并处理为任何一种形式,供其他应用使用。实现类如下:

常用的结果集对象,只需要记住三个:

  • BeanHandler,将查询结果集中的第一条记录封装到指定的JavaBean中,sql语句中的查询条件只能获取到唯一的一条记录时,使用此结果集对象!
  • BeanListHandler,将查询结果集中的每一条记录都封装成JavaBean,并将这些JavaBean对象放入List集合中
  • ScalarHandler,专门用于封装聚合函数得到的结果,也就是查询的结果为单一的数据。
	@Test
    public void test1() throws ClassNotFoundException, SQLException {
        //1.注册驱动
        Class.forName("com.mysql.cj.jdbc.Driver");
        //2.获得连接对象
        Connection conn =
                DriverManager.getConnection("jdbc:mysql://localhost:3306/test?serverTimezone=UTC",
                        "root", "root");
        //3.获得执行sql语句的QueryRunner对象
        QueryRunner runner=new QueryRunner();
        String sql = "select * from stu";
        //4.执行sql语句
        List<Student> studentList = runner.query(conn,sql, new BeanListHandler<Student>(Student.class));
        //5.处理结果
        for (Student student : studentList) {
            System.out.println(student.toString());
        }
        //6.释放资源
        DbUtils.close(conn);
    }

四、使用DBUtils + Druid (推荐)

数据库连接池技术,在java程序中,有三个比较常用:c3p0、dbcp、druid(阿里)

个人建议:如果从代码性能角度出发,建议使用druid或者dbcp

如果代码的简洁性角度出发,建议使用c3p0,但是其有个毛病,就是效率比较低.

1、导入连接池的包 druid-1.0.9.jar

2、将连接信息放置在druid.properties文件中

druid.properties

driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/test?serverTimezone=UTC
username=root
password=root

DruidUtils.java

public class DruidUtils {
    //声明数据源对象
    private static DataSource dataSource=null;
    //在静态代码块中初始化数据源
    static {
        try {
            //指定一个属性文件对象
            Properties properties=new Properties();
            //通过反射获取输入的文件流
            InputStream is = DruidUtils.class.getClassLoader().getResourceAsStream("druid.properties");
            //通过输入流读取到druid.properties配置文件中的连接信息
            //将读取到的信息加载到属性文件对象中
            properties.load(is);
            //通过属性文件对象获取连接池对象
            dataSource = DruidDataSourceFactory.createDataSource(properties);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static DataSource getDataSource() {
        return dataSource;
    }
}

测试:

	@Test
    public void test2() throws SQLException {
        QueryRunner runner = new QueryRunner(DruidUtils.getDataSource());
        String sql = "select * from stu";
        List<Student> studentList = runner.query(sql, new BeanListHandler<Student>(Student.class));
        for (Student student : studentList) {
            System.out.println(student.toString());
        }
    }
posted @ 2020-07-08 12:36  笑到不能自已  阅读(189)  评论(0编辑  收藏  举报