Mysqlutil.JDBCutil.Dtabaseutil数据库操作工具类[批量操作]
一个用来操作数据库的常用工具类.
提供批量操作,生成建表,插入语句等
操作示例:
// 1.获取连接
DataBaseUtil jdbc = new DataBaseUtil();
jdbc.getConn();
// Connection conn = new DataBaseUtil().getConn(); // 2. 插入一条数据,返回主键(自增的情况下)
// 如果不要返回主键,用executePstamt就行了
Object pk1 = jdbc.insertReturnPK("insert into t_employee (name,age) values (?,?);", Arrays.asList("Java", 16));
Object pk2 = jdbc.insertReturnPK("insert t_employee (name)", "Java"); // 3.查询一条数据:返回一个map
Map selectOne1 = jdbc.selectOne("select * from t_employee where name = ?;", "Jenny");
Map selectOne2 = jdbc.selectOne("select * from t_employee where id =?;", Arrays.asList(1)); // 4.查询多条数据
List<Map> selectMore1 = jdbc.selectMore("select *from t_employee;", null);
List<Map> selectMore2 = jdbc.selectMore("select id,name,age from t_employee where age > ?;", Arrays.asList(18)); // 5.执行sql
jdbc.executePstamt("update t_employee set name = ?,age = ? where is = ? ;", Arrays.asList("Danny", 33, 2));
jdbc.executePstamt("insert into t_employee (name,age) values (?,?);", Arrays.asList("Liming", 21)); // 6.批量插入/更新(BLUK模式)
// 你的List中有多少个子list,就会插入多少条数据
List<List> allData = new ArrayList<>();
allData.add(Arrays.asList("Python", 17));
allData.add(Arrays.asList("Nodejs", 23));
jdbc.batchExecutePstamt("insert into t_employee (name,age) values (?,?)", allData); // 7.查询一个表的列名集合
List<String> cloumns = jdbc.selectColumns("t_employee"); // 8.验证一个表是否存在
boolean exist = jdbc.validateTableExist("t_employee"); // 9.获取插入语句:这里的第三个布尔变量,是决定是否使用去重复(IGNORE)插入
String insertSql = jdbc.getInsertSql("t_employee", Arrays.asList("name", "age"), true); // 10.获取建表语句
Map<String, String> fields = new LinkedHashMap<>();
fields.put("name", "varchar(64)");
fields.put("age", "int(32)");
String createTableSql1 = jdbc.createTableSql("t_employee", fields, "InnoDB");
String createTableSql2 = jdbc.createTableSql("t_employee", Arrays.asList("name", "age"), "InnoDB", "varchar(64)");
方法的返回值,传入参数类型,具体看注释.
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Properties; //////////////////////////////////////////////////////////////////////////////////
// 注意jar包版本,新版(应该是6.0以上)的driverClass格式不一样 //
// old :com.mysql.jdbc.Driver //
// 6.0+:com.mysql.cj.jdbc.Driver //
// url连接中需要带上:serverTimezone=UTC //
// 中国地区请使用:serverTimezone=Asia/Shanghai //
//////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////
// jdbc_driver=com.mysqljdbc.Driver //
// jdbc_url=jdbc:mysql://localhost:3306/log?characterEncoding=utf-8 //
// jdbc_username=root //
// jdbc_password=admin //
////////////////////////////////////////////////////////////////////////////////// /**
* @author lnexin@aliyun.com
*/
public class DataBaseUtil {
// 数据库配置文件地址
private static final String CONFIG_PATH = "config.properties"; private static final String DB_DRIVER;
private static final String DB_URL;
private static final String DB_USERNAME;
private static final String DB_PASSWORD; private Connection connection;
private PreparedStatement pstmt;
private ResultSet resultSet; static {
Properties p = new Properties();
try {
// 两种方式任选其一
// InputStream u = DataBaseUtil.class.getResourceAsStream("config.properties");
// p.load(u);
p.load(new FileInputStream(new File(CONFIG_PATH)));
} catch (FileNotFoundException e) {
System.err.println("Not Database configuration files !");
e.printStackTrace();
} catch (IOException e) {
System.err.println("Read configuration file failure!");
e.printStackTrace();
}
DB_DRIVER = p.getProperty("jdbc_driver");
DB_URL = p.getProperty("jdbc_url");
DB_USERNAME = p.getProperty("jdbc_username");
DB_PASSWORD = p.getProperty("jdbc_password");
} public DataBaseUtil() {
} /**
* 使用配置文件中的连接信息获取连接
*/
public Connection getConn() {
try {
Class.forName(DB_DRIVER);
connection = DriverManager.getConnection(DB_URL, DB_USERNAME, DB_PASSWORD);
} catch (SQLException e) {
System.err.println("Get connection failure!" + e);
} catch (ClassNotFoundException e) {
System.err.println("Load DB Driver failure!" + e);
}
return connection == null ? connection : null;
} /////////////////////////////////////////////////////////////////////////////////////
/**
* 使用非配置文件的连接信息
*
* @param driver
* 数据路驱动
* @param url
* 数据库连接
* @param username
* 数据库用户名
* @param password
* 数据库密码
* @return Connection
*/
public Connection getConn(String driver, String url, String username, String password) {
try {
Class.forName(driver);
connection = DriverManager.getConnection(url, username, password);
} catch (SQLException e) {
System.err.println("Get connection failure!" + e);
releaseConn();
} catch (ClassNotFoundException e) {
System.err.println("Load DB Driver failure!" + e);
}
return connection == null ? connection : null;
}
////////////////////////////////////////////////////////////////////////////////////// /**
* 插入
*
* @param sql
* prepareStatement格式的插入语句
* @param param
* 需要插入的单个数值
* @return 自增的情况下返回插入的主键
* @throws SQLException
*/
public Object insertReturnPK(String sql, Object param) throws SQLException {
return insertReturnPK(sql, Arrays.asList(param));
} /**
*
* @param sql
* prepareStatement格式的insert语句
* @param params
* 需要插入的多个参数,以list格式
* @return 返回插入语句的自增主键
* @throws SQLException
*/
public Object insertReturnPK(String sql, List params) throws SQLException {
pstmt = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
int index = 1;
if (params != null && !params.isEmpty()) {
for (int i = 0; i < params.size(); i++) {
pstmt.setObject(index++, params.get(i));
}
}
pstmt.executeUpdate();
resultSet = pstmt.getGeneratedKeys();
Object pk = null;
if (resultSet.next()) {
pk = resultSet.getObject(1);
}
closePstmat();
resultSet.close();
return pk;
} /**
* 执行某一条语句
*
* @param sql
* prepareStatement格式的sql语句
* @param param
* 填充的参数
* @return 返回是否执行成功
* @throws SQLException
*/
public boolean executePstamt(String sql, Object param) throws SQLException {
return executePstamt(sql, Arrays.asList(param));
} /**
* 执行某一条语句
*
* @param sql
* prepareStatement格式的sql语句
* @param param
* 填充的参数列表
* @return 返回是否执行成功
* @throws SQLException
*/
public boolean executePstamt(String sql, List params) throws SQLException {
int result = -1;
pstmt = connection.prepareStatement(sql);
int index = 1;
if (params != null && !params.isEmpty()) {
for (int i = 0; i < params.size(); i++) {
pstmt.setObject(index++, params.get(i));
}
}
result = pstmt.executeUpdate();
closePstmat();
return result > 0 ? true : false;
} /**
* 批量执行
*
* @param sql
* prepareStatement格式的sql语句
* @param lists
* 需要插入的数据列表,注:List<List> 格式,子list中为一条语句所填充的参数列表
* @return 返回是否执行成功
* @throws SQLException
*/
public boolean batchExecutePstamt(String sql, List<List> lists) throws SQLException {
connection.setAutoCommit(false);
boolean flag = false;
int resultNum = 0;
pstmt = connection.prepareStatement(sql);
if (lists != null && !lists.isEmpty()) {
for (List<Object> cList : lists) {
if (cList == null || cList.isEmpty()) continue; for (int i = 0; i < cList.size(); i++) {
pstmt.setObject(i + 1, cList.get(i));
}
pstmt.addBatch();
}
int[] resNum = pstmt.executeBatch();
connection.commit();
resultNum += resNum.length;
}
closePstmat();
flag = resultNum > 0 ? true : false;
return flag;
} /**
* 查询一条,返回结果
*
* @param sql
* prepareStatement格式语句
* @param param
* 不可为空
* @return 一个map集合
* @throws SQLException
*/
public Map selectOne(String sql, String param) throws SQLException {
return selectOne(sql, Arrays.asList(param));
} /**
* 查询一条,返回结果
*
* @param sql
* prepareStatement格式语句
* @param param
* 需要的参数列表,可为空
* @return 一个map集合
* @throws SQLException
*/
public Map selectOne(String sql, List params) throws SQLException {
Map map = new LinkedHashMap();
int index = 1;
pstmt = connection.prepareStatement(sql);
if (params != null && !params.isEmpty()) {
for (int i = 0; i < params.size(); i++) {
pstmt.setObject(index++, params.get(i));
}
}
resultSet = pstmt.executeQuery();
ResultSetMetaData metaData = resultSet.getMetaData();
int col_len = metaData.getColumnCount();
while (resultSet.next()) {
for (int i = 0; i < col_len; i++) {
String cols_name = metaData.getColumnName(i + 1);
Object cols_value = resultSet.getObject(cols_name);
if (cols_value == null) {
cols_value = "";
}
map.put(cols_name, cols_value);
}
}
closeResultSet();
closePstmat();
return map;
} /**
* 查询多个结果的返回集
*
* @param sql
* prepareStatement格式语句
* @param params
* 需要填充的参数列表,可为空
* @return 一个list<map>的结果集
* @throws SQLException
*/
public List<Map> selectMore(String sql, List params) throws SQLException {
List<Map> list = new ArrayList<Map>();
int index = 1;
pstmt = connection.prepareStatement(sql);
if (params != null && !params.isEmpty()) {
for (int i = 0; i < params.size(); i++) {
pstmt.setObject(index++, params.get(i));
}
}
resultSet = pstmt.executeQuery();
ResultSetMetaData metaData = resultSet.getMetaData();
int cols_len = metaData.getColumnCount();
while (resultSet.next()) {
Map map = new LinkedHashMap();
for (int i = 0; i < cols_len; i++) {
String cols_name = metaData.getColumnName(i + 1);
Object cols_value = resultSet.getObject(cols_name);
if (cols_value == null) {
cols_value = "";
}
map.put(cols_name, cols_value);
}
list.add(map);
}
closeResultSet();
closePstmat();
return list;
} /**
* 查询列名
*
* @param tanleN
* 表名称
* @return 列名称列表
* @throws SQLException
*/
public List<String> selectColumns(String tanleN) throws SQLException {
DatabaseMetaData data;
List<String> result = new ArrayList<>();
data = connection.getMetaData();
ResultSet columns = data.getColumns(null, null, tanleN, null);
while (columns.next()) {
result.add(columns.getString("COLUMN_NAME"));
}
columns.close();
return result;
} /**
* 获取插入语句
*
* @param tableName
* @param fields
* @param isIGNORE
* 是否去重复
* @return
*/
public static String getInsertSql(String tableName, List<String> fields, boolean isIGNORE) {
StringBuffer sb = new StringBuffer();
if (isIGNORE) {
sb.append("INSERT IGNORE INTO `").append(tableName).append("` ");
} else {
sb.append("INSERT INTO `").append(tableName).append("` ");
} StringBuffer field = new StringBuffer("(");
StringBuffer value = new StringBuffer("(");
int sign = 0;
for (String f : fields) {
if (sign > 0) {
field.append(",");
value.append(",");
}
field.append("`").append(f).append("`");
value.append("?");
sign++;
}
field.append(")");
value.append(")");
sb.append(field).append(" values ").append(value).append(";");
return sb.toString();
} /**
* 获取建表语句
*
* @param tableName
* @param fields
* Map<String,String> 结构为[字段名,字段数据类型],如:[{name=varchar(64),lastname=varchar(64)}]
* @param engine
* :InnoDB/MyISAM
* @return create sql
*/
public static String createTableSql(String tableName, Map<String, String> fields, String engine) {
StringBuffer sb = new StringBuffer();
sb.append("CREATE TABLE IF NOT EXISTS `").append(tableName).append("` (");
int sign = 0;
for (Entry<String, String> entry : fields.entrySet()) {
String field = entry.getKey();
String type = entry.getValue();
if (sign > 0) sb.append(",");
sb.append("`").append(field).append("` ");
sb.append(type).append(" null default null");
}
sb.append(")");
sb.append(" COLLATE='utf8_general_ci' ").append(" ENGINE=").append(engine).append(";");
return sb.toString();
} /**
* 获取建表语句
*
* @param tableName
* @param fields
* 一个list<string> 的字段列表
* @param engine
* 数据库引擎类型
* @param defaultFieldType
* 默认数据字段的类型,如:varchar(64)
* @return
*/
public static String createTableSql(String tableName, List<String> fields, String engine, String defaultFieldType) {
StringBuffer sb = new StringBuffer();
sb.append("CREATE TABLE IF NOT EXISTS `").append(tableName).append("` ("); int sign = 0;
for (String field : fields) {
if (sign > 0) sb.append(",");
sb.append("`").append(field).append("` ");
sb.append(defaultFieldType).append(" null default null");
} sb.append(")");
sb.append(" COLLATE='utf8_general_ci' ").append(" ENGINE=").append(engine).append(";");
return sb.toString();
} /**
* 验证表是否存在
*
* @param tableName
* 表名称
* @return true/false
*/
public boolean validateTableExist(String tableName) {
boolean flag = false;
try {
DatabaseMetaData meta = connection.getMetaData();
String type[] = { "TABLE" };
ResultSet rs = meta.getTables(null, null, tableName, type);
flag = rs.next();
} catch (SQLException e) {
System.err.println("ERROR! validateTableExist failure! msg:[" + e + "]");
e.printStackTrace();
}
return flag;
} /*
* 释放链接
*/
public void releaseConn() {
if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (pstmt != null) {
try {
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
} private void closeResultSet() {
if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
} private void closePstmat() {
if (pstmt != null) {
try {
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
Mysqlutil.JDBCutil.Dtabaseutil数据库操作工具类[批量操作]的更多相关文章
- Java SE 之 数据库操作工具类(DBUtil)设计
JDBC创建数据库基本连接 //1.加载驱动程序 Class.forName(driveName); //2.获得数据库连接 Connection connection = DriverManager ...
- JAVA 数据库操作工具类----sqllite
package com.asc.db; import android.content.ContentValues; import android.content.Context; import and ...
- JavaWeb网上图书商城完整项目-数据库操作工具类2-MapHandle的高级用法
1.现在在上面一章的基础上,我们引入一个address表,该表记录person类的地址,address表的格式如下所示 现在person类要和address表想关联,得到当前联系人的住宅地址,我们应该 ...
- JavaWeb网上图书商城完整项目-数据库操作工具类
1.首先安装数据库,在windows上安装和在unix上面安装环境不一样,我在自己的本地电脑上安装,安装成功之后,如果使用navicat远程工具访问,需要允许mysql远程能被访问 方法二.直接授权( ...
- 用泛型写Redis缓存与数据库操作工具类
功能描述: 先从缓存获取数据,如果缓存没有,就从数据库获取数据,并设置到缓存中,返回数据. 如果数据库中没有数据,需要设置一个缓存标记flagKey,防止暴击访问数据库,用缓存保护数据库. 当删除缓存 ...
- JDBC操作数据库工具类(使用阿里Druid原生API创建数据源)
1.数据库配置类 package com.zdlt.auth.api.common.druid; import java.util.Properties; import static com.alib ...
- Java课程设计---数据库工具类
接下来看看传统的查询方式(一个完整的查询) package com.java.mysql; import java.sql.Connection; import java.sql.DriverMana ...
- 6.12-PrepareStatement,JdbcUtil 读取数据库配置文件properties,dao模式
一.PrepareStatement 防止sql注入 PrepareStatement 是预编译sql语句 更加灵活,更有效率 executeUpdate() 做增删改 executeQuery() ...
- common-jdbc:一个基于SpringJdbcTemplate的高性能数据库操作工具类库
项目地址:https://gitee.com/cnsugar/common-jdbc 一.简介 基于SpringJdbcTemplate的高性能数据库操作工具类库,支持mysql.oracle数据库, ...
随机推荐
- 不二之选_iTOP-4418开发板研发之旅_缩短开发时间
迅为iTOP-4418开发板拿到手?用能力印证梦想,培养你的研发路程,能力·思维 一.板载WIFI蓝牙.4G.GPS.千兆以太网接口.串口.重力加速度计等. 二.自选模块支持500W摄像头自动对焦摄像 ...
- LeetCode第十一题-可以装最多水的容器
Container With Most Water 问题简介:通过一个给定数组,找出最大的矩形面积 问题详解:给定一个数组,包含n个非负整数a1,a2,…,an,其中每个表示坐标(i,ai)处的点,绘 ...
- rest_framework框架的认识
它是基于Django的,帮助我们快速开发符合RESTful规范的接口框架. 一 路由 可以通过路由as_view()传参 根据请求方式的不同执行对应不同的方法 在routers模块下 封装了很多关于 ...
- Python爬虫基础之Urllib
一.随时随地爬取一个网页下来 怎么爬取网页?对网站开发了解的都知道,浏览器访问Url向服务器发送请求,服务器响应浏览器请求并返回一堆HTML信息,其中包括html标签,css样式,js脚本等.Chro ...
- HTML5 图片下载
1. 概述 1.1 说明 在项目过程中,有时候需要下载某一展示图片,html5中定义了<a> download属性,download属性规定被下载的超链接目标,该属性可以设置一个值来规定下 ...
- C语言学习及应用笔记之七:C语言中的回调函数及使用方式
我们在使用C语言实现相对复杂的软件开发时,经常会碰到使用回调函数的问题.但是回调函数的理解和使用却不是一件简单的事,在本篇我们根据我们个人的理解和应用经验对回调函数做简要的分析. 1.什么是回调函数 ...
- Everything工具使用
一.简介 Everything : Windows下的文件名搜索引擎 二.Everything工具下载 官方最新版本下载 Everything下载 三.Everything快捷搜索 Java*.doc ...
- 零基础入门微信小程序开发
注:本文来源于:<零基础入门微信小程序开发> 课程介绍 本达人课是一个系列入门教程,目标是从 0 开始带领读者上手实战,课程以微信小程序的核心概念作为主线,介绍配置文件.页面样式文件.Ja ...
- intellij idea创建maven项目
1.安装好JDK,Tomcat,安装好maven: 2.配置maven全局变量:file->Other Settings ->Default Settings->Build,Exec ...
- B. Nirvana Codeforces Round #549 (Div. 2) (递归dfs)
---恢复内容开始--- Kurt reaches nirvana when he finds the product of all the digits of some positive integ ...