背景:
操作关系型数据库的框架很多,其实最好的是jdbc不过开发量稍高那么有没有其他的相对合适的框架呢?此处选择了dbutils。那么就需要spring和dbutils集成,对事务要求不高,基于spring注解集成
环境:
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>3.2.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>3.2.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>3.2.0.RELEASE</version> </dependency> <dependency> <groupId>commons-dbutils</groupId> <artifactId>commons-dbutils</artifactId> <version>1.5</version> </dependency> <dependency> <groupId>commons-pool</groupId> <artifactId>commons-pool</artifactId> <version>1.6</version> </dependency> <dependency> <groupId>commons-dbcp</groupId> <artifactId>commons-dbcp</artifactId> <version>20030825.184428</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.28</version> </dependency>
实现:
1.spring-source.xml:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:task="http://www.springframework.org/schema/task" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:beans="http://www.springframework.org/schema/beans" xmlns:device="http://www.springframework.org/schema/mobile/device" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.2.xsd "> <context:component-scan base-package=" org.apache.tools.source" /> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://127.0.0.1:3306/demo?useUnicode=true&characterEncoding=UTF-8" /> <property name="username" value="root" /> <property name="password" value="root2013" /> </bean> </beans>
2.DBUtilsTemplate
@Service("dbUtilsTemplate")
public class DBUtilsTemplate {
@Autowired
private DataSource dataSource;
private QueryRunner queryRunner;
private static final Log LOG = LogFactory.getLog(DBUtilsTemplate.class);
public void setDataSource(BasicDataSource dataSource) {
this.dataSource = dataSource;
}
/**
* 执行sql语句
*
* @param sql
* sql语句
* @param params
* 参数数组
* @return 受影响的行数
*/
public int update(String sql, Object[] params) {
queryRunner = new QueryRunner(dataSource);
int affectedRows = 0;
try {
if (params == null) {
affectedRows = queryRunner.update(sql);
} else {
affectedRows = queryRunner.update(sql, params);
}
} catch (SQLException e) {
LOG.error("Error occured while attempting to update data", e);
}
return affectedRows;
}
/**
* 执行批量sql语句
*
* @param sql
* sql语句
* @param params
* 二维参数数组
* @return 受影响的行数的数组
*/
public int[] batchUpdate(String sql, Object[][] params) {
queryRunner = new QueryRunner(dataSource);
int[] affectedRows = new int[0];
try {
affectedRows = queryRunner.batch(sql, params);
} catch (SQLException e) {
LOG.error("Error occured while attempting to batch update data", e);
}
return affectedRows;
}
/**
* 执行查询,将每行的结果保存到一个Map对象中,然后将所有Map对象保存到List中
*
* @param sql
* sql语句
* @return 查询结果
*/
public List<Map<String, Object>> find(String sql) {
return find(sql, null);
}
/**
* 执行查询,将每行的结果保存到一个Map对象中,然后将所有Map对象保存到List中
*
* @param sql
* sql语句
* @param param
* 参数
* @return 查询结果
*/
public List<Map<String, Object>> find(String sql, Object param) {
return find(sql, new Object[] { param });
}
/**
* 执行查询,将每行的结果保存到一个Map对象中,然后将所有Map对象保存到List中
*
* @param sql
* sql语句
* @param params
* 参数数组
* @return 查询结果
*/
public List<Map<String, Object>> find(String sql, Object[] params) {
queryRunner = new QueryRunner(dataSource);
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
try {
if (params == null) {
list = (List<Map<String, Object>>) queryRunner.query(sql,
new MapListHandler());
} else {
list = (List<Map<String, Object>>) queryRunner.query(sql,
new MapListHandler(), params);
}
} catch (SQLException e) {
LOG.error("Error occured while attempting to query data", e);
}
return list;
}
/**
* 执行查询,将每行的结果保存到Bean中,然后将所有Bean保存到List中
*
* @param entityClass
* 类名
* @param sql
* sql语句
* @return 查询结果
*/
public <T> List<T> find(Class<T> entityClass, String sql) {
return find(entityClass, sql, null);
}
/**
* 执行查询,将每行的结果保存到Bean中,然后将所有Bean保存到List中
*
* @param entityClass
* 类名
* @param sql
* sql语句
* @param param
* 参数
* @return 查询结果
*/
public <T> List<T> find(Class<T> entityClass, String sql, Object param) {
return find(entityClass, sql, new Object[] { param });
}
/**
* 执行查询,将每行的结果保存到Bean中,然后将所有Bean保存到List中
*
* @param entityClass
* 类名
* @param sql
* sql语句
* @param params
* 参数数组
* @return 查询结果
*/
@SuppressWarnings("unchecked")
public <T> List<T> find(Class<T> entityClass, String sql, Object[] params) {
queryRunner = new QueryRunner(dataSource);
List<T> list = new ArrayList<T>();
try {
if (params == null) {
list = (List<T>) queryRunner.query(sql, new BeanListHandler(
entityClass));
} else {
list = (List<T>) queryRunner.query(sql, new BeanListHandler(
entityClass), params);
}
} catch (SQLException e) {
LOG.error("Error occured while attempting to query data", e);
}
return list;
}
/**
* 查询出结果集中的第一条记录,并封装成对象
*
* @param entityClass
* 类名
* @param sql
* sql语句
* @return 对象
*/
public <T> T findFirst(Class<T> entityClass, String sql) {
return findFirst(entityClass, sql, null);
}
/**
* 查询出结果集中的第一条记录,并封装成对象
*
* @param entityClass
* 类名
* @param sql
* sql语句
* @param param
* 参数
* @return 对象
*/
public <T> T findFirst(Class<T> entityClass, String sql, Object param) {
return findFirst(entityClass, sql, new Object[] { param });
}
/**
* 查询出结果集中的第一条记录,并封装成对象
*
* @param entityClass
* 类名
* @param sql
* sql语句
* @param params
* 参数数组
* @return 对象
*/
@SuppressWarnings("unchecked")
public <T> T findFirst(Class<T> entityClass, String sql, Object[] params) {
queryRunner = new QueryRunner(dataSource);
Object object = null;
try {
if (params == null) {
object = queryRunner.query(sql, new BeanHandler(entityClass));
} else {
object = queryRunner.query(sql, new BeanHandler(entityClass),
params);
}
} catch (SQLException e) {
LOG.error("Error occured while attempting to query data", e);
}
return (T) object;
}
/**
* 查询出结果集中的第一条记录,并封装成Map对象
*
* @param sql
* sql语句
* @return 封装为Map的对象
*/
public Map<String, Object> findFirst(String sql) {
return findFirst(sql, null);
}
/**
* 查询出结果集中的第一条记录,并封装成Map对象
*
* @param sql
* sql语句
* @param param
* 参数
* @return 封装为Map的对象
*/
public Map<String, Object> findFirst(String sql, Object param) {
return findFirst(sql, new Object[] { param });
}
/**
* 查询出结果集中的第一条记录,并封装成Map对象
*
* @param sql
* sql语句
* @param params
* 参数数组
* @return 封装为Map的对象
*/
public Map<String, Object> findFirst(String sql, Object[] params) {
queryRunner = new QueryRunner(dataSource);
Map<String, Object> map = null;
try {
if (params == null) {
map = (Map<String, Object>) queryRunner.query(sql,
new MapHandler());
} else {
map = (Map<String, Object>) queryRunner.query(sql,
new MapHandler(), params);
}
} catch (SQLException e) {
LOG.error("Error occured while attempting to query data", e);
}
return map;
}
/**
* 查询某一条记录,并将指定列的数据转换为Object
*
* @param sql
* sql语句
* @param columnName
* 列名
* @return 结果对象
*/
public Object findBy(String sql, String columnName) {
return findBy(sql, columnName, null);
}
/**
* 查询某一条记录,并将指定列的数据转换为Object
*
* @param sql
* sql语句
* @param columnName
* 列名
* @param param
* 参数
* @return 结果对象
*/
public Object findBy(String sql, String columnName, Object param) {
return findBy(sql, columnName, new Object[] { param });
}
/**
* 查询某一条记录,并将指定列的数据转换为Object
*
* @param sql
* sql语句
* @param columnName
* 列名
* @param params
* 参数数组
* @return 结果对象
*/
public Object findBy(String sql, String columnName, Object[] params) {
queryRunner = new QueryRunner(dataSource);
Object object = null;
try {
if (params == null) {
object = queryRunner.query(sql, new ScalarHandler(columnName));
} else {
object = queryRunner.query(sql, new ScalarHandler(columnName),
params);
}
} catch (SQLException e) {
LOG.error("Error occured while attempting to query data", e);
}
return object;
}
/**
* 查询某一条记录,并将指定列的数据转换为Object
*
* @param sql
* sql语句
* @param columnIndex
* 列索引
* @return 结果对象
*/
public Object findBy(String sql, int columnIndex) {
return findBy(sql, columnIndex, null);
}
/**
* 查询某一条记录,并将指定列的数据转换为Object
*
* @param sql
* sql语句
* @param columnIndex
* 列索引
* @param param
* 参数
* @return 结果对象
*/
public Object findBy(String sql, int columnIndex, Object param) {
return findBy(sql, columnIndex, new Object[] { param });
}
/**
* 查询某一条记录,并将指定列的数据转换为Object
*
* @param sql
* sql语句
* @param columnIndex
* 列索引
* @param params
* 参数数组
* @return 结果对象
*/
public Object findBy(String sql, int columnIndex, Object[] params) {
queryRunner = new QueryRunner(dataSource);
Object object = null;
try {
if (params == null) {
object = queryRunner.query(sql, new ScalarHandler(columnIndex));
} else {
object = queryRunner.query(sql, new ScalarHandler(columnIndex),
params);
}
} catch (SQLException e) {
LOG.error("Error occured while attempting to query data", e);
}
return object;
}
}
3.测试:
public static ClassPathXmlApplicationContext context = null;
public static ClassPathXmlApplicationContext getContextInstance() {
if (context == null) {
start();
}
if (!context.isRunning()) {
CopyOfApp.context.refresh();
context.registerShutdownHook();
}
return context;
}
private static void start() {
context = new ClassPathXmlApplicationContext(
"classpath:spring-source.xml");
context.registerShutdownHook();
}
public static void main(String[] args) throws Exception {
App.start();
App.context.refresh();
DBUtilsTemplate dbUtilsTemplate = CopyOfApp.context.getBean(
"dbUtilsTemplate", DBUtilsTemplate.class);
String sql = "select count(1) from admin";
List<Map<String, Object>> list = dbUtilsTemplate.find(sql);
System.out.println(list + "--");
}