如何通过java操作数据库
- Java DataBase Connectivity
- 在Java中用来规范如何访问关系型数据库,由各大数据库厂商去实现它
- 属于JavaSE的一部分
下载MySQL的JDBC实现 (jar, 驱动包)
- 8.0版本的驱动包同时支持MySQL5.7、8.0
- 下载地址
JDBC使用步骤
① 将Driver(驱动程序)注册到DriverManger(驱动程序管理者)
② 利用DriverManager创建Connection(数据库连接)
③ 利用Connection创建Statement(语句)
④ 利用Statement执行SQL语句
⑤ 关闭资源(关闭Statement、Connection等)
JDBC细节
- MySQL的url格式是
- jdbc : mysql : // IP地址:端口号/数据库名
- 比如 jdbc : mysql://localhost:3306/xmg
JDBC版本
- 从JDBC4.0开始,显式注册驱动程序是可选的
- 我们只需要将供应商的Jar放在类路径中,然后DriverManager就可以自动检测并加载驱动程序
JDBC版本
ResultSet executeQuery(String sql)
- 执行DQL语句
int executeUpdate(String sql)
boolean next ( )
- 让游标指向下一行,如果指向的这行有数据,就返回true,否则,返回false
XX getXX( int columnIndex)、 XX getXX( String columnLabel)
PreparedStatement接口继承自Statement接口
- 建议使用PreparedStatement替代Statement
- PreparedStatement的优点
- 可以防止SQL注入
- 执行速度比Statement快
- 支持批量处理
数据库连接池
- 数据库连接池,可以提高访问数据库的性能,负责创建、分配、管理和释放数据库连接
- 基本思想
- 在初始化时,创建一定数量的数据库连接对象存储在内存中
- 当需要访问数据库时,并非建立一个新的连接,而是从连接池中取出一个已创建的空闲连接对象
- 使用完毕后,用户也并非将连接关闭,而是将连接放回连接池中,以供下一个请求访问使用
- 当连接的空闲时间已经超过最大空闲时间时,将会释放掉该连接
- 可以通过设置参数来控制初始连接数、连接的上下限以及每个连接的最大使用次数、最大空闲时间
- 可以通过自身的管理机制来监视数据库连接的数量、使用情况
Java中常见的开源的数据库连接池
产自阿里巴巴,项目地址: https://github.com/alibaba/druid/
- jar包下载: https://mvnrepository.com/artifact/com.alibaba/druid ```java import com.alibaba.druid.pool.DruidDataSourceFactory; import javax.sql.DataSource; import java.io.InputStream; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.ArrayList; import java.util.List; import java.util.Properties;
public class Dbs { private static DataSource ds; static { try (InputStream is = Dbs.class.getClassLoader().getResourceAsStream(“druid.properties”)) { Properties properties = new Properties(); properties.load(is); ds = DruidDataSourceFactory.createDataSource(properties); } catch (Exception e) { e.printStackTrace(); } }
/*** 执行DDL、DML语句*/public static int update(String sql, Object ...args) {try {Connection conn = ds.getConnection();// 从数据库获取所有的客户数据try (PreparedStatement pstmt = conn.prepareStatement(sql)) {// 设置参数for (int i = 0; i < args.length; i++) {pstmt.setObject(i + 1, args[i]);}// 执行return pstmt.executeUpdate();}} catch (Exception e) {e.printStackTrace();return 0;}}public static <T> List<T> query(String sql, RowMapper<T> mapper, Object ...args) {if (mapper == null) return null;try {Connection conn = ds.getConnection();// 从数据库获取所有的客户数据try (PreparedStatement pstmt = conn.prepareStatement(sql)) {// 设置参数for (int i = 0; i < args.length; i++) {pstmt.setObject(i + 1, args[i]);}// 执行List<T> array = new ArrayList<>();try (ResultSet rs = pstmt.executeQuery()) {for (int row = 0; rs.next(); row++) {array.add(mapper.map(rs, row));}}return array;}} catch (Exception e) {e.printStackTrace();return null;}}/*** 用来执行每一行数据的映射(rs -> bean)* @param <T>*/public interface RowMapper<T> {T map(ResultSet rs, int row) throws Exception;}
}
- druid.properties```javadriverClassName=com.mysql.jdbc.Driverurl=jdbc:mysql://localhost:3306/项目名username=rootpassword=rootinitialSize=5maxActive=10maxWait=5000
Spring JDBC
- Spring JDBC框架可以帮助开发者节省大量开发工作,自动去处理一些低级细节,比如:
- 异常处理、打开和关闭资源(Connection、Statement、ResultSet)
需要的jar包
构造方法
- public JdbcTemplate ( DataSource dataSource)
- 执行DDL、DML语句
- int update(String sql, Object… args)
- 执行DQL语句
List query(String sql, RowMapper rowMapper, Object… args) T queryForObject(String sql, RowMapper rowMapper, Object… args) ```java import com.alibaba.druid.pool.DruidDataSourceFactory; import org.springframework.jdbc.core.JdbcTemplate;
import javax.sql.DataSource; import java.io.InputStream; import java.util.Properties;
public class Dbs { private static JdbcTemplate tpl; static { try (InputStream is = Dbs.class.getClassLoader().getResourceAsStream(“druid.properties”)) { Properties properties = new Properties(); properties.load(is); DataSource ds = DruidDataSourceFactory.createDataSource(properties); tpl = new JdbcTemplate(ds); } catch (Exception e) { e.printStackTrace(); } }
public static JdbcTemplate getTpl() {return tpl;}
}
- druid.properties```javadriverClassName=com.mysql.jdbc.Driverurl=jdbc:mysql://localhost:3306/项目名username=rootpassword=rootinitialSize=5maxActive=10maxWait=5000
