主要的操作部分
1 package sqlUtil; 2 3 import java.lang.reflect.Field; 4 import java.sql.*; 5 /** 6 * 7 * @author AsceticJ 8 * @date 2017年4月1日 下午4:43:12 9 * @version 1.2 10 11 * @TODO 已知表对应这java数据中的某个类,利用java操控数据库和这个类 12 * 1、查询记录 13 * 2、插入记录 14 * 3、修改记录 15 * 4、删除记录 16 */ 17 public class SqlUtil3 implements ISql{ 18 19 public static void main(String[] args) 20 { 21 String tableName = "emp";//也就是类名 22 SqlUtil3 sqlUtil = new SqlUtil3(); 23 // //查询---占位符代表的字段的值 24 String sql1 = "select empno,ename,sal,comm,deptno from emp where deptno=?"; 25 String[] params1 = {"30"}; 26 sqlUtil.sqldml(tableName,sql1,params1,false); 27 //插入 28 // String sql2 = "insert into emp (empno,ename,sal,deptno) values(?,?,?,?)"; 29 // String[] params2 = {"9527","唐伯虎","2000","30"}; 30 // sqlUtil.sqldml(tableName,sql2,params2,true); 31 // //修改 32 // String sql3 = "update emp set sal=?,comm=? where empno=?"; 33 // String[] params3 = {"4000","2000","9527"}; 34 // sqlUtil.sqldml(tableName,sql3,params3,true); 35 // //删除 36 // String sql4 = "delete emp where empno=?"; 37 // String[] params4 = {"9527"}; 38 // sqlUtil.sqldml(tableName,sql4,params4,true); 39 } 40 41 //利用反射获取类中属性的字符串数组的函数----这里我没使用他,因为懒得建一个类 42 public static String[] getFieldStrs(String tableName){ 43 //用于存放字段的StringBuffer 44 StringBuffer strTemp = new StringBuffer(); 45 try 46 { 47 //获取表名对应的类 48 Class cls = Class.forName(tableName); 49 //获取字段集合 50 Field[] fs = cls.getDeclaredFields(); 51 for(int i=0;i<fs.length;i++){ 52 strTemp.append(fs[i].getName()+","); 53 } 54 } catch (ClassNotFoundException e) 55 { 56 System.err.println("Can't Find Class "+tableName);; 57 } 58 return strTemp.toString().split(","); 59 } 60 61 62 //操作数据库函数 flag为真表示只向数据库提交,为假表示查询语句 63 public void sqldml(String tableName,String sql,String[] params,boolean flag){ 64 Connection conn=null; 65 PreparedStatement pStatement=null; 66 ResultSet rs=null; 67 try 68 { 69 //建立连接 70 conn = UserPreData.getConnection(); 71 //预编译并存储sql语句 72 pStatement = conn.prepareStatement(sql); 73 //设置占位符代表的参数的值 74 for(int i=0;i<params.length;i++){ 75 pStatement.setString(i+1,params[i]); 76 } 77 78 if(flag){ 79 //提交sql语句完成对数据库数据的操作 80 pStatement.execute(); 81 }else{ 82 //获取sql语句执行后的结果集合 83 rs = pStatement.executeQuery(); 84 params = getFieldsAll(rs); 85 while(rs.next()){ 86 System.out.println(getResult(rs,params)); 87 } 88 System.err.println("The End..."); 89 } 90 } catch (SQLException e) 91 { 92 e.printStackTrace(); 93 }finally{ 94 closeResource(rs,pStatement,conn); 95 } 96 } 97 98 //利用ResultSetMetaData获取表中字段的字符串数组的函数 99 public static String[] getFieldsAll(ResultSet rs){ 100 StringBuffer strbuff = new StringBuffer(); 101 try 102 { 103 ResultSetMetaData rsmd = rs.getMetaData(); 104 for (int i = 1; i <= rsmd.getColumnCount(); i++) 105 { 106 strbuff.append(rsmd.getColumnName(i)+","); 107 } 108 } catch (SQLException e) 109 { 110 e.printStackTrace(); 111 } 112 String[] str = strbuff.toString().split(","); 113 return str; 114 } 115 //将查询的字段组成字符串的函数 116 public static String getResult(ResultSet rs,String[] params) throws SQLException{ 117 if(params==null){return null;} 118 String str = ""; 119 for(int i=0;i<params.length;i++){ 120 str+=params[i]+"="+rs.getString(i+1)+" "; 121 } 122 return str; 123 } 124 //关闭资源的函数 125 public static void closeResource(ResultSet rs,PreparedStatement pStatement,Connection conn){ 126 if(rs!=null){ 127 try{ 128 rs.close(); 129 } catch (SQLException e) 130 { 131 rs=null; 132 } 133 } 134 if(pStatement!=null){ 135 try{ 136 pStatement.close(); 137 } catch (SQLException e) 138 { 139 pStatement=null; 140 } 141 } 142 if(conn!=null){ 143 try{ 144 conn.close(); 145 } catch (SQLException e) 146 { 147 conn=null; 148 } 149 } 150 } 151 }
建的一个接口方便以后更新;
1 package sqlUtil; 2 3 /** 4 * @author AsceticJ 5 * @date 2017年4月1日 下午4:52:12 6 * @version 1.0 7 8 * @TODO 用于提供数据库操作方法的接口 9 */ 10 public interface ISql 11 { 12 /** 13 * @param tableName 表名=类名 14 * @param sql sql语句用于操作数据库 15 * @param params sql中用占位符代替的部分 16 * @return 17 */ 18 public void sqldml(String tableName,String sql,String[] params,boolean flag); 19 }
这个是辅助类用于连接和关闭资源:
1 package sqlUtil; 2 3 import java.io.FileInputStream; 4 import java.io.IOException; 5 import java.sql.Connection; 6 import java.sql.DriverManager; 7 import java.sql.SQLException; 8 import java.util.Properties; 9 10 /*用于获取用户的配置信息*/ 11 class UserPreData{ 12 /* 13 将用户配置另外存储,方便更新,动态管理 14 private static String driver="oracle.jdbc.driver.OracleDriver"; 15 private static String url="jdbc:oracle:thin:@localhost:1525:ASCETIC"; 16 private static String user="scott"; 17 private static String password="lmtzxujia"; 18 */ 19 private static Properties properties; 20 //使用静态代码块来初始化将用户配置导入 21 static{ 22 try { 23 //载入配置文件 24 properties=new Properties(); 25 properties.load(new FileInputStream("src/sqlUtil/sql.properties")); 26 }catch (IOException e) { 27 e.printStackTrace();//配置文件读入出错 28 } 29 } 30 31 //使用单例模式,来维护用户配置信息 32 //通过静态内部类来获取单例对象 33 private static class UserPDhold{ 34 private static UserPreData userPreData = new UserPreData(); 35 } 36 //修改构造函数的权限,用于维护单例 37 private UserPreData(){} 38 //获取单例对象的函数 39 public static UserPreData getInstance(){ 40 return UserPDhold.userPreData; 41 } 42 43 //建立连接的函数 44 public static Connection getConnection(){ 45 Connection conn = null; 46 try 47 { 48 Class.forName(properties.getProperty("driver")); 49 conn = DriverManager.getConnection(properties.getProperty("url"), properties.getProperty("userName"), properties.getProperty("password")); 50 } catch (ClassNotFoundException e) 51 { 52 e.printStackTrace(); 53 } catch (SQLException e) 54 { 55 e.printStackTrace(); 56 } 57 return conn; 58 } 59 }
这个是配置文件,信息就自己写咯:
到这里就结束了,需要注意的是我配置文件和java文件是放在同一个包里面的