1 package com.eshop.dao;
2
3 import java.lang.reflect.Field;
4 import java.lang.reflect.InvocationTargetException;
5 import java.lang.reflect.Method;
6 import java.sql.Connection;
7 import java.sql.DriverManager;
8 import java.sql.PreparedStatement;
9 import java.sql.ResultSet;
10 import java.sql.SQLException;
11 import java.util.ArrayList;
12 import java.util.List;
13
14
15 public class BaseDao {
16 private final String URL="jdbc:oracle:thin:@localhost:1521:orcl";//数据库连接
17 private final String dRIVERString="oracle.jdbc.driver.OracleDriver";
18 private final String USER="eshop";
19 private final String PASSWORD="tiger";
20
21 Connection conn=null;
22 PreparedStatement pstmt =null;
23
24 public void getConnection(){
25 try {
26 //1.加载驱动
27 Class.forName(dRIVERString);
28 //2.连接数据库
29 //只建立一次连接
30 //问题:如果多个人同时进入数据库(待解决多线程的问题)
31 if(conn==null){
32 conn= DriverManager.getConnection(URL,USER,PASSWORD);
33 }
34
35 } catch (Exception e) {
36 // TODO Auto-generated catch block
37 e.printStackTrace();
38 }
39 }
40
41 //封装增删改的方法,返回受影响的行数
42 public int executeUpdate(String sql,List<Object> parm){
43 getConnection();
44 int count=0;
45 try {
46 pstmt = conn.prepareStatement(sql) ;
47 if(parm!=null){
48 for(int i=0;i<parm.size();i++){
49 pstmt.setObject(i+1, parm.get(i));
50 }
51 }
52 //执行
53 count=pstmt.executeUpdate();
54
55 } catch (SQLException e) {
56 // TODO Auto-generated catch block
57 e.printStackTrace();
58 }
59 return count;
60
61 }
62
63 //封装查询的方法,获取结果集
64 public ResultSet executeQuery(String sql,List<Object> parm){
65 getConnection();
66 try {
67 PreparedStatement pstmt = conn.prepareStatement(sql) ;
68 if(parm!=null){
69 for(int i=0;i<parm.size();i++){
70 pstmt.setObject(i+1, parm.get(i));
71 }
72 }
73 //执行
74 ResultSet res=pstmt.executeQuery();
75 return res;
76
77 } catch (SQLException e) {
78 // TODO Auto-generated catch block
79 e.printStackTrace();
80 }
81 return null;
82
83 }
84 public <T> List<T> findModelListBySqlAndParam(String sql,List<Object> param,T t) {
85 //定义一个集合来存放需要转成的对象集合
86 List<T> list=new ArrayList<T>();
87 //获取当前类
88 Class<?> c=t.getClass();
89 //遍历结果集,封装成外界用户所需要的对象集合
90 //1>获取结果集
91 ResultSet rs=executeQuery(sql, param);
92 //2>开始遍历
93 try {
94 while(rs.next()){
95 //初始化对象
96 @SuppressWarnings("unchecked")
97 T obj= (T)c.newInstance();
98 //获取当前类一共多少个属性啊
99 Field[] fields=c.getDeclaredFields();
100 for(Field f:fields){
101 //获取当前属性的属性名子
102 String fname=f.getName();
103 //获取当前的属性的类型(简称) java.lang.String
104 String type=f.getType().getSimpleName();
105
106 //***************** 取出来当前属性对应的数据库的值了 ****************
107 //在此方法名中要求类的属性名和数据库的字段名相同
108 Object value=null;
109 if(type.equalsIgnoreCase("string")){
110 value=rs.getString(fname);
111 }else if(type.equalsIgnoreCase("int")){
112 value=rs.getInt(fname);
113 }else if(type.equalsIgnoreCase("Integer")){
114 value=rs.getInt(fname);
115 }else if(type.equalsIgnoreCase("Double")){
116 value=rs.getDouble(fname);
117 }else if(type.equalsIgnoreCase("Float")){
118 value=rs.getFloat(fname);
119 }else if(type.equalsIgnoreCase("date")){
120 value=rs.getDate(fname);
121 }else if(type.equalsIgnoreCase("long")){
122 value=rs.getLong(fname);
123 }
124 //***************** 将取出来当前属性的值设置给当前对象obj****************
125 //1>获取当前对象的所有set方法,并找到当前取出来的属性对应的set方法
126 Method[] methods=c.getDeclaredMethods();//获取所有的方法
127 for(Method m:methods){
128 //获取当前方法名
129 String methodName=m.getName();
130 //判断是不是当前属性
131 if(methodName.equalsIgnoreCase("set"+fname)){
132 //执行该方法
133 m.invoke(obj, value);
134 }
135 }
136 }
137 list.add(obj);
138 }
139 } catch (InstantiationException e) {
140 // TODO Auto-generated catch block
141 e.printStackTrace();
142 } catch (IllegalAccessException e) {
143 // TODO Auto-generated catch block
144 e.printStackTrace();
145 } catch (SecurityException e) {
146 // TODO Auto-generated catch block
147 e.printStackTrace();
148 } catch (IllegalArgumentException e) {
149 // TODO Auto-generated catch block
150 e.printStackTrace();
151 } catch (InvocationTargetException e) {
152 // TODO Auto-generated catch block
153 e.printStackTrace();
154 } catch (SQLException e) {
155 // TODO Auto-generated catch block
156 e.printStackTrace();
157 }
158 return list;
159 }
160
161
162
163 //获取订单编号
164 public int getSequenceIndex(String seq){
165 String sql="select "+seq+".nextval num from dual";
166 getConnection();
167 ResultSet rs=executeQuery(sql, null);
168 try {
169 if(rs.next()){
170 return rs.getInt("num");
171 }
172 } catch (SQLException e) {
173 // TODO Auto-generated catch block
174 e.printStackTrace();
175 }
176
177 return 0;
178
179 }
180
181
182
183
184 //关闭所有资源
185 public void closeAll(){
186 try {
187 if(pstmt!=null){
188 pstmt.close();
189 pstmt=null;//促进资源快速回收
190 }
191 if(conn!=null) conn.close();
192
193
194 } catch (SQLException e) {
195 // TODO Auto-generated catch block
196 e.printStackTrace();
197 }
198 }
199
200 }