JDBC连接SQLServer数据库(增强封装版)

  1 package dao;
  2
  3 import java.lang.reflect.Field;
  4 import java.lang.reflect.Method;
  5 import java.sql.Connection;
  6 import java.sql.DriverManager;
  7 import java.sql.PreparedStatement;
  8 import java.sql.ResultSet;
  9 import java.sql.SQLException;
 10 import java.util.ArrayList;
 11 import java.util.List;
 12
 13 public class BaseDAO {
 14
 15     // 驱动类全名(包名.类名)
 16     private static final String DRIVER = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
 17     // 连接的URL
 18     private static final String URL = "jdbc:sqlserver://localhost\\sqlexpress:1433;DatabaseName=bookdb";
 19     // 登录SQLserver用户名和密码
 20     private static final String USERNAME = "sa";
 21     private static final String PWD = "ghp418512";
 22
 23     // 数据库对象声明
 24     private Connection con = null;
 25     private PreparedStatement pst = null;
 26     private ResultSet rs = null;
 27
 28     /**
 29      * 加载驱动,建立连接
 30      *
 31      * @throws ClassNotFoundException
 32      * @throws SQLException
 33      */
 34     private void getConnection() throws ClassNotFoundException, SQLException {
 35         // 加载驱动
 36         Class.forName(DRIVER);
 37         // 建立连接
 38         con = DriverManager.getConnection(URL, USERNAME, PWD);
 39     }
 40
 41     /**
 42      * 执行查询
 43      *
 44      * @param sql
 45      *            执行的参数化SQL语句 select * from where name=? and pwd=?
 46      * @param params
 47      *            Object数组,封装所有SQL语句参数,顺序与SQL语句的参数顺序一致,new Object[]{name,pwd}
 48      * @return ResultSet 返回执行后的结果集
 49      */
 50     public ResultSet execQuery(String sql, Object[] params) {
 51         try {
 52             getConnection();
 53
 54             pst = con.prepareStatement(sql);
 55
 56             setPrepareStatementParams(params);
 57
 58             rs = pst.executeQuery();
 59
 60         } catch (SQLException e) {
 61             e.printStackTrace();
 62         } catch (ClassNotFoundException e) {
 63             e.printStackTrace();
 64         }
 65         return rs;
 66     }
 67
 68     /**
 69      * 执行SQL查询语句,并返回泛型集合List<T> 调用示例:<br/>
 70      * String sql="select * from book"; <br />
 71      * List<Book> bookList=super.execQueryAndPackagingList(sql, null, new
 72      * Book());
 73      *
 74      * @param sql
 75      *            要执行的SQL查询语句,必须有结果返回,并与实体类型T匹配
 76      * @param params
 77      *            SQL语句的参数
 78      * @param t
 79      *            封装的实体类型对象
 80      * @return 泛型集合List<T>
 81      */
 82     public <T> List<T> execQueryAndPackagingList(String sql, Object[] params,
 83             T t) {
 84         rs = execQuery(sql, params);
 85         List<T> tlist = null;
 86         try {
 87
 88             tlist = setAllSetters(t, rs);
 89
 90         } catch (SQLException e) {
 91             e.printStackTrace();
 92         } finally {
 93             closeAll();
 94         }
 95         return tlist;
 96     }
 97
 98     /**
 99      * 执行增加、删除、修改SQL操作
100      *
101      * @param sql
102      *            执行的参数化SQL语句
103      * @param params
104      *            Object数组,封装所有SQL语句参数
105      * @return int 受影响的行数,-1表示出现异常
106      */
107     public int execUpdate(String sql, Object[] params) {
108
109         try {
110             getConnection();
111             pst = con.prepareStatement(sql);
112
113             setPrepareStatementParams(params);
114
115             int affectedRows = pst.executeUpdate();
116             return affectedRows;
117         } catch (ClassNotFoundException e) {
118             e.printStackTrace();
119         } catch (SQLException e) {
120             e.printStackTrace();
121         } finally {
122             closeAll();
123         }
124         return -1;
125
126     }
127
128     /**
129      * 为PrepareStatement设置参数
130      *
131      * @param params
132      *            参数数组
133      * @throws SQLException
134      */
135     private void setPrepareStatementParams(Object[] params) throws SQLException {
136         if (params != null) {
137             for (int i = 0; i < params.length; i++) {
138                 pst.setObject(i + 1, params[i]);
139             }
140         }
141     }
142
143     /**
144      * 关闭Connection,PrepareStatement,Result
145      */
146     public void closeAll() {
147         try {
148
149             if (rs != null) {
150                 rs.close();
151             }
152             if (pst != null) {
153                 pst.close();
154             }
155             if (con != null) {
156                 con.close();
157             }
158
159         } catch (SQLException e) {
160             e.printStackTrace();
161         }
162     }
163
164     /**
165      * 将查询结果(ResultSet)自动封装为泛型集合(List<T>)
166      *
167      * @param ob
168      *            封装的实体,其属性名必须与数据字段名一致,并提供有set***,get***方法
169      * @param rs
170      *            要封装的ResultSet
171      * @return 泛型List集合(List<T>
172      * @throws SQLException
173      *             此方法可能抛出SQLException异常
174      */
175     private <T> List<T> setAllSetters(T ob, ResultSet rs) throws SQLException {
176
177         Class cls = ob.getClass();
178         List<T> tlist = new ArrayList<T>();
179         T t = null;
180
181         while (rs.next()) {
182
183             try {
184                 t = (T) ob.getClass().newInstance();
185             } catch (InstantiationException e1) {
186
187                 e1.printStackTrace();
188             } catch (IllegalAccessException e1) {
189
190                 e1.printStackTrace();
191             }
192
193             for (Field field : cls.getDeclaredFields()) {
194                 for (Method method : cls.getMethods()) {
195                     if ((method.getName().startsWith("set"))
196                             && (method.getName().length() == (field.getName()
197                                     .length() + 3))) {
198                         if (method.getName().toLowerCase()
199                                 .endsWith(field.getName().toLowerCase())) {
200                             try {
201                                 method.setAccessible(true);
202                                 if (field.getType().getSimpleName()
203                                         .toLowerCase().endsWith("integer"))
204                                     method.invoke(t, rs.getInt(field.getName()
205                                             .toLowerCase()));
206                                 else if (field.getType().getSimpleName()
207                                         .toLowerCase().endsWith("long"))
208                                     method.invoke(t, rs.getLong(field.getName()
209                                             .toLowerCase()));
210                                 else if (field.getType().getSimpleName()
211                                         .toLowerCase().endsWith("string"))
212                                     method.invoke(t, rs.getString(field
213                                             .getName().toLowerCase()));
214                                 else if (field.getType().getSimpleName()
215                                         .toLowerCase().endsWith("boolean"))
216                                     method.invoke(t, rs.getBoolean(field
217                                             .getName().toLowerCase()));
218                                 else if (field.getType().getSimpleName()
219                                         .toLowerCase().endsWith("timestamp"))
220                                     method.invoke(t, rs.getTimestamp(field
221                                             .getName().toLowerCase()));
222                                 else if (field.getType().getSimpleName()
223                                         .toLowerCase().endsWith("date"))
224                                     method.invoke(t, rs.getDate(field.getName()
225                                             .toLowerCase()));
226                                 else if (field.getType().getSimpleName()
227                                         .toLowerCase().endsWith("double"))
228                                     method.invoke(t, rs.getDouble(field
229                                             .getName().toLowerCase()));
230                                 else if (field.getType().getSimpleName()
231                                         .toLowerCase().endsWith("float"))
232                                     method.invoke(t, rs.getFloat(field
233                                             .getName().toLowerCase()));
234                                 else if (field.getType().getSimpleName()
235                                         .toLowerCase().endsWith("time"))
236                                     method.invoke(t, rs.getTime(field.getName()
237                                             .toLowerCase()));
238                                 else
239                                     method.invoke(t, rs.getObject(field
240                                             .getName().toLowerCase()));
241                             } catch (Exception e) {
242                                 e.printStackTrace();
243                                 ;
244                             }
245                         }
246                     }
247                 }
248             }
249             tlist.add(t);
250         }
251         return tlist;
252     }
253 }
时间: 2024-10-12 22:45:49

JDBC连接SQLServer数据库(增强封装版)的相关文章

JDBC连接SqlServer数据库(非默认实例)方法

一般我们在连接数据库的时候都是用的默认实例名,今天遇到了用非默认是实例名:连接代码如下(Java): URL=jdbc:microsoft:sqlserver://192.168.1.85//DEMO;DatabaseName=PePsiEasyData 说明: 192.168.1.85是数据库地址.不指定端口 //DEMO 指定实例名为DEMO 也可以写成这样: URL=jdbc:microsoft:sqlserver://192.168.1.85;instanceName=DEMO;Data

mssql连接Sqlserver数据库基本封装

对mssql操作Sqlserver数据库的基本封装,原文件下载dbHelper 记录一下: /** * Created by chaozhou 2015/9/16. */ var mssql = require('mssql'); var user = "sa", password = "sa", server = "192.168.20.132", database = "ggcms"; /** * 默认config对象 *

JDBC连接SQLServer数据库(简易代码)

1 package pmsdao; 2 3 import java.sql.Connection; 4 import java.sql.DriverManager; 5 import java.sql.PreparedStatement; 6 import java.sql.ResultSet; 7 import java.sql.SQLException; 8 9 public class BaseDAO { 10 // 驱动类全名(包名.类名) 11 private static final

openTSP连接sqlServer数据库&amp;jpa调用存储过程

openTSP框架下的模块都是连接mysql数据库,近期青汽有连接sqlServer数据库的需求,在调研后配置了sqlServer数据库,使用jpa调用存储过程,中间也踩了不少坑,总结一下,避免大家再掉进去. 1.首先配置sqlServer的依赖 <dependency> <groupId>com.microsoft.sqlserver</groupId> <artifactId>sqljdbc4</artifactId> <version

JDBC连接MySQL数据库及演示样例

JDBC是Sun公司制定的一个能够用Java语言连接数据库的技术. 一.JDBC基础知识         JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,能够为多种关系数据库提供统一訪问,它由一组用Java语言编写的类和接口组成.JDBC为数据库开发者提供了一个标准的API,据此能够构建更高级的工具和接口,使数据库开发者能够用纯 Java API 编写数据库应用程序,而且可跨平台执行,而且不受数据库供应商的限制.

java 连接sqlserver数据库语句

import java.sql.*; /** * java 连接sqlserver数据库语句 * @author Administrator * */ public class Main {         public static void main(String [] args) throws SQLException {                                     String driverName="com.microsoft.sqlserver.jdbc.

JAVA通过JDBC连接Oracle数据库详解【转载】

JAVA通过JDBC连接Oracle数据库详解 (2011-03-15 00:10:03) 转载▼http://blog.sina.com.cn/s/blog_61da86dd0100q27w.html Java连接Oracle步骤: 1.注册加载驱动 驱动名:DRIVER="oracle.jdbc.driver.OracleDriver"; Class.forName("驱动类名"); 2.获得连接 数据库地址: URL="jdbc:oracle:thi

JDBC连接SQLServer的几种方式

第一种:JDBC-ODBC数据库连接桥(需要配置ODBC数据源,不需下载驱动) Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); con=DriverManager.getConnection("jdbc:odbc:数据源名称","用户名","密码"); 第二种:利用Microsoft提供的驱动程序(XP用户需要打SP3的补丁,需要下载驱动) Class.forName("

JDBC连接各种数据库的字符串

JDBC连接各种数据库的字符串大同小异,在此总结一下,备忘. oracle    driverClass:oracle.jdbc.driver.OracleDriver    url:jdbc:oracle:thin:@127.0.0.1:1521:dbnamemysql    driverClass:com.mysql.jdbc.Driver PS:有的时候,mysql的驱动类也也会看到使用org.gjt.mm.mysql.Driver的情况,org.gjt.mm.mysql.Driver是早