文章目录
- 0 说明
- 1 如何使用jdbc操作数据库
- 1.1 加载数据库驱动
- 1.2 建立数据库连接
- 1.3 创建Statement或者PreparedStatement用来执行SQL
- 1.4 开始执行SQL语句
- 1.5 处理结果集
- 1.6 关闭连接
- 1.7 完整代码
- 2 批量操作数据库
- 3 如何打印SQL语句
- 4 jdbc常用开源类库
- 5 获取自增id
- 6 获取数据源信息几种方式
- 6.1 通过@Value获取yml信息
- 6.2 通过SqlSessionFactory获取
- 7 结果集获取几种方式
1 JDBC实现往MySQL插入百万级数据
2 详解JDBC(Java Database connect)
0 说明
JDBC
(Java
数据库连接)是 Java
语言中用来连接和操作关系型数据库的 API
。使用 JDBC
,我们可以通过编写 Java
代码来访问各种数据库,包括 MySQL
、Oracle
、SQL Server
等。
JDBC
是基于 Java
的标准接口,它提供了一组接口和类,可以让 Java
应用程序与各个数据库进行交互。JDBC
的工作原理如下:
1.、加载数据库驱动程序
在使用 JDBC 前,需要先加载相应的数据库驱动程序,不同的数据库使用的驱动程序不同。通常情况下,我们需要将驱动程序的 jar 文件添加到项目的类路径中,并在代码中使用 Class.forName() 方法来加载驱动程序。
2、连接数据库
使用 DriverManager 类来连接数据库,该类提供了一组方法来获取数据库连接。连接字符串通常由以下三部分组成:协议、主机名和数据库名称。
3、执行 SQL 语句
连接成功后,就可以通过 Connection 对象创建 Statement 或 PreparedStatement 对象,用于执行 SQL 语句。Statement 支持静态 SQL 语句,而 PreparedStatement 支持动态 SQL 语句。执行 SQL 语句后,可以通过 ResultSet 对象获取查询结果。
4.、关闭连接
完成数据库操作后,必须关闭 Connection、Statement 和 ResultSet 对象,释放资源。
1 如何使用jdbc操作数据库
1.1 加载数据库驱动
在代码中使用 Class.forName() 方法加载数据库驱动程序。
Class.forName("com.mysql.cj.jdbc.Driver");
1.2 建立数据库连接
使用 DriverManager 类的 getConnection() 方法,传入连接字符串、用户名和密码等参数来获取数据库连接。
private String url = "jdbc:mysql://localhost:3306/school";
private String user = "root";
private String password = "root";
Connection conn = DriverManager.getConnection(url, user, password);
1.3 创建Statement或者PreparedStatement用来执行SQL
使用 Connection 对象的 createStatement() 或 prepareStatement() 方法创建 Statement 或 PreparedStatement 对象,用于执行 SQL 语句。
String sql = "select * from user limit 1";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
1.4 开始执行SQL语句
使用 Statement 或 PreparedStatement 对象的 executeQuery() 或 executeUpdate() 方法执行 SQL 语句,返回 ResultSet 或更新的行数。
String sql = "select * from user limit 1";
ResultSet rs = preparedStatement .executeQuery(sql);
int count = preparedStatement .executeUpdate();
1.5 处理结果集
使用 ResultSet 对象的 getXXX() 方法获取查询结果,例如 getInt()、getString() 等方法。
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
int age = rs.getInt("age");
}
1.6 关闭连接
使用 Connection、Statement 和 ResultSet 对象的 close() 方法关闭连接,释放资源。
rs.close();
stmt.close();
conn.close();
1.7 完整代码
@Test
public void t10() {
String url = "jdbc:mysql://localhost:3306/school";
String user = "root";
String password = "root";
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
log.error("error msg:【{}】", e);
throw new IllegalArgumentException(e);
}
try {
Connection conn = DriverManager.getConnection(url, user, password);
String sql = "select * from user limit 10";
PreparedStatement preparedStatement = conn.prepareStatement(sql);
ResultSet resultSet = preparedStatement.executeQuery(sql);
int id = 0;
String userName = null, sex = null, address = null;
java.sql.Date birthday = null;
while (resultSet.next()) {
id = resultSet.getInt(1);
userName = resultSet.getString(2);
birthday = resultSet.getDate(3);
sex = resultSet.getString(4);
address = resultSet.getString(5);
log.info("结果集:id-【{}】,userName-【{}】,birthday-【{}】,sex-【{}】,address-【{}】", id, userName, birthday, sex, address);
}
conn.close();
preparedStatement.close();
resultSet.close();
} catch (SQLException e) {
log.error("error msg:【{}】", e);
throw new IllegalArgumentException(e);
}
}
2 批量操作数据库
说明1:url拼接 rewriteBatchedStatements=true
说明2:事务关闭自动提交,手动提交事务
connection.setAutoCommit(false);
connection.commit();
说明3:executeBatch();批量执行
String url = "jdbc:mysql://localhost:3306/school?rewriteBatchedStatements=true";
String user = "root";
String password = "root";
private void jdbcSave(List<User> cachedList) {
Connection connection = null;
PreparedStatement preparedStatement = null;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
connection = DriverManager.getConnection(url, user, password);
String sql = "insert into user(user_name,birthday,sex,address) values (?,?,?,?)";
preparedStatement = connection.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);
connection.setAutoCommit(false);
for (User item : cachedList) {
preparedStatement.setString(1, item.getUserName());
preparedStatement.setDate(2, new Date(item.getBirthday().getTime()));
preparedStatement.setString(3, item.getSex());
preparedStatement.setString(4, item.getAddress());
preparedStatement.addBatch();
}
preparedStatement.executeBatch();
connection.commit();
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
} finally {
if (preparedStatement != null) {
try {
preparedStatement.close();
} catch (SQLException e) {
log.error("error msg:[{}]", e);
throw new RuntimeException(e);
}
}
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
log.error("error msg:[{}]", e);
}
}
}
}
3 如何打印SQL语句
/**
* @param sql 原始SQL
* @param parameterList 参数列表
* @return 返回SQL
* @description jdbc打印执行SQL
*/
private static String showFinalSql(String sql, List<Object> parameterList) {
//1 如果没有参数,说明是不是动态SQL语句
int paramCount = 0;
if (CollectionUtils.isNotEmpty(parameterList)) {
paramCount = parameterList.size();
}
if (paramCount < 1) {
return sql;
}
//2 如果有参数,则是动态SQL语句
StringBuilder returnSql = new StringBuilder();
String[] subSql = sql.split("\\?");
for (int i = 0; i < paramCount; i++) {
Object item = parameterList.get(i);
if (item instanceof Integer) {
returnSql.append(subSql[i]).append(" ").append(item).append(" ");
} else if (item instanceof Date) {
String formatStr = DateFormatUtils.format((Date) (item), "yyyy-MM-dd HH:mm:ss");
returnSql.append(subSql[i]).append("'").append(formatStr).append("'");
} else {
returnSql.append(subSql[i]).append("'").append(item).append("'");
}
}
if (subSql.length > parameterList.size()) {
returnSql.append(subSql[subSql.length - 1]);
}
return returnSql.toString();
}
核心代码,打印日志使用slf4j
// 组装入参数据
List<Object> list = Arrays.asList(item.getUserName(), new java.sql.Date(item.getBirthday().getTime()), item.getSex(), item.getAddress());
// 调用自定义方法打印SQL
showFinalSql(sql,list);
private void jdbcSave(List<User> cachedList) {
SqlSession sqlSession = sqlSessionFactory.openSession();
Connection connection = sqlSession.getConnection();
PreparedStatement preparedStatement = null;
sqlSessionFactory.getConfiguration();
try {
Class.forName("com.mysql.cj.jdbc.Driver");
String sql = "insert into user(user_name,birthday,sex,address) values (?,?,?,?)";
preparedStatement = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
connection.setAutoCommit(false);
for (User item : cachedList) {
preparedStatement.setString(1, item.getUserName());
preparedStatement.setDate(2, new java.sql.Date(item.getBirthday().getTime()));
preparedStatement.setString(3, item.getSex());
preparedStatement.setString(4, item.getAddress());
preparedStatement.addBatch();
List<Object> list = Arrays.asList(item.getUserName(), new java.sql.Date(item.getBirthday().getTime()), item.getSex(), item.getAddress());
showFinalSql(sql,list);
}
preparedStatement.executeBatch();
connection.commit();
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
} finally {
if (preparedStatement != null) {
try {
preparedStatement.close();
} catch (SQLException e) {
log.error("error msg:[{}]", e);
throw new RuntimeException(e);
}
}
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
log.error("error msg:[{}]", e);
}
}
}
}
4 jdbc常用开源类库
https://www.cnblogs.com/fnz0/p/5858546.html
5 获取自增id
//Statement.RETURN_GENERATED_KEYS:获取自动增加的id号
// 数据库表设置自增,整形
private void jdbcSave(List<User> cachedList) {
SqlSession sqlSession = sqlSessionFactory.openSession();
Connection connection = sqlSession.getConnection();
PreparedStatement preparedStatement = null;
sqlSessionFactory.getConfiguration();
try {
Class.forName("com.mysql.cj.jdbc.Driver");
// connection = DriverManager.getConnection(url, user, password);
String sql = "insert into user(user_name,birthday,sex,address) values (?,?,?,?)";
// List<String> strs = objs.stream().map(obj-> (String) obj).collect(Collectors.toList());
// getPreparedSQL(sql,(List<Object>) cachedList);
preparedStatement = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
connection.setAutoCommit(false);
for (User item : cachedList) {
preparedStatement.setString(1, item.getUserName());
preparedStatement.setDate(2, new java.sql.Date(item.getBirthday().getTime()));
preparedStatement.setString(3, item.getSex());
preparedStatement.setString(4, item.getAddress());
preparedStatement.addBatch();
List<Object> list = Arrays.asList(item.getUserName(), new java.sql.Date(item.getBirthday().getTime()), item.getSex(), item.getAddress());
showFinalSql(sql,list);
}
preparedStatement.executeBatch();
log.info("结果集SQL打印1:【{}】",preparedStatement.toString());
connection.commit();
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
} finally {
if (preparedStatement != null) {
try {
preparedStatement.close();
} catch (SQLException e) {
log.error("error msg:[{}]", e);
throw new RuntimeException(e);
}
}
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
log.error("error msg:[{}]", e);
}
}
}
}
6 获取数据源信息几种方式
6.1 通过@Value获取yml信息
注意:需要在spring环境下才可以使用@Value,否则沟通构造方法传入参数
@Value("${spring.datasource.url}")
private String url;
@Value("${spring.datasource.username}")
private String user;
@Value("${spring.datasource.password}")
private String password;
6.2 通过SqlSessionFactory获取
@Autowired
private SqlSessionFactory sqlSessionFactory;
核心代码
SqlSession sqlSession = sqlSessionFactory.openSession();
Connection connection = sqlSession.getConnection();
7 结果集获取几种方式
根据索引位置获取字段信息
String sql = "select id,name,age,email from gk_user limit 1";
while (resultSet.next()) {
id = resultSet.getInt(1);
name = resultSet.getString(2);
age = resultSet.getInt(3);
email = resultSet.getString(4);
}
log.info("打印结果集:[id:{},name:{},age:{},email:{}]", id, name, age, email);