package com.yanshu.util;
import java.io.IOException;
import java.io.InputStream;
import java.sql.CallableStatement;
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.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import com.yanshu.pojo.Emp;
/**
* JDBC连接数据库的工具类
* @author Administrator
*
*/
public class JdbcUtil {
//第一步:声明所有需要的静态的全局变量
private static final long serialVersionUID =1L;
private static final String JDBC_DRIVER;
private static final String DB_URL;
private static final String USER;
private static final String PASS;
private static final Properties pros;
public JdbcUtil() {
// TODO Auto-generated constructor stub
}
//第2不加载读取配置文件,并初始化静态变量
static
{
//读取和处理资源文件的信息
pros=new Properties();
try {
pros.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("application.properties"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
JDBC_DRIVER=pros.getProperty("spring.datasource.driver-class-name");
DB_URL=pros.getProperty("spring.datasource.url");
USER = pros.getProperty("spring.datasource.username");
PASS = pros.getProperty("spring.datasource.password");
}
//第二步要加载数据驱动
static{
try {
Class.forName(JDBC_DRIVER);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/*InputStream inputStream=JDBCUtil.class.getClassLoader().getResourceAsStream("jdbc.properties");
Properties pro=new Properties();
try {
pro.load(inputStream);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String diver=pro.getProperty("jdbc.driver");
String url=pro.getProperty("jdbc.url");
String user=pro.getProperty("jdbc.username");
String password=pro.getProperty("jdbc.password");*/
/**
* 获得数据库连接
* getConn()
* @return 返回数据库连接
*/
//第3步获得数据库连接
public static Connection getConn()
{
try {
return DriverManager.getConnection(DB_URL,USER,PASS);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
/**
* 释放资源
* @param rs 释放结果集ResultSet
* @param cs 释放存储过程 CallableStatement
* @param sta 释放执行sql的对象,静态的
* @param ps 释放执行sql的对象,预编译的
* @param conn 关闭连接
*/
//第4步释放资源
public static void closeConn(ResultSet rs, CallableStatement cs,Statement sta, PreparedStatement ps, Connection conn)
{
try {
if(rs!=null)
{
rs.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
if(null != cs)
{
cs.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
if(sta != null)
{
sta.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
if(ps != null)
{
ps.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
if(conn != null)
{
conn.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//==========================执行增删改的方法start================================================
/**
* 执行增删改的方法
* @param ps
* @param par
*/
public static void setUpdate(PreparedStatement ps,Object [] par)
{
if(par==null) return;
try {
for(int i=0;i<par.length;i++)
{
ps.setObject(i+1, par[i]);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 调用的是setUpdate的方法
* @param en
* @return
*/
public static int insertSpeak(Emp en) {
// TODO Auto-generated method stub
String sql="insert into emp(name,hobas) values(?,?)";
int count=0;
Connection con=null;
PreparedStatement ps=null;
try {
con=JdbcUtil.getConn();
ps=con.prepareStatement(sql);
Object [] par={en.getName(),en.getHobas()};
JdbcUtil.setUpdate(ps, par);
count=ps.executeUpdate();
} catch (SQLException e) {
// TODO Auto-generated catch block
}
finally
{
JdbcUtil.closeConn(null, null, ps, ps, con);
}
return count;
}
/**
* 要执行的方法
*/
public static void getEmp()
{
Emp emp=new Emp();
emp.setName("刘瑞光1");
emp.setHobas("刘瑞光1");
insertSpeak(emp);
System.out.println("---成功---");
}
//==========================执行增删改的方法end================================================
//==========================执行增删改的方法 使用PreparedStatement--start================================================
/**
* 执行增删改的方法 使用PreparedStatement
* @param sql
* @param objects 编写sql语句,可以使用占位符
*/
public static void update(String sql,Object...objects)
{
Connection conn=null;
PreparedStatement ps=null;
try {
conn=JdbcUtil.getConn();
ps=conn.prepareStatement(sql);
for(int i=0;i<objects.length;i++)
{
ps.setObject(i+1, objects[i]);
}
ps.executeUpdate();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally{
JdbcUtil.closeConn(null, null, null, ps, conn);
}
}
/**
* 执行方法
* @param emp
*/
public static void addNew(Emp emp)
{
String sql="insert into emp(name,hobas) values(?,?)";
update(sql,emp.getName(),emp.getHobas());
/**
Emp emp=new Emp();
emp.setName("2");
emp.setHobas("2");
JdbcUtil.addNew(emp);
*/
}
//==========================执行增删改的方法 使用PreparedStatement--end================================================
/**
* 单个查询的方法 用实体对象接收
* @param sql
* @param objects
* @return
*/
public static Emp getEmp(String sql,Object...objects)
{
Emp emp=null;
Connection conn=null;
PreparedStatement ps=null;
ResultSet rs=null;
conn=JdbcUtil.getConn();
try {
ps=conn.prepareStatement(sql);
//可以拿出来写一个方法,直接调用
for(int i=0;i<objects.length;i++)
{
ps.setObject(i+1, objects[i]);
}
rs=ps.executeQuery();
while(rs.next())
{
//1种
int id = rs.getInt("id");
String name = rs.getString("name");
System.out.println(rs.getInt("id")+" "
+rs.getString("name"));
/**
*结果
* 38 刘瑞光
39 刘瑞光
40 刘瑞光1
41 tom
42 2
*/
//2中实体对象
/*emp=new Emp();
emp.setName(rs.getString("name"));
emp.setId(rs.getInt("id"));
System.out.println(emp);*/
/**
* 结果
* Emp [id=38, name=刘瑞光, hobas=null]
Emp [id=39, name=刘瑞光, hobas=null]
Emp [id=40, name=刘瑞光1, hobas=null]
Emp [id=41, name=tom, hobas=null]
Emp [id=42, name=2, hobas=null]
*/
//3这地可以直接调用实体对象是构造器
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally {
JdbcUtil.closeConn(rs, null, ps, ps, conn);
}
return emp;
}
//========================== 查询方法用集合接收数据--================================================
/**
* 查询方法用集合接收数据
* @return
*/
public static List<Emp> queryColor() {
// TODO Auto-generated method stub
List<Emp> table =new ArrayList<Emp>();
Connection con=null;
Statement sta=null;
ResultSet re=null;
String sql="select * from emp";
try {
con=JdbcUtil.getConn();
sta=con.createStatement();
re=sta.executeQuery(sql);
while(re.next())
{
Emp emp=new Emp();
emp.setName(re.getString("name"));
emp.setId(re.getInt("id"));
table.add(emp);
System.out.println(emp);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally
{
JdbcUtil.closeConn(re, null, sta, null, con);
}
return table;
}
/**
* 通用的查询方法:可以根据传入的 SQL、Class 对象返回 SQL 对应的记录的对象
* @param clazz: 描述对象的类型
* @param sql: SQL 语句。可能带占位符
* @param args: 填充占位符的可变参数。
* @return
*/
public static <T>T findObject(Class<T> clapar,String sql,Object ...objects)
{
T entity=null;
Connection conn=null;
PreparedStatement ps=null;
ResultSet rs=null;
try {
conn=JdbcUtil.getConn();
ps=conn.prepareStatement(sql);
//可以拿出来写一个方法,直接调用
for(int i=0;i<objects.length;i++)
{
ps.setObject(i+1, objects[i]);
}
//1. 得到 ResultSet 对象
rs=ps.executeQuery();
//2. 得到 ResultSetMetaData 对象
ResultSetMetaData rsmd = rs.getMetaData();
//3. 创建一个 Map<String, Object> 对象, 键: SQL 查询的列的别名,
//值: 列的值
Map<String, Object> map = new HashMap<>();
//4. 处理结果集. 利用 ResultSetMetaData 填充 3 对应的 Map 对象
while(rs.next())
{
for(int i=0;i<rsmd.getColumnCount();i++)
{
String columnLabel=rsmd.getColumnLabel(i+1);
/*System.out.println("刘瑞光添加到columnLabel集合中的键和值:"+columnLabel);*/
Object columnValue=rs.getObject(i+1);
map.put(columnLabel, columnValue);
}
System.out.println("刘瑞光添加到map集合中的键和值:"+map);
}
//5. 若 Map 不为空集, 利用反射创建 clazz 对应的对象
if(map.size()>0)
{
entity=clapar.newInstance();
//5. 遍历 Map 对象, 利用反射为 Class 对象的对应的属性赋值.
for(Map.Entry<String, Object> en:map.entrySet())
{
String fieldName = en.getKey();
Object value = en.getValue();
ReflectionUtils.setFieldValue(entity, fieldName, value);
System.out.println(entity+"object1");
}
System.out.println(entity+"object2");
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally
{
JdbcUtil.closeConn(rs, null, ps, ps, conn);
}
return entity;
}
/**
* 查询方法的思路:
* 1加载驱动,
* 2连接数据库,
* 3创建sql语句执行对象 ,
* 3执行sql语句,
* 4对执行结果进行处理,
* 5关闭相关的连接对象(顺序跟声明的顺序相反)
* @throws SQLException
*/
public static void query() throws SQLException
{
String sql="select * from usersso";
// 首先要获取连接,即连接到数据库
Connection conn=getConn();
//创建sql语句执行对象 ,
Statement st = conn.createStatement();//创建sql执行对象
// 执行sql语句,
ResultSet rs=st.executeQuery(sql);
//5.处理结果集
while(rs.next()){
int id = rs.getInt("id");
String name = rs.getString("name");
System.out.println(rs.getInt("id")+" "
+rs.getString("name"));
}
closeConn(rs, null, st, null, conn);
}
/**
* 实现增删改的方法
* 1加载驱动,
* 2连接数据库,
* 3创建sql语句执行对象 ,
* 3执行sql语句,
* @throws SQLException
*/
public static void inset() throws SQLException
{
String sql="";
Connection conn=null;
Statement sta=null;
conn=getConn();
sta=conn.createStatement();
int i=sta.executeUpdate(sql);
closeConn(null, null, sta, null, conn);
}
/**
* 测试jdbc连接数据库是否成功
* @param args
* @throws ClassNotFoundException
* @throws SQLException
*/
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//query();
Emp emp=new Emp();
emp.setName("刘瑞光");
emp.setHobas("刘瑞光");
String sql="insert into emp(name,hobas) values(?,?)";
//exeUpdate(sql, emp.getName(),emp.getHobas());
}
}
import java.io.IOException;
import java.io.InputStream;
import java.sql.CallableStatement;
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.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import com.yanshu.pojo.Emp;
/**
* JDBC连接数据库的工具类
* @author Administrator
*
*/
public class JdbcUtil {
//第一步:声明所有需要的静态的全局变量
private static final long serialVersionUID =1L;
private static final String JDBC_DRIVER;
private static final String DB_URL;
private static final String USER;
private static final String PASS;
private static final Properties pros;
public JdbcUtil() {
// TODO Auto-generated constructor stub
}
//第2不加载读取配置文件,并初始化静态变量
static
{
//读取和处理资源文件的信息
pros=new Properties();
try {
pros.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("application.properties"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
JDBC_DRIVER=pros.getProperty("spring.datasource.driver-class-name");
DB_URL=pros.getProperty("spring.datasource.url");
USER = pros.getProperty("spring.datasource.username");
PASS = pros.getProperty("spring.datasource.password");
}
//第二步要加载数据驱动
static{
try {
Class.forName(JDBC_DRIVER);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/*InputStream inputStream=JDBCUtil.class.getClassLoader().getResourceAsStream("jdbc.properties");
Properties pro=new Properties();
try {
pro.load(inputStream);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String diver=pro.getProperty("jdbc.driver");
String url=pro.getProperty("jdbc.url");
String user=pro.getProperty("jdbc.username");
String password=pro.getProperty("jdbc.password");*/
/**
* 获得数据库连接
* getConn()
* @return 返回数据库连接
*/
//第3步获得数据库连接
public static Connection getConn()
{
try {
return DriverManager.getConnection(DB_URL,USER,PASS);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
/**
* 释放资源
* @param rs 释放结果集ResultSet
* @param cs 释放存储过程 CallableStatement
* @param sta 释放执行sql的对象,静态的
* @param ps 释放执行sql的对象,预编译的
* @param conn 关闭连接
*/
//第4步释放资源
public static void closeConn(ResultSet rs, CallableStatement cs,Statement sta, PreparedStatement ps, Connection conn)
{
try {
if(rs!=null)
{
rs.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
if(null != cs)
{
cs.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
if(sta != null)
{
sta.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
if(ps != null)
{
ps.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
if(conn != null)
{
conn.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//==========================执行增删改的方法start================================================
/**
* 执行增删改的方法
* @param ps
* @param par
*/
public static void setUpdate(PreparedStatement ps,Object [] par)
{
if(par==null) return;
try {
for(int i=0;i<par.length;i++)
{
ps.setObject(i+1, par[i]);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 调用的是setUpdate的方法
* @param en
* @return
*/
public static int insertSpeak(Emp en) {
// TODO Auto-generated method stub
String sql="insert into emp(name,hobas) values(?,?)";
int count=0;
Connection con=null;
PreparedStatement ps=null;
try {
con=JdbcUtil.getConn();
ps=con.prepareStatement(sql);
Object [] par={en.getName(),en.getHobas()};
JdbcUtil.setUpdate(ps, par);
count=ps.executeUpdate();
} catch (SQLException e) {
// TODO Auto-generated catch block
}
finally
{
JdbcUtil.closeConn(null, null, ps, ps, con);
}
return count;
}
/**
* 要执行的方法
*/
public static void getEmp()
{
Emp emp=new Emp();
emp.setName("刘瑞光1");
emp.setHobas("刘瑞光1");
insertSpeak(emp);
System.out.println("---成功---");
}
//==========================执行增删改的方法end================================================
//==========================执行增删改的方法 使用PreparedStatement--start================================================
/**
* 执行增删改的方法 使用PreparedStatement
* @param sql
* @param objects 编写sql语句,可以使用占位符
*/
public static void update(String sql,Object...objects)
{
Connection conn=null;
PreparedStatement ps=null;
try {
conn=JdbcUtil.getConn();
ps=conn.prepareStatement(sql);
for(int i=0;i<objects.length;i++)
{
ps.setObject(i+1, objects[i]);
}
ps.executeUpdate();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally{
JdbcUtil.closeConn(null, null, null, ps, conn);
}
}
/**
* 执行方法
* @param emp
*/
public static void addNew(Emp emp)
{
String sql="insert into emp(name,hobas) values(?,?)";
update(sql,emp.getName(),emp.getHobas());
/**
Emp emp=new Emp();
emp.setName("2");
emp.setHobas("2");
JdbcUtil.addNew(emp);
*/
}
//==========================执行增删改的方法 使用PreparedStatement--end================================================
/**
* 单个查询的方法 用实体对象接收
* @param sql
* @param objects
* @return
*/
public static Emp getEmp(String sql,Object...objects)
{
Emp emp=null;
Connection conn=null;
PreparedStatement ps=null;
ResultSet rs=null;
conn=JdbcUtil.getConn();
try {
ps=conn.prepareStatement(sql);
//可以拿出来写一个方法,直接调用
for(int i=0;i<objects.length;i++)
{
ps.setObject(i+1, objects[i]);
}
rs=ps.executeQuery();
while(rs.next())
{
//1种
int id = rs.getInt("id");
String name = rs.getString("name");
System.out.println(rs.getInt("id")+" "
+rs.getString("name"));
/**
*结果
* 38 刘瑞光
39 刘瑞光
40 刘瑞光1
41 tom
42 2
*/
//2中实体对象
/*emp=new Emp();
emp.setName(rs.getString("name"));
emp.setId(rs.getInt("id"));
System.out.println(emp);*/
/**
* 结果
* Emp [id=38, name=刘瑞光, hobas=null]
Emp [id=39, name=刘瑞光, hobas=null]
Emp [id=40, name=刘瑞光1, hobas=null]
Emp [id=41, name=tom, hobas=null]
Emp [id=42, name=2, hobas=null]
*/
//3这地可以直接调用实体对象是构造器
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally {
JdbcUtil.closeConn(rs, null, ps, ps, conn);
}
return emp;
}
//========================== 查询方法用集合接收数据--================================================
/**
* 查询方法用集合接收数据
* @return
*/
public static List<Emp> queryColor() {
// TODO Auto-generated method stub
List<Emp> table =new ArrayList<Emp>();
Connection con=null;
Statement sta=null;
ResultSet re=null;
String sql="select * from emp";
try {
con=JdbcUtil.getConn();
sta=con.createStatement();
re=sta.executeQuery(sql);
while(re.next())
{
Emp emp=new Emp();
emp.setName(re.getString("name"));
emp.setId(re.getInt("id"));
table.add(emp);
System.out.println(emp);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally
{
JdbcUtil.closeConn(re, null, sta, null, con);
}
return table;
}
/**
* 通用的查询方法:可以根据传入的 SQL、Class 对象返回 SQL 对应的记录的对象
* @param clazz: 描述对象的类型
* @param sql: SQL 语句。可能带占位符
* @param args: 填充占位符的可变参数。
* @return
*/
public static <T>T findObject(Class<T> clapar,String sql,Object ...objects)
{
T entity=null;
Connection conn=null;
PreparedStatement ps=null;
ResultSet rs=null;
try {
conn=JdbcUtil.getConn();
ps=conn.prepareStatement(sql);
//可以拿出来写一个方法,直接调用
for(int i=0;i<objects.length;i++)
{
ps.setObject(i+1, objects[i]);
}
//1. 得到 ResultSet 对象
rs=ps.executeQuery();
//2. 得到 ResultSetMetaData 对象
ResultSetMetaData rsmd = rs.getMetaData();
//3. 创建一个 Map<String, Object> 对象, 键: SQL 查询的列的别名,
//值: 列的值
Map<String, Object> map = new HashMap<>();
//4. 处理结果集. 利用 ResultSetMetaData 填充 3 对应的 Map 对象
while(rs.next())
{
for(int i=0;i<rsmd.getColumnCount();i++)
{
String columnLabel=rsmd.getColumnLabel(i+1);
/*System.out.println("刘瑞光添加到columnLabel集合中的键和值:"+columnLabel);*/
Object columnValue=rs.getObject(i+1);
map.put(columnLabel, columnValue);
}
System.out.println("刘瑞光添加到map集合中的键和值:"+map);
}
//5. 若 Map 不为空集, 利用反射创建 clazz 对应的对象
if(map.size()>0)
{
entity=clapar.newInstance();
//5. 遍历 Map 对象, 利用反射为 Class 对象的对应的属性赋值.
for(Map.Entry<String, Object> en:map.entrySet())
{
String fieldName = en.getKey();
Object value = en.getValue();
ReflectionUtils.setFieldValue(entity, fieldName, value);
System.out.println(entity+"object1");
}
System.out.println(entity+"object2");
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally
{
JdbcUtil.closeConn(rs, null, ps, ps, conn);
}
return entity;
}
/**
* 查询方法的思路:
* 1加载驱动,
* 2连接数据库,
* 3创建sql语句执行对象 ,
* 3执行sql语句,
* 4对执行结果进行处理,
* 5关闭相关的连接对象(顺序跟声明的顺序相反)
* @throws SQLException
*/
public static void query() throws SQLException
{
String sql="select * from usersso";
// 首先要获取连接,即连接到数据库
Connection conn=getConn();
//创建sql语句执行对象 ,
Statement st = conn.createStatement();//创建sql执行对象
// 执行sql语句,
ResultSet rs=st.executeQuery(sql);
//5.处理结果集
while(rs.next()){
int id = rs.getInt("id");
String name = rs.getString("name");
System.out.println(rs.getInt("id")+" "
+rs.getString("name"));
}
closeConn(rs, null, st, null, conn);
}
/**
* 实现增删改的方法
* 1加载驱动,
* 2连接数据库,
* 3创建sql语句执行对象 ,
* 3执行sql语句,
* @throws SQLException
*/
public static void inset() throws SQLException
{
String sql="";
Connection conn=null;
Statement sta=null;
conn=getConn();
sta=conn.createStatement();
int i=sta.executeUpdate(sql);
closeConn(null, null, sta, null, conn);
}
/**
* 测试jdbc连接数据库是否成功
* @param args
* @throws ClassNotFoundException
* @throws SQLException
*/
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//query();
Emp emp=new Emp();
emp.setName("刘瑞光");
emp.setHobas("刘瑞光");
String sql="insert into emp(name,hobas) values(?,?)";
//exeUpdate(sql, emp.getName(),emp.getHobas());
}
}