JDBC 总结
JDBC概述
JDBC(Java DataBase Connectivity):java连接数据库技术,是一项由sun(java创始公司)发布的用于java连接数据库的通用标准,这套标准由一系列的接口(Connection,Statement,ResultSet等)构成,旨在屏蔽不同数据库之间的差异,使得开发者无需关注不同数据库系统之间的差异,简化java连接数据库的步骤。
JDBC操作数据库步骤(以mysql为例)
JDBC增删改操作
-
加载驱动(jdk4不在需要写,系统自动添加)
Class.forName("com.mysql.jdbc.Driver");
-
获取连接
-- mydb 是 mysql 下的一个数据库实例 -- root是登入用户 -- 123456是登入密码 Connection cn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/mydb","root","123456");
-
获取预处理对象
//插入语句 String sql = " insert into student values(1,'jok','男')"; PreparedStatement ps =cn.prepareStatement(sql);
-
执行sql
int i = ps.executeUpdate();
-
处理结果
if(i>0) System.out.println("插入成功");
-
关闭资源
ps.close(); cn,close();
JDBC查询操作
//准备sql语句
String sql = "select * from emp where eno=?";
//获取连接
Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/mydb", "root", "123456");
//对SQL语句预处理(编译)并获取预处理对象
PreparedStatement ps = conn.prepareStatement(sql);
ps.setObject(1, 1001);
//执行查询
ResultSet rs = ps.executeQuery();
if(rs.next()){
int no = rs.getInt("eno");
String name = rs.getString("ename");
BigDecimal sal = rs.getBigDecimal("sal");
Date date = rs.getDate("hiredate");//java.sql.Date
int dno = rs.getInt("dno");
System.out.println(no+"/"+name+"/"+sal+"/"+date+"/"+dno);
}else{
System.out.println("未查询到数据");
}
//关闭资源
rs.close();
ps.close();
conn.close();
JDBC的封装
封装了数据库的增删改查操作,其中运用到了属性文件、线程、连接池、反射等知识。
属性文件:
## mysql
driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/mydb
user=root
password=123456
maxActive=10
minIdle=1
maxWait=10000
/**
* 数据库工具类,包含一些操作数据库简便方法
* 1.获取连接
* 2.关闭资源
* @author Administrator
*
*/
public class DButils {
public static String driverClass;
public static String url;
public static String user;
public static String password;
public static int maxActive;
public static int mixIdle;
public static long maxWait;
private static DruidDataSource dataSource;
static{
init();
}
public static Connection getConn() {
//判断连接池是否为空或者关闭,是就初始化
if(dataSource == null || dataSource.isClosed())
{
init();
}
try {
return dataSource.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
//初始化
private static synchronized void init() {
try {
Properties prop = new Properties();
prop.load(new FileInputStream("src/jdbc.properties"));
driverClass = prop.getProperty("driverClass");
url = prop.getProperty("url");
user = prop.getProperty("user");
password = prop.getProperty("password");
maxActive = Integer.parseInt( prop.getProperty("maxActive"));
mixIdle = Integer.parseInt(prop.getProperty("minIdle"));
maxWait = Long.parseLong(prop.getProperty("maxWait"));
//创建数据源并配置
dataSource = new DruidDataSource();
dataSource.setDriverClassName(driverClass);
dataSource.setUrl(url);
dataSource.setUsername(user);
dataSource.setPassword(password);
dataSource.setMaxActive(maxActive);
dataSource.setMinIdle(mixIdle);
dataSource.setMaxWait(maxWait);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
//关闭连接池
public static synchronized void closePool(){
if(dataSource != null)
dataSource.close();
}
/**
* 封装通用增删改操作
* @param url
* @return
*/
public static int exeUpdate(String sql,Connection conn,Object... params){
PreparedStatement ps=null;
int in=0;
try {
//编译sql语句获取预处理对象
ps = conn.prepareStatement(sql);
if(Objects.nonNull(params)){
for(int i = 0;i< params.length;i++){
ps.setObject(i+1, params[i]);
}
}
in = ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}finally{
//关闭资源
close(null,ps,null);
}
return in;
}
/**
* 封装通用的查询集合操作,对于任何形式的查询,都能返回一个对象集合
* @param t 需要返回的数据类型
* @param sql 目标查询语句
* @param params 执行查询所需的参数
* @return 返回包含了指定对象的集合
*/
public static <T> List<T> selectList(Class<T> t,String sql,Object... params){
//声明空集合
List<T> data = new ArrayList<>();
//获取查询结果信息
List<Map<String,Object>> list = getDataPair(sql, params);
//判断集合是否为空
if(list.isEmpty()){
return data;
}
//遍历集合
for(Map<String, Object> map : list)
{
//得到一个T类型对象
T obj = parseMapToObj(map,t);
//把得到的对象添加到集合data中
data.add(obj);
}
return data;
}
/**
* 封装通用查询对象操作,对于任何形式的查询,都能返回一个确定的对象
* @param t 需要返回的数据类型
* @param sql 目标查询语句
* @param params 执行查询所需的参数
* @return 返回包含了指定对象
*/
public static <T> T selectOne(Class<T> t,String sql,Object... params){
List<Map<String,Object>> list = getDataPair(sql, params);
//判断集合不为空
if(!list.isEmpty())
{
//得到一个map集合
Map<String,Object> map = list.get(0);
//把map集合里的数据转换成一个对象
T obj = parseMapToObj(map,t);
return obj;
}
return null;
}
/**
* 解析指定查询语句,并将获取的数据<列名,列值>以集合形式返回
* @param sql 查询语句
* @param params 参数列表
* @return
*/
private static List<Map<String,Object>> getDataPair(String sql,Object... params){
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
List<Map<String,Object>> list = new ArrayList<>();
try {
conn = getConn();
ps = conn.prepareStatement(sql);
if(Objects.nonNull(params)){
for(int i = 0;i<params.length;i++){
ps.setObject(i+1, params[i]);
}
}
rs = ps.executeQuery();
//获取结果集源数据
ResultSetMetaData rsmd = rs.getMetaData();
//获取列总数,列名,标签名,列值,等相关数据存储到map集合
int count = rsmd.getColumnCount();
while(rs.next()){
//对结果集每遍历一次,获取一条数据(即一个map对象)
Map<String,Object> map = new HashMap<>();
//遍历每一列
for (int i = 1; i <= count; i++) {
//获取列名称
String columName = rsmd.getColumnName(i);
//获取标签名(列别名)
String columnLabel = rsmd.getColumnLabel(i);
//获取列值
Object value = rs.getObject(columnLabel);
//当列值不为null是才将数据存入集合
if(Objects.nonNull(value)){
//将数据存入Map
map.put(columName, value);
}
}
//将map集合存入List
list.add(map);
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
DButils.close(rs, ps, conn);
}
return list;
}
/**
*把一个Map集合转换成一个对象
*/
private static <T> T parseMapToObj(Map<String, Object> map, Class<T> t) {
T obj = null;
try {
//创建一个空实例
obj = t.newInstance();
//获取map集合的键集(所有列名,即要返回对象的属性名)
Set<String> keys = map.keySet();
for(String cname : keys){
//获取属性对象
Field f = t.getDeclaredField(cname);
//获取set方法名称
String setMethodName = "set"+cname.substring(0, 1).toUpperCase()+cname.substring(1);
//获取set方法对象
Method method = t.getMethod(setMethodName, f.getType());
method.invoke(obj, map.get(cname));
}
} catch (InstantiationException | IllegalAccessException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
return obj;
}
}