• 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());
            }
        }
    
  • 相关阅读:
    Web 安全 —— XSS攻击的原理
    HTTP缓存
    JavaScript 事件循环机制(Event Loop)
    搭建前端监控系统
    电脑 直接下载cyida deb
    基于样例的传统图像修补算法实现
    Android WorkManager 定时任务
    Android WorkManager工作约束,延迟与查询工作
    微信小程序地图如何显示附近厕所WC步行路线
    物流解决方案再添利器 腾讯位置服务推出货运“三件套”
  • 原文地址:https://www.cnblogs.com/nieaojie625/p/13266268.html
Copyright © 2020-2023  润新知