zoukankan      html  css  js  c++  java
  • java使用原生MySQL实现数据的增删改查以及数据库连接池技术

    一、工具类及配置文件准备工作

    1.1 引入jar包

    使用原生MySQL,只需要用到MySQL连接的jar包,maven引用方式如下:

           <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.48</version>
            </dependency>

    1.2 jdbc.properties文件配置

    在resources文件夹根目录,新增jdbc.properties配置文件,内容如下:

    driver=com.mysql.jdbc.Driver
    url=jdbc:mysql://localhost:3306/mydb
    user=root
    password=123456

    1.3 JDBCUtils工具类

    在java文件夹中新增 util --> JDBCUtils.java 类,该类中获取jdbc.properties中的值。

    JDBCUtils工具类主要作用是简化获取MySQL配置文件、关闭资源。

        private static String url;
        private static String user;
        private static String password;
    
        static {
            Properties properties = new Properties();
            try {
                properties.load(Mytest.class.getClassLoader().getResourceAsStream("jdbc.properties"));
                url = properties.getProperty("url");
                user = properties.getProperty("user");
                password = properties.getProperty("password");
                Class.forName(properties.getProperty("driver"));
            } catch (IOException | ClassNotFoundException e) {
                e.printStackTrace();
            }
        }
        // 1.获取jdbc.properties配置文件中的数据库连接
        public static Connection getConnection() throws SQLException {
            return DriverManager.getConnection(url, user, password);
        }
        // 5.定义关闭资源的方法
        public static void close(Connection conn, Statement stmt, ResultSet rs) {
            if (rs != null) {
                try {
                    rs.close();
                } catch (SQLException e) {}
            }
            if (stmt != null) {
                try {
                    stmt.close();
                } catch (SQLException e) {}
            }
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {}
            }
        }
        public static void close(Connection conn, Statement stmt) {
            close(conn, stmt, null);
        }

    二、原生MySQL实现增删改查

    2.1 语法说明 

    1、通过Connection获取数据库连接对象;

    2、定义sql语句(一般可以在Navicat中直接执行);

    3、通过获取执行sql的对象 --PreparedStatement;

    4、执行sql语句:增删改使用conn的executeUpdate方法(成功返回值为int=1),查询使用executeQuery方法(返回值为ResultSet,建议使用下文的查询方法操作);

    5、释放资源(执行SQL时定义的stmt、获取连接时的conn)。

    2.2 新增数据 -- insertUser()

    在java文件夹中新增MyService.java类,将获取数据库连接抽取出来,方法如下:

        private Connection conn;
        {
            try {
                conn = JDBCUtils.getConnection();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

    在MyService.java类中新增 insertUser方法,具体如下

    String sql = "INSERT INTO user values (4, '腾讯科技', 'xinfeng37812', '2009-11-16', '广东省深圳市')";
    PreparedStatement  stmt = conn.prepareStatement(sql);
    int count = stmt.executeUpdate(sql);
    JDBCUtils.close(conn, stmt);
    return count;

    2.2 修改数据 -- updateById()

    String sql = "update user set password = 567875 where id = 2";
    PreparedStatement stmt = conn.prepareStatement(sql);
    int count = stmt.executeUpdate(sql);
    JDBCUtils.close(conn, stmt);
    return count;

    2.3 删除数据 -- deleteUser()

    String sql = "delete from user where id = 5";
    PreparedStatement  stmt = conn.prepareStatement(sql);
    int count = stmt.executeUpdate(sql);
    JDBCUtils.close(conn, stmt);
    return count;

    2.4 查询数据 -- findAll()

    前提:新建 entity --> User.java 实体类,并获取getter&setter、toSting方法;

            String sql = "select * from user";
            PreparedStatement stmt = conn.prepareStatement(sql);
            ResultSet count = stmt.executeQuery(sql);
            User user = null;
            List<User> arr = new ArrayList<>();
            while(count.next()){
                Long id = count.getLong("id");
                String username = count.getString("username");
                String password = count.getString("password");
                Date birthday = count.getDate("birthday");
                String address = count.getString("address");
                user = new User();
                user.setId(id);
                user.setUsername(username);
                user.setPassword(password);
                user.setBirthday(birthday);
                user.setAddress(address);
                arr.add(user);
            }
            JDBCUtils.close(conn, stmt, count);
            return arr;

    三、原生MySQL语句的缺点及数据库连接池

    3.1 原生MySQL语句的缺点

    1、每一次查询都要新增通道,关闭通道,效率太低。实际项目中都会用数据库连接池进行优化;

    2、实际项目中使用最多的就是查询,但是将查询的ResultSet结果,进行封装的代码过于臃肿。

    3.2 c3p0和druid连接池技术

    数据库连接池其实就是一个容器,在java中,使用getConnection方法代替Connection,实现节约资源,用户访问高效目的,但是代码本身与原生并无本质的减少。

    3.2.1 c3p0使用

    需要导入两个jar包,maven引用方式如下:

    <dependency>
        <groupId>com.mchange</groupId>
        <artifactId>c3p0</artifactId>
        <version>0.9.5.5</version>
    </dependency>
    <dependency>
        <groupId>com.mchange</groupId>
        <artifactId>mchange-commons-java</artifactId>
        <version>0.2.15</version>
    </dependency>

    配置文件必须在resources文件夹根目录,且名称必须为 c3p0.properties 或者 c3p0-config.xml,因此无需手动加载配置文件:

     //1.创建数据库连接池对象
    DataSource ds  = new ComboPooledDataSource();
    //2. 获取连接对象
    Connection conn = ds.getConnection();

    3.2.2 druid使用

    只需要一个jar包,maven引入方式如下:

    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid-spring-boot-starter</artifactId>
        <version>1.1.9</version>
    </dependency>

    配置文件名称任意,但需要是.properties形式的,因此需要获取配置文件位置,具体使用方式如下:

    //1.加载配置文件
    Properties pro = new Properties();
    InputStream is = DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties");
    pro.load(is);
    //2.获取连接池对象
    DataSource ds = DruidDataSourceFactory.createDataSource(pro);
    //3.获取连接
    Connection conn = ds.getConnection();

    3.3 JDBCUtils工具类的改造

    以使用druid为例,在使用数据库连接池时的工具类,主要有三种方法:

    1. 获取连接方法:通过数据库连接池获取连接
    2. 释放资源
    3. 获取连接池的方法

    public class JDBCUtils {
      private static DataSource ds;
      static {
        try {
          Properties pro = new Properties();
          pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
          ds = DruidDataSourceFactory.createDataSource(pro);
        } catch (IOException e) {
          e.printStackTrace();
        } catch (Exception e) {
          e.printStackTrace();
        }
      }
    
      public static Connection getConnection() throws SQLException {
        return ds.getConnection();
      }
    
      public static void close(Statement stmt, Connection conn) {
        close(null, stmt, conn);
      }
    
      public static void close(ResultSet rs, Statement stmt, Connection conn) {
        if (rs != null) {
          try {
            rs.close();
          } catch (SQLException e) {
            e.printStackTrace();
          }
        }
        if (stmt != null) {
          try {
            stmt.close();
          } catch (SQLException e) {
            e.printStackTrace();
          }
        }
        if (conn != null) {
          try {
            conn.close();// 归还连接
          } catch (SQLException e) {
            e.printStackTrace();
          }
        }
      }
    
      public static DataSource getDataSource() {
        return ds;
      }
    }
  • 相关阅读:
    剔除list中相同的结构体数据
    API Gateway微服务
    Webpack vs Gulp
    客服系统
    利用 istio 来对运行在 Kubernetes 上的微服务进行管理
    微服务环境搭建
    简易的开发框架(微服务) Asp.Net Core 2.0
    Istio官方文档中文版
    Hangfire Net Core2
    IIS7性能优化
  • 原文地址:https://www.cnblogs.com/fanbao/p/12331827.html
Copyright © 2011-2022 走看看