使用JAVA对数据库的记录进行操作(初步)

时间:2022-03-22 07:04:09

主要的操作部分

  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对数据库的记录进行操作(初步)

到这里就结束了,需要注意的是我配置文件和java文件是放在同一个包里面的