DBUtils是java编程中数据库操作的使用工具,封装了对JDBC的操作,简化了JDBC操作,减少代码的书写量
使用时导入架包
DBUtils三个核心功能介绍
1.QueryRunner中提供对sql语句操作的API(也是最主要的)
2.ResultSetHandler接口,用于定义select操作后,怎么封装结果集
3.DbUtil类,它是一个工具类,定义了关闭资源与事务处理的方法
1.QueryRunner核心类
2.ResultSetHandler结果集处理类
红色的是要熟练掌握
3.DbUtil类工具类
closeQuietly(Connetcion conn)关闭连接,如果有异常try后不抛
commitAndCloseQuietly(Connection conn)提交并关闭连接
rollbackAndCloseQuietly(Connection conn)回滚并关闭连接
增删改的使用(基本相似)
这里C3P0Utils.getDataSource()是自己书写的获取DataSource的工具类
package cn.itheima.jdbc.test;
import java.sql.SQLException;
import org.apache.commons.dbutils.QueryRunner;
import org.junit.Test;
import cn.itheima.jdbc.utils.C3P0Utils;
/**
* 测试DBUtils工具类的增删改操作
*
* @author Never Say Never
* @date 2016年7月31日
* @version V1.0
*/
public class TestDBUtils1 {
/**
* 添加所有用户方法
*/
@Test
public void testAddUser() {
try {
// 1.创建核心类QueryRunner
QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
// 2.编写SQL语句
String sql = "insert into tbl_user values(null,?,?)";
// 3.为站位符设置值
Object[] params = { "余淮", "耿耿" };
// 4.执行添加操作
int rows = qr.update(sql, params);
if (rows > 0) {
System.out.println("添加成功!");
} else {
System.out.println("添加失败!");
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 根据id修改用户方法
*
*/
@Test
public void testUpdateUserById() {
try {
// 1.创建核心类QueryRunner
QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
// 2.编写SQL语句
String sql = "update tbl_user set upassword=? where uid=?";
// 3.为站位符设置值
Object[] params = { "xxx", 21 };
// 4.执行添加操作
int rows = qr.update(sql, params);
if (rows > 0) {
System.out.println("修改成功!");
} else {
System.out.println("修改失败!");
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 根据id删除用户方法
*/
@Test
public void testDeleteUserById() {
try {
// 1.创建核心类QueryRunner
QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
// 2.编写SQL语句
String sql = "delete from tbl_user where uid=?";
// 3.为站位符设置值
Object[] params = {19};
// 4.执行添加操作
int rows = qr.update(sql, params);
if (rows > 0) {
System.out.println("删除成功!");
} else {
System.out.println("删除失败!");
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
查询
package cn.itheima.jdbc.test;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
import org.apache.commons.dbutils.QueryRunner;
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.MapListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import org.junit.Test;
import cn.itheima.domain.User;
import cn.itheima.jdbc.utils.C3P0Utils;
/**
* 测试DBUtils查询操作
*
* @author Never Say Never
* @date 2016年7月31日
* @version V1.0
*/
public class TestDBUtils2 {
/*
* 查询所有用户方法
*/
@Test
public void testQueryAll() {
try {
// 1.获取核心类queryRunner
QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
// 2.编写sql语句
String sql = "select * from tbl_user";
// 3.执行查询操作
List<User> users = qr.query(sql, new BeanListHandler<User>(User.class));
// 4.对结果集集合进行遍历
for (User user : users) {
System.out.println(user.getUname() + " : " + user.getUpassword());
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
/*
* 根据id查询用户方法
*/
@Test
public void testQueryUserById() {
try {
// 1.获取核心类queryRunner
QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
// 2.编写sql语句
String sql = "select * from tbl_user where uid=?";
//3.为占位符设置值
Object[] params = {21};
// 4.执行查询操作
User user = qr.query(sql, new BeanHandler<User>(User.class), params);
System.out.println(user.getUname() + " : " + user.getUpassword());
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
/*
* 根据所有用户的总个数
*/
@Test
public void testQueryCount() {
try {
// 1.获取核心类queryRunner
QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
// 2.编写sql语句
String sql = "select count(*) from tbl_user";
// 4.执行查询操作
Long count = (Long) qr.query(sql, new ScalarHandler());
System.out.println(count);
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
/*
* 查询所有用户方法
*/
@Test
public void testQueryAll1() {
try {
// 1.获取核心类queryRunner
QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
// 2.编写sql语句
String sql = "select * from tbl_user";
// 3.执行查询操作
List<Map<String, Object>> list = qr.query(sql, new MapListHandler());
// 4.对结果集集合进行遍历
for (Map<String, Object> map : list) {
System.out.println(map);
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
/*
* 查询所有用户方法
*/
@Test
public void testQueryAll2() {
try {
// 1.获取核心类queryRunner
QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource());
// 2.编写sql语句
String sql = "select * from tbl_user";
// 3.执行查询操作
List<Object> list = qr.query(sql, new ColumnListHandler("uname"));
// 4.对结果集集合进行遍历
for (Object object : list) {
System.out.println(object);
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
BaseDao
这里的话可以使用连接池,这里的话是没有使用连接池的
package cn.dbc;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class BaseDao
{
public Connection getConenction()
{
Connection conn=null;
try
{
Class.forName("oracle.jdbc.driver.OracleDriver");
conn=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl","pl","123456");
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
return conn;
}
public void closeConn(Connection conn,PreparedStatement pstmt,ResultSet rs)
{
try
{
if(rs!=null)
{
rs.close();
}
if(pstmt!=null)
{
pstmt.close();
}
if(conn!=null)
{
conn.close();
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
//这里是进行增删改的集成操作
public boolean update(String sql,List<Object> lp)
{
boolean isFlag=false;
Connection conn=getConenction();
PreparedStatement pstmt=null;
ResultSet rs=null;
if(conn!=null)
{
try
{
pstmt=conn.prepareStatement(sql);
if(lp.size()>0)
{
for(int i=0;i<lp.size();i++)
{
pstmt.setObject(i+1,lp.get(i));
}
}
int num=pstmt.executeUpdate();
if(num>0)
{
isFlag=true;
}
}
catch (SQLException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
finally
{
closeConn(conn, pstmt, rs);
}
}
return isFlag;
}
//这里的<T>List<T>表示的是任意封装类的集合
@SuppressWarnings({ "unchecked", "rawtypes" })
public <T>List<T> query(String sql,List<Object> lp,Class clazz)
{
List<T> list=new ArrayList<T>();
Connection conn=getConenction();
PreparedStatement pstmt=null;
ResultSet rs=null;
if(conn!=null)
{
try
{
pstmt=conn.prepareStatement(sql);
if(lp.size()>0)
{
for(int i=0;i<lp.size();i++)
{
pstmt.setObject(i+1,lp.get(i));
}
}
rs=pstmt.executeQuery();
while(rs.next())
{
//这里是利用了反射,将我们所需要的封装类通过反射new对象
Object obj=clazz.newInstance();
//这里的话rs.getMetaData()得到的是数据库的表结构
ResultSetMetaData rm=rs.getMetaData();
int num=rm.getColumnCount();
for(int i=1;i<=num;i++)
{
//这里因为oracle所有的列名都是大写的,而封装类中的属性都是小写的,所以需要进行toLowerCase()操作转为小写
//mysql数据库的话就不需要转化
String name=rm.getColumnName(i).toLowerCase();
//getDeclaredField(name)这里要加上declared,然后不能获取到私有属性
Field f=clazz.getDeclaredField(name);
Object o=rs.getObject(i);
/*这里需要进行判断是因为oracle数据库中没有int等基本数据类型,只有number,所以需要判断
常用的是double类型和int类型,所以这里只对这俩种类型进行了判断
如果是mysql就不需要进行判断
*/
if(o.getClass().getName().equals("java.math.BigDecimal"))
{
if(f.getType().getName().equals("int"))
{
int m=Integer.valueOf(o.toString());
f.setAccessible(true);
f.set(obj,m);
}
if(f.getType().getName().equals("double"))
{
double m=Double.valueOf(o.toString());
//对私有属性赋值是要加上f.setAccessible(true);
f.setAccessible(true);
//这里表示的意思是将obj对象的f属性赋值为m
f.set(obj,m);
}
}
else
{
f.setAccessible(true);
f.set(obj,o);
}
}
list.add((T)obj);
}
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
finally
{
closeConn(conn, pstmt, rs);
}
}
return list;
}
}
package com.gdut;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
//mysql 通用连接数据库的模板
public class MysqlTest {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement pstm = null;
ResultSet rst = null;
String sql = "select * from dep where id = ?";
List<Object>lp = new ArrayList<Object>();
lp.add(1);
List<Dep> dep = chaxu(conn, pstm, rst, sql, lp, Dep.class);
for(Dep dep1:dep)
{
System.out.println(dep1.getId()+" "+dep1.getName()+" "+dep1.getNum());
}
// lp.add(6);
// lp.add("f");
// lp.add(6);
// zsg(conn, pstm, rst, sql, lp);
}
public static void zsg(Connection conn,PreparedStatement pstm,ResultSet rst,String sql,List<Object>lp)
{
try {
//加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//创建连接
conn = DriverManager.getConnection("jdbc:mysql://101.200.132.173:3306/erp", "root", "123456");
//sql语句
pstm = conn.prepareStatement(sql);
if(lp.size()>0)
{
for(int i = 0;i<lp.size();i++)
{
pstm.setObject(i+1, lp.get(i));
}
}
int num = pstm.executeUpdate();
if(num!=0)
{
System.out.println("增删改成功!");
}
close(conn, pstm, rst);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@SuppressWarnings("unchecked")
public static <T>List<T> chaxu(Connection conn,PreparedStatement pstm,ResultSet rst,String sql,List<Object>lp,Class clas)
{
List<T>list = new ArrayList<T>();
try {
//加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//创建连接
conn = DriverManager.getConnection("jdbc:mysql://101.200.132.173:3306/erp", "root", "123456");
//sql语句
pstm = conn.prepareStatement(sql);
if(lp.size()>0)
{
for(int i = 0;i<lp.size();i++)
{
pstm.setObject(i+1, lp.get(i));
}
}
rst = pstm.executeQuery();
while(rst.next())
{
Object obj = clas.newInstance();
//这里的话是得到了表的结构
ResultSetMetaData rm = rst.getMetaData();
int num = rm.getColumnCount();
for(int i = 0;i<num;i++)
{
//这里是得到每一列所对应的名字
String name = rm.getColumnName(i+1);
//获取类中的属性
Field filed = clas.getDeclaredField(name);
//获取某一列的值
Object o = rst.getObject(i+1);
//如果有私有属性的话必须加上这个
filed.setAccessible(true);
//这个意思是给obj附上o的值
filed.set(obj, o);
}
list.add((T)obj);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return list;
}
public static void close(Connection conn,PreparedStatement pstm,ResultSet rst)
{
try {
if(conn!=null)
{
conn.close();
}
if(pstm!=null)
{
pstm.close();
}
if(rst!=null)
{
rst.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}