您的位置:首页 > 编程语言 > Java开发

Java轻量级ORM工具--DbUtils使用

2016-05-20 09:36 549 查看
一、概述

DbUtil是一个非常经量级的ORM工具,不属于一个ORM框架,只提供数据库操作的简单实现,包含增、删、改、查、批量以及事务等操作。

二、功能介绍

采用配置文件properties配置数据库信息;

采用java.util.Properties来加载配置文件;

使用dbcp连接池技术;

三、相关数据表

DROP TABLE IF EXISTS `t_user`;
CREATE TABLE `t_user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(50) DEFAULT NULL,
  `password` varchar(50) DEFAULT NULL,
  `inserttime` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;


四、配置文件
#mysql database setting
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8
jdbc.username=root
jdbc.password=123456

#dbcp settings
dbcp.maxIdle=2
dbcp.maxActive=5
dhcp.maxActive=10
dbcp.defaultAutoCommit=true


五、整体结构



六、具体代码

1、用户对象
package com.dto;

import java.sql.Timestamp;

public class UserDto implements java.io.Serializable {
private static final long serialVersionUID = 1L;
private Integer id;
private String username;
private String password;
private Timestamp inserttime;

public UserDto() {
}

public Integer getId() {
return id;
}

public void setId(Integer id) {
this.id = id;
}

public String getUsername() {
return username;
}

public void setUsername(String username) {
this.username = username;
}

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}

public Timestamp getInserttime() {
return inserttime;
}

public void setInserttime(Timestamp inserttime) {
this.inserttime = inserttime;
}

}


2、配置文件解析类
package com.config;

import java.io.InputStream;
import java.util.HashMap;
import java.util.Properties;

/**
 * 读取*.properties配置文件
 */
public class PropertiesConfig {

// 配置文件的map key:propertiesName value:PropertiesUtil对象
private static HashMap propertiesMap = new HashMap();

// 属性文件
private Properties properties;

private PropertiesConfig() {

}

public synchronized static PropertiesConfig getInstance(String propertiesName) {

PropertiesConfig configUtil = propertiesMap.get(propertiesName);

if (configUtil == null) {
configUtil = new PropertiesConfig();
configUtil.analysisXml(propertiesName);
propertiesMap.put(propertiesName, configUtil);
}

return configUtil;
}

private void analysisXml(String propertiesName) {
InputStream ins = getClass().getResourceAsStream(propertiesName);
properties = new Properties();
try {
properties.load(ins);
} catch (Exception e) {
e.printStackTrace();
}
}

public String getProperty(String key) {
return properties.getProperty(key);
}

}


3、配置文件服务类

package com.config;

/**
 * properties服务类
 */
public class PropertiesService {

/**
 * application配置文件
 * 
 * @return
 */
public static PropertiesConfig getApplicationConfig() {
return PropertiesConfig.getInstance("/application.properties");
}
}


4、工具类
package com.utils;

public class CommonUtil {
public static int objectToInteger(Object obj) {
try {
if (obj != null && !obj.toString().trim().equals(""))
return Integer.parseInt(obj.toString());
} catch (Exception ex) {
ex.printStackTrace();
return 0;
}
return 0;
}
}


5、封装DbUtils的工具类DbBuilder

package com.utils;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSource;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.ArrayHandler;
import org.apache.commons.dbutils.handlers.ArrayListHandler;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ColumnListHandler;
import org.apache.commons.dbutils.handlers.KeyedHandler;
import org.apache.commons.dbutils.handlers.MapHandler;
import org.apache.commons.dbutils.handlers.MapListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import org.apache.log4j.Logger;

import com.config.PropertiesConfig;
import com.config.PropertiesService;
import com.dto.UserDto;

public class DbBuilder {
private static DataSource dataSource;
private static Logger logger = Logger.getLogger(DbBuilder.class);

private DbBuilder() {
}

public static DataSource getDataSource() {
if (DbBuilder.dataSource == null) {
try {
PropertiesConfig config = PropertiesService.getApplicationConfig();
BasicDataSource dbcpDataSource = new BasicDataSource();
dbcpDataSource.setUrl(config.getProperty("jdbc.url"));
dbcpDataSource.setDriverClassName(config.getProperty("jdbc.driver"));
dbcpDataSource.setUsername(config.getProperty("jdbc.username"));
dbcpDataSource.setPassword(config.getProperty("jdbc.password"));
dbcpDataSource.setDefaultAutoCommit(Boolean.parseBoolean(config.getProperty("dbcp.defaultAutoCommit")));
dbcpDataSource.setMaxActive(Integer.parseInt(config.getProperty("dbcp.maxActive")));
dbcpDataSource.setMaxIdle(Integer.parseInt(config.getProperty("dbcp.maxIdle")));
dbcpDataSource.setMaxWait(Integer.parseInt(config.getProperty("dbcp.maxActive")));
DbBuilder.dataSource = (DataSource) dbcpDataSource;
logger.info("dbcp数据源初始化成功!");
} catch (Exception ex) {
logger.info("dbcp数据源初始化失败:" + ex.getMessage());
}
}
return DbBuilder.dataSource;
}

public static Connection getConnection() {
try {
DataSource dataSource = DbBuilder.getDataSource();
return dataSource.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}

public static void close(Connection connection) {
try {
if (connection != null)
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}

public static QueryRunner getQueryRunner() {
return new QueryRunner(DbBuilder.getDataSource());
}

/**
 * 得到查询记录的条数
 * 
 * @param sql
 *            必须为select count(*) from t_user的格式
 * @return
 */
public static int getCount(String sql) {
try {
QueryRunner runner = DbBuilder.getQueryRunner();
Object value = runner.query(sql, new ScalarHandler());
return CommonUtil.objectToInteger(value);
} catch (Exception ex) {
ex.printStackTrace();
}
return 0;
}

/**
 * 得到查询记录的条数
 * 
 * @param sql
 *            必须为select count(*) from t_user的格式
 * @return
 */
public static int getCount(Connection connection, String sql) {
try {
QueryRunner runner = new QueryRunner();
Object value = runner.query(connection, sql, new ScalarHandler());
return CommonUtil.objectToInteger(value);
} catch (Exception ex) {
ex.printStackTrace();
}
return 0;
}

/**
 * 得到查询记录的条数
 * 
 * @param sql
 *            必须为select count(*) from t_user的格式
 * @param params
 * @return
 */
public static int getCount(String sql, Object... params) {
try {
QueryRunner runner = DbBuilder.getQueryRunner();
Object value = runner.query(sql, new ScalarHandler(), params);
return CommonUtil.objectToInteger(value);
} catch (Exception ex) {
ex.printStackTrace();
}
return 0;
}

/**
 * 得到查询记录的条数
 * 
 * @param sql
 *            必须为select count(*) from t_user的格式
 * @param params
 * @return
 */
public static int getCount(Connection connection, String sql, Object... params) {
try {
QueryRunner runner = new QueryRunner();
Object value = runner.query(connection, sql, new ScalarHandler(), params);
return CommonUtil.objectToInteger(value);
} catch (Exception ex) {
ex.printStackTrace();
}
return 0;
}

/**
 * 根据传入的sql,查询记录,以数组形式返回第一行记录。 注意:如果有多行记录,只会返回第一行,所以适用场景需要注意,可以使用根据主键来查询的场景
 * 
 * @param sql
 * @return
 */
public static Object[] getFirstRowArray(String sql) {
try {
QueryRunner runner = DbBuilder.getQueryRunner();
return runner.query(sql, new ArrayHandler());
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}

/**
 * 根据传入的sql,查询记录,以数组形式返回第一行记录。 注意:如果有多行记录,只会返回第一行,所以适用场景需要注意,可以使用根据主键来查询的场景
 * 
 * @param sql
 * @return
 */
public static Object[] getFirstRowArray(Connection connection, String sql) {
try {
QueryRunner runner = new QueryRunner();
return runner.query(connection, sql, new ArrayHandler());
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}

/**
 * 根据传入的sql,查询记录,以数组形式返回第一行记录。 注意:如果有多行记录,只会返回第一行,所以适用场景需要注意,可以使用根据主键来查询的场景
 * 
 * @param sql
 * @param params
 * @return
 */
public static Object[] getFirstRowArray(String sql, Object... params) {
try {
QueryRunner runner = DbBuilder.getQueryRunner();
return runner.query(sql, new ArrayHandler(), params);
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}

/**
 * 根据传入的sql,查询记录,以数组形式返回第一行记录。 注意:如果有多行记录,只会返回第一行,所以适用场景需要注意,可以使用根据主键来查询的场景
 * 
 * @param sql
 * @param params
 * @return
 */
public static Object[] getFirstRowArray(Connection connection, String sql, Object... params) {
try {
QueryRunner runner = new QueryRunner();
return runner.query(connection, sql, new ArrayHandler(), params);
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}

/**
 * 根据sql查询返回所有记录,以List数组形式返回
 * 
 * @param sql
 * @return
 */
public static List getListArray(String sql) {
try {
QueryRunner runner = DbBuilder.getQueryRunner();
return runner.query(sql, new ArrayListHandler());
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}

/**
 * 根据sql查询返回所有记录,以List数组形式返回
 * 
 * @param sql
 * @return
 */
public static List getListArray(Connection connection, String sql) {
try {
QueryRunner runner = new QueryRunner();
return runner.query(connection, sql, new ArrayListHandler());
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}

/**
 * 根据sql查询返回所有记录,以List数组形式返回
 * 
 * @param sql
 * @param params
 * @return
 */
public static List getListArray(String sql, Object... params) {
try {
QueryRunner runner = DbBuilder.getQueryRunner();
return runner.query(sql, new ArrayListHandler(), params);
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}

/**
 * 根据sql查询返回所有记录,以List数组形式返回
 * 
 * @param sql
 * @param params
 * @return
 */
public static List getListArray(Connection connection, String sql, Object... params) {
try {
QueryRunner runner = new QueryRunner();
return runner.query(connection, sql, new ArrayListHandler(), params);
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}

/**
 * 根据传入的sql,查询记录,以Map形式返回第一行记录。 注意:如果有多行记录,只会返回第一行,所以适用场景需要注意,可以使用根据主键来查询的场景
 * 
 * @param sql
 * @return
 */
public static Map getFirstRowMap(String sql) {
try {
QueryRunner runner = DbBuilder.getQueryRunner();
return runner.query(sql, new MapHandler());
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}

/**
 * 根据传入的sql,查询记录,以Map形式返回第一行记录。 注意:如果有多行记录,只会返回第一行,所以适用场景需要注意,可以使用根据主键来查询的场景
 * 
 * @param sql
 * @return
 */
public static Map getFirstRowMap(Connection connection, String sql) {
try {
QueryRunner runner = new QueryRunner();
return runner.query(connection, sql, new MapHandler());
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}

/**
 * 根据传入的sql,查询记录,以Map形式返回第一行记录。 注意:如果有多行记录,只会返回第一行,所以适用场景需要注意,可以使用根据主键来查询的场景
 * 
 * @param sql
 * @param params
 * @return
 */
public static Map getFirstRowMap(String sql, Object... params) {
try {
QueryRunner runner = DbBuilder.getQueryRunner();
return runner.query(sql, new MapHandler(), params);
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}

/**
 * 根据传入的sql,查询记录,以Map形式返回第一行记录。 注意:如果有多行记录,只会返回第一行,所以适用场景需要注意,可以使用根据主键来查询的场景
 * 
 * @param sql
 * @param params
 * @return
 */
public static Map getFirstRowMap(Connection connection, String sql, Object... params) {
try {
QueryRunner runner = new QueryRunner();
return runner.query(connection, sql, new MapHandler(), params);
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}

/**
 * 根据传入的sql查询所有记录,以List Map形式返回
 * 
 * @param sql
 * @return
 */
public static List getListMap(String sql) {
try {
QueryRunner runner = DbBuilder.getQueryRunner();
return runner.query(sql, new MapListHandler());
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}

/**
 * 根据传入的sql查询所有记录,以List Map形式返回
 * 
 * @param sql
 * @return
 */
public static List getListMap(Connection connection, String sql) {
try {
QueryRunner runner = new QueryRunner();
return runner.query(connection, sql, new MapListHandler());
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}

/**
 * 根据传入的sql查询所有记录,以List Map形式返回
 * 
 * @param sql
 * @param params
 * @return
 */
public static List getListMap(String sql, Object... params) {
try {
QueryRunner runner = DbBuilder.getQueryRunner();
return runner.query(sql, new MapListHandler(), params);
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}

/**
 * 根据传入的sql查询所有记录,以List Map形式返回
 * 
 * @param sql
 * @param params
 * @return
 */
public static List getListMap(Connection connection, String sql, Object... params) {
try {
QueryRunner runner = new QueryRunner();
return runner.query(connection, sql, new MapListHandler(), params);
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}

/**
 * 根据sql和对象,查询结果并以对象形式返回
 * 
 * @param sql
 * @param type
 * @return
 */
public static  T getBean(String sql, Class type) {
try {
QueryRunner runner = DbBuilder.getQueryRunner();
return runner.query(sql, new BeanHandler(type));
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}

/**
 * 根据sql和对象,查询结果并以对象形式返回
 * 
 * @param sql
 * @param type
 * @return
 */
public static  T getBean(Connection connection, String sql, Class type) {
try {
QueryRunner runner = new QueryRunner();
return runner.query(connection, sql, new BeanHandler(type));
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}

/**
 * 根据sql和对象,查询结果并以对象形式返回
 * 
 * @param sql
 * @param type
 * @param params
 * @return
 */
public static  T getBean(String sql, Class type, Object... params) {
try {
QueryRunner runner = DbBuilder.getQueryRunner();
return runner.query(sql, new BeanHandler(type), params);
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}

/**
 * 根据sql和对象,查询结果并以对象形式返回
 * 
 * @param sql
 * @param type
 * @param params
 * @return
 */
public static  T getBean(Connection connection, String sql, Class type, Object... params) {
try {
QueryRunner runner = new QueryRunner();
return runner.query(connection, sql, new BeanHandler(type), params);
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}

/**
 * 根据sql查询list对象
 * 
 * @param sql
 * @param type
 * @return
 */
public static  List getListBean(String sql, Class type) {
try {
QueryRunner runner = DbBuilder.getQueryRunner();
return runner.query(sql, new BeanListHandler(type));
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}

/**
 * 根据sql查询list对象
 * 
 * @param sql
 * @param type
 * @return
 */
public static  List getListBean(Connection connection, String sql, Class type) {
try {
QueryRunner runner = new QueryRunner();
return runner.query(connection, sql, new BeanListHandler(type));
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}

/**
 * 根据sql查询list对象
 * 
 * @param sql
 * @param type
 * @param params
 * @return
 */
public static  List getListBean(String sql, Class type, Object... params) {
try {
QueryRunner runner = DbBuilder.getQueryRunner();
return runner.query(sql, new BeanListHandler(type), params);
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}

/**
 * 根据sql查询list对象
 * 
 * @param sql
 * @param type
 * @param params
 * @return
 */
public static  List getListBean(Connection connection, String sql, Class type, Object... params) {
try {
QueryRunner runner = new QueryRunner();
return runner.query(connection, sql, new BeanListHandler(type), params);
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}

/**
 * 保存操作
 * 
 * @param sql
 * @param params
 * @return
 */
public static int save(String sql, Object... params) {
try {
QueryRunner runner = DbBuilder.getQueryRunner();
return runner.update(sql, params);
} catch (Exception ex) {
ex.printStackTrace();
}
return 0;
}

/**
 * 保存操作
 * 
 * @param sql
 * @param params
 * @return
 */
public static int save(Connection connection, String sql, Object... params) {
try {
QueryRunner runner = new QueryRunner();
return runner.update(connection, sql, params);
} catch (Exception ex) {
ex.printStackTrace();
}
return 0;
}

/**
 * 更新操作
 * 
 * @param sql
 * @param params
 * @return
 */
public static int update(String sql, Object... params) {
try {
QueryRunner runner = DbBuilder.getQueryRunner();
return runner.update(sql, params);
} catch (Exception ex) {
ex.printStackTrace();
}
return 0;
}

/**
 * 更新操作
 * 
 * @param sql
 * @param params
 * @return
 */
public static int update(Connection connection, String sql, Object... params) {
try {
QueryRunner runner = new QueryRunner();
return runner.update(connection, sql, params);
} catch (Exception ex) {
ex.printStackTrace();
}
return 0;
}

/**
 * 删除操作
 * 
 * @param sql
 * @param params
 * @return
 */
public static int delete(String sql, Object... params) {
try {
QueryRunner runner = DbBuilder.getQueryRunner();
return runner.update(sql, params);
} catch (Exception ex) {
ex.printStackTrace();
}
return 0;
}

/**
 * 删除操作
 * 
 * @param sql
 * @param params
 * @return
 */
public static int delete(Connection connection, String sql, Object... params) {
try {
QueryRunner runner = new QueryRunner();
return runner.update(connection, sql, params);
} catch (Exception ex) {
ex.printStackTrace();
}
return 0;
}

/**
 * 批量操作,包括批量保存、修改、删除
 * 
 * @param sql
 * @param params
 * @return
 */
public static int[] batch(String sql, Object[][] params) {
try {
QueryRunner runner = DbBuilder.getQueryRunner();
return runner.batch(sql, params);
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}

/**
 * 批量操作,包括批量保存、修改、删除
 * 
 * @param sql
 * @param params
 * @return
 */
public static int[] batch(Connection connection, String sql, Object[][] params) {
try {
QueryRunner runner = new QueryRunner();
return runner.batch(connection, sql, params);
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}

/**
 * 开启事务
 */
public static void beginTransaction(Connection conn) {
try {
// 开启事务
conn.setAutoCommit(false);
} catch (Exception e) {
throw new RuntimeException(e);
}
}

/**
 * 回滚事务
 */
public static void rollback(Connection conn) {
try {
conn.rollback();
} catch (Exception e) {
throw new RuntimeException(e);
}
}

/**
 * 提交事务
 */
public static void commit(Connection conn) {
try {
conn.commit();
} catch (Exception e) {
throw new RuntimeException(e);
}
}

public static void main(String[] args) {
try {
System.out.println(DbBuilder.getCount("select count(*) from T_USER"));

// 返回ArrayHandler结果,第一行结果:Object[]
System.out.println("返回ArrayHandler结果......");
Object[] arrayResult = DbBuilder.getFirstRowArray("select * from T_USER where id=2");
QueryRunner runner = DbBuilder.getQueryRunner();
for (int i = 0; i < arrayResult.length; i++) {
System.out.print(arrayResult[i] + "    ");
}
System.out.println();

// 返回ArrayListHandler结果
System.out.println("返回ArrayListHandler结果.........");
List arrayListResult = DbBuilder.getListArray("select * from T_USER");
for (int i = 0; i < arrayListResult.size(); i++) {
for (int j = 0; j < arrayListResult.get(i).length; j++) {
System.out.print(arrayListResult.get(i)[j] + "    ");
}
System.out.println();
}
System.out.println();

// 返回bean
UserDto user = DbBuilder.getBean("select * from T_USER where Id=?", UserDto.class, 1);
System.out.println(user.getUsername());

// 返回beanlist
System.out.println("返回BeanList结果......");
List beanListResult = DbBuilder.getListBean("select * from T_USER", UserDto.class);
Iterator iter_beanList = beanListResult.iterator();
while (iter_beanList.hasNext()) {
System.out.println(iter_beanList.next().getUsername());
}

// 返回指定列
System.out.println("返回ColumnList结果......");
List columnResult = runner.query("select * from T_USER", new ColumnListHandler("username"));
Iterator iter = columnResult.iterator();
while (iter.hasNext()) {
System.out.println(iter.next());
}

// 返回KeyedHandler结果:Map:map的key为KeyedHandler指定
System.out.println("返回KeyedHandler结果.........");
Map keyedResult = runner.query("select * from T_USER", new KeyedHandler(
"username"));
System.out.println(keyedResult.get("username"));

// MapHandler
System.out.println("返回MapHandler结果.........");
Map mapResult = DbBuilder.getFirstRowMap("select * from T_USER");
Iterator iter_mapResult = mapResult.keySet().iterator();
while (iter_mapResult.hasNext()) {
System.out.print(mapResult.get(iter_mapResult.next()) + "   ");
}
System.out.println();

// 返回MapListHandler结果
System.out.println("返回MapListHandler结果.........");
List mapListResult = DbBuilder.getListMap("select * from T_USER");
for (int i = 0; i < mapListResult.size(); i++) {
Iterator values = mapListResult.get(i).keySet().iterator();
while (values.hasNext()) {
System.out.print(mapListResult.get(i).get(values.next()) + "   ");
}
System.out.println();
}
Connection conn = DbBuilder.getConnection();
DbBuilder.beginTransaction(conn);
System.out.println(DbBuilder.save(conn,"insert into t_user(username,password) values(?,?)", "demo", "demo"));
DbBuilder.commit(conn);
DbBuilder.close(conn);
Object increaseId = runner.query("select last_insert_id()", new ScalarHandler());
System.out.println(increaseId);
} catch (SQLException e) {
e.printStackTrace();
}
}
}


七、代码说明

此代码采用dbcp连接池技术,但是如果直接使用连接池来初始化QueryRunner对象,则没有事务控制,如果需要事物操作,则要调用getConnection()方法得到连接,再调用开启事务、提交事务,异常的时候回滚事务来控制事务。

完整的代码已经提交到GitHub上,大家可以fork进行修改,并提交。https://github.com/16boke/DbUtil.git

欢迎转载,请注明来源一路博客,地址:http://www.16boke.com/article/detail/143
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息