1.介绍
在前面学习了DBUtils之后感觉对JDBC的操作确实变得更加简单了。但是在项目的开发过程中,项目组成员导入的也许是DBUtils的二进制文件,对于新成员来说,也许他不了解DBUtils有哪些操作,可以做哪些事情,此时也查不到源码,那么最好有一个项目组中别人写好的DBUtils的封装类,将所有的操作都写在里面,这样可以是整个项目组的成员对DBUtils的功能有个快速的了解。不要小看这一步多此一举,也许对于大神来说却是画蛇添足,但是对整体水平都不高的团队来说,帮助效果是明显的。
2.代码
a)封装类DBUtility.java
public class DBUtility {
//将DBUtils进行二次封装,有利于团队共同使用
private static DBUtility dbu = null;
//定义静态数据库连接对象
/*之所以设计成静态的数据库连接供所有用户使用是因为访问服务器的用户量较少,在数百人之间,
* 经过测试,当用户数量级为数百的时候,等待最长时间不会超过1秒,在可接收范围内
* 而且静态连接比较容易实现
*/
private static Connection conn = null;
private static QueryRunner qr = null;
//私有构造函数
private DBUtility() {
System.out.println("开始初始化数据库...");
initDB();
System.out.println("数据库初始化成功!");
}
//获取DBUtility工具类对象实例,外界通过调用这个函数来取得DBUtility对象
public static final DBUtility getInstance() {
if (dbu == null) {
dbu = new DBUtility();
}
return dbu;
}
//初始化和数据库的连接
private void initDB() {
//读取配置文件中关于数据库连接的信息
Properties p = new Properties();
InputStream in = this.getClass()
.getResourceAsStream("/dbutils.properties");
try {
p.load(in);
} catch (IOException e) {
e.printStackTrace();
}
String userName = p.getProperty("username");
String password = p.getProperty("password");
String url = p.getProperty("url");
String driverClassName = p.getProperty("driverClassName");
try {
//装载数据库驱动
Class.forName(driverClassName);
//获取一个静态的数据库连接供所有用户使用
conn = DriverManager.getConnection(url, userName, password);
//获取一个静态的QueryRunner对象供所有用户使用
qr = new QueryRunner();
} catch (Exception e) {
e.printStackTrace();
}
}
/////////////////////////////////////////////////////////
//以下是对数据库的操作函数
//查询操作-无参数查询所有记录
public static List<?> selectAll(String sql, ResultSetHandler<?> rsh) {
List<?> results = null;
try {
results = (List<?>) qr.query(conn, sql, rsh);
System.out.println(sql);
} catch (SQLException e) {
e.printStackTrace();
}
return results;
}
//查询操作-带单独参数查询所有记录
@SuppressWarnings("deprecation")
public static List<?> selectAllWithParam(String sql, Object param,
ResultSetHandler<?> rsh) {
List<?> results = null;
try {
results = (List<?>) qr.query(conn, sql, param, rsh);
System.out.println(sql);
} catch (SQLException e) {
e.printStackTrace();
}
return results;
}
//查询操作-带参数数组查询所有记录
@SuppressWarnings("deprecation")
public static List<?> selectAllWithParams(String sql, Object[] params,
ResultSetHandler<?> rsh) {
List<?> results = null;
try {
results = (List<?>) qr.query(conn, sql, params, rsh);
System.out.println(sql);
} catch (SQLException e) {
e.printStackTrace();
}
return results;
}
//查询操作-无参数查询唯一记录
public static <T> T selectUnique(String sql, ResultSetHandler<T> rsh) {
T result = null;
try {
result = qr.query(conn, sql, rsh);
System.out.println(sql);
} catch (SQLException e) {
e.printStackTrace();
}
return result;
}
//查询操作-带单独参数查询唯一记录
@SuppressWarnings("deprecation")
public static <T> T selectUniqueWithParam(String sql, Object param,
ResultSetHandler<T> rsh) {
T result = null;
try {
result = qr.query(conn, sql, param, rsh);
System.out.println(sql);
} catch (SQLException e) {
e.printStackTrace();
}
return result;
}
//查询操作-带参数数组查询唯一记录
@SuppressWarnings("deprecation")
public static <T> T selectUniqueWithParams(String sql, Object[] params,
ResultSetHandler<T> rsh) {
T result = null;
try {
result = qr.query(conn, sql, params, rsh);
System.out.println(sql);
} catch (SQLException e) {
e.printStackTrace();
}
return result;
}
//更新操作-带参数数组更新记录-返回更新所影响的记录条数
public static int updateWithParams(String sql, Object[] params) {
int result = 0;
try {
result = qr.update(conn, sql, params);
System.out.println(sql);
} catch (SQLException e) {
e.printStackTrace();
}
return result;
}
//更新操作-带单独参数更新记录-返回更新所影响的记录条数
public static int updateWithParam(String sql, Object param) {
int result = 0;
try {
result = qr.update(conn, sql, param);
System.out.println(sql);
} catch (SQLException e) {
e.printStackTrace();
}
return result;
}
//删除操作-不带参数删除记录-返回所删除记录的条数
public static int delete(String sql) {
int result = 0;
try {
result = qr.update(conn, sql);
System.out.println(sql);
} catch (SQLException e) {
e.printStackTrace();
}
return result;
}
//删除操作-带单独参数删除记录-返回所删除记录的条数
public static int deleteWithParam(String sql, Object param) {
int result = 0;
try {
result = qr.update(conn, sql, param);
System.out.println(sql);
} catch (SQLException e) {
e.printStackTrace();
}
return result;
}
//删除操作-带参数数组删除记录-返回所删除记录的条数
public static int deleteWithParams(String sql, Object[] params) {
int result = 0;
try {
result = qr.update(conn, sql, params);
System.out.println(sql);
} catch (SQLException e) {
e.printStackTrace();
}
return result;
}
//增加操作-不带参数增加记录,返回增加的记录条数
public static int insert(String sql) {
int result = 0;
try {
result = qr.update(conn, sql);
System.out.println(sql);
} catch (SQLException e) {
e.printStackTrace();
}
return result;
}
//增加操作-带单独参数增加记录,返回增加的记录条数
public static int insertWithParam(String sql, Object param) {
int result = 0;
try {
result = qr.update(conn, sql, param);
System.out.println(sql);
} catch (SQLException e) {
e.printStackTrace();
}
return result;
}
//增加操作-带参数数组增加记录,返回增加的记录条数
public static int insertWithParams(String sql, Object[] params) {
int result = 0;
try {
result = qr.update(conn, sql, params);
System.out.println(sql);
} catch (SQLException e) {
e.printStackTrace();
}
return result;
}
//返回最新插入数据的id
public static int getLastId() {
int id = 0;
//利用SQL语句的函数将刚插入数据的id值取别别名为id
String sql = "select LAST_INSERT_ID() as id";
try {
Map<String, Object> map = qr.query(conn, sql, new MapHandler());
String n = map.get("id").toString();
id = Integer.parseInt(n);
System.out.println(sql);
} catch (SQLException e) {
e.printStackTrace();
}
return id;
}
//批处理操作-增加
public static int[] insertBatch(String sql, Object[][] params) {
int[] result = null;
try {
result = qr.batch(conn, sql, params);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return result;
}
//批处理操作-更新
public static int[] updateBatch(String sql, Object[][] params) {
int[] result = null;
try {
result = qr.batch(conn, sql, params);
} catch (SQLException e) {
e.printStackTrace();
}
return result;
}
//批处理操作-删除
public static int[] deleteBatch(String sql, Object[][] params) {
int[] result = null;
try {
result = qr.batch(conn, sql, params);
} catch (SQLException e) {
e.printStackTrace();
}
return result;
}
}
b)数据库配置文件dbutils.properties
driverClassName=com.mysql.jdbc.Driver
url=jdbc\:mysql\://10.1.40.61\:3306/test_bid_system?useUnicode\=true&characterEncoding\=utf8
username=root
password=root
c)测试类Test.java
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
//初始化数据库的连接
DBUtility.getInstance();
//insertOperation1();
//insertOperation2();
//insertOperation3();
//获取刚刚插入数据的ID
//int lastId = DBUtility.getLastId();
//System.out.println("刚插入数据的ID:"+lastId);
//queryOperation();
batchOperation();
}
//增加操作-不带参数增加记录,返回增加的记录条数
public static void insertOperation1() {
String sql = "insert into zx_user(userName,age) values('zx001',19)";
int num = DBUtility.insert(sql);
System.out.println("成功插入" + num + "条数据!");
}
//增加操作-带单独参数增加记录,返回增加的记录条数
public static void insertOperation2() {
String sql = "insert into zx_user(userName,age) values('zx002',?)";
Object param = 20;
int num = DBUtility.insertWithParam(sql, param);
System.out.println("成功插入" + num + "条数据!");
}
//增加操作-带参数数组增加记录,返回增加的记录条数
public static void insertOperation3() {
String sql = "insert into zx_user(userName,age) values(?,?)";
Object[] params = { "zx007", 27 };
int num = DBUtility.insertWithParams(sql, params);
System.out.println("成功插入" + num + "条数据!");
}
//查询操作-带参数数组查询唯一记录
public static void queryOperation() {
String sql = "select * from zx_user where userId=? and age=?";
Object[] params = { 8, 32 };
//DBUtils将ResultSet中的数据自动装配到内存中的JavaBean
UserBean ub = DBUtility.selectUniqueWithParams(sql, params,
new BeanHandler(UserBean.class));
System.out.println(ub.getUserName());
}
//批处理操作-增加
public static void batchOperation() {
String sql = "insert into zx_user(userName,age) values(?,?)";
Object[][] params = {
{ "zx101", 40 },
{ "zx102", 41 },
{ "zx103", 42 }
};
int[] num = DBUtility.insertBatch(sql, params);
for (int i = 0; i < num.length; i++) {
System.out.println(num[i]);
}
}
}
4)数据库字段
5)JavaBean的代码
就userId,userName,age三个变量,外加setter和getter方法,代码省略。
3.结束
以上代码就可以完成使用封装类DBUtility.java对数据库的访问,但在一开始就说明了,代码中使用的是静态的数据库连接,这就意味着当访问数据库的操作增多时将出现延迟甚至系统崩溃的问题。可供解决的办法就是使用数据库连接池,这在以后的文章中会写到。