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; } }