首页 > 代码库 > JDBC框架

JDBC框架

public class JdbcUtils {

 

// 表示定义数据库的用户名

private final String USERNAME = "root";

// 定义数据库的密码

private final String PASSWORD = "admin";

// 定义数据库的驱动信息

private final String DRIVER = "com.mysql.jdbc.Driver";

// 定义访问数据库的地址

private final String URL = "jdbc:mysql://localhost:3306/mydb";

// 定义数据库的链接

private Connection connection;

// 定义sql语句的执行对象

private PreparedStatement pstmt;

// 定义查询返回的结果集合

private ResultSet resultSet;

 

public JdbcUtils() {

try {

//注册驱动

Class.forName(DRIVER);

System.out.println("注册驱动成功!!");

catch (Exception e) {

// TODO: handle exception

}

}

 

// 定义获得数据库的链接

public Connection getConnection() {

try {

//获得数据库连接

connection = DriverManager.getConnection(URLUSERNAMEPASSWORD);

catch (Exception e) {

// TODO: handle exception

}

return connection;

}

 

/**

 * 完成对数据库的表的添加删除和修改的操作

 * 

 * @param sql

 * @param params???

 * @return

 * @throws SQLException

 */

public boolean updateByPreparedStatement(String sql, List<Object> params)

throws SQLException {

boolean flag = false;

int result = -1;// 表示当用户执行添加删除和修改的时候所影响数据库的行数

//获得执行SQL语句的对象

pstmt = connection.prepareStatement(sql);

int index = 1;//setObjet参数的第一个是从1开始的,即占位符的第一个位置

//判断所填充的占位符是否有值

if (params != null && !params.isEmpty()) {

for (int i = 0; i < params.size(); i++) {

//setObject填充占位符

pstmt.setObject(index++, params.get(i));//????

}

}

//返回结果要么是0要么是影响的行数

result = pstmt.executeUpdate();

flag = result > 0 ? true : false;

return flag;

}

 

/**

 * 查询返回单条记录

 * 

 * @param sql

 * @param params

 * @return

 * @throws SQLException

 */

public Map<String, Object> findSimpleResult(String sql, List<Object> params)

throws SQLException {

Map<String, Object> map = new HashMap<String, Object>();

int index = 1;//setObjet参数的第一个是从1开始的

//获得执行SQL语句的对象

pstmt = connection.prepareStatement(sql);

if (params != null && !params.isEmpty()) {

for (int i = 0; i < params.size(); i++) {

pstmt.setObject(index++, params.get(i));

}

}

resultSet = pstmt.executeQuery();// 返回查询结果

ResultSetMetaData metaData = resultSet.getMetaData();//返回结果集对象的列的相关信息

int col_len = metaData.getColumnCount();//返回对象的列数

//判断游标移动到下一行后是否还存在数据

while (resultSet.next()) {// 获得列的名称

//循环获得每列的列名和每行该列名所对应的值(判断是否有下一条记录)

for (int i = 0; i < col_len; i++) {

//先获得列名列名从1开始!!!

String cols_name = metaData.getColumnName(i + 1);

//由列名获得对象

Object cols_value = resultSet.getObject(cols_name);

//判断值是否为空,为空给空格

if (cols_value == null) {

cols_value = "";

}

//放入集合MAP

map.put(cols_name, cols_value);

}

}

return map;

}

 

/**

 * 查询返回多行记录

 * 

 * @param sql

 * @param params

 * @return

 * @throws SQLException

 */

public List<Map<String, Object>> findMoreResult(String sql,

List<Object> params) throws SQLException {

//多条记录存放list+map

List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();

int index = 1;//setObject()第一参数从1开始

//获得执行SQL语句的对象

pstmt = connection.prepareStatement(sql);

if (params != null && !params.isEmpty()) {

for (int i = 0; i < params.size(); i++) {

pstmt.setObject(index++, params.get(i));

}

}

//执行查询语句并将结果集赋值给resultSet

resultSet = pstmt.executeQuery();

ResultSetMetaData metaData = resultSet.getMetaData();//获得列的相关信息

int cols_len = metaData.getColumnCount();

while (resultSet.next()) {

Map<String, Object> map = new HashMap<String, Object>();

for (int i = 0; i < cols_len; i++) {

String cols_name = metaData.getColumnName(i + 1);

Object cols_value = resultSet.getObject(cols_name);

if (cols_value == null) {

cols_value = "";

}

map.put(cols_name, cols_value);

}

list.add(map);

}

return list;

}

/*

 * jAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;

 * 对于任意一个对象,都能够调用它的任意一个方法和属性;

 * 这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

 * */

// jdbc的封装可以用反射机制来封装:

//定义范型

public <T> T findSimpleRefResult(String sql, List<Object> params,

Class<T> cls) throws Exception {

T resultObject = null;//返回对象

int index = 1;

//获得sql语句执行对象

pstmt = connection.prepareStatement(sql);

//设置占位符

if (params != null && !params.isEmpty()) {

for (int i = 0; i < params.size(); i++) {

pstmt.setObject(index++, params.get(i));

}

}

resultSet = pstmt.executeQuery();

//

ResultSetMetaData metaData = resultSet.getMetaData();

//

int cols_len = metaData.getColumnCount();

while (resultSet.next()) {

// 通过反射机制创建实例

resultObject = cls.newInstance();

for (int i = 0; i < cols_len; i++) {

String cols_name = metaData.getColumnName(i + 1);

Object cols_value = resultSet.getObject(cols_name);

if (cols_value == null) {

cols_value = "";

}

//通过列名来获得类的属性字段

Field field = cls.getDeclaredField(cols_name);

field.setAccessible(true);// 打开javabean的访问private权限

//第一个参数是需要改变字段的对象(由反射机制创建的实例) 第二个参数字段改变的值

field.set(resultObject, cols_value);

}

}

return resultObject;

}

 

/**

 * 通过反射机制访问数据库

 * 

 * @param <T>

 * @param sql

 * @param params

 * @param cls

 * @return

 * @throws Exception

 */

public <T> List<T> findMoreRefResult(String sql, List<Object> params,

Class<T> cls) throws Exception {

List<T> list = new ArrayList<T>();

int index = 1;

//获得执行SQL语句的对象

pstmt = connection.prepareStatement(sql);

//占位符

if (params != null && !params.isEmpty()) {

for (int i = 0; i < params.size(); i++) {

pstmt.setObject(index++, params.get(i));

}

}

//执行

resultSet = pstmt.executeQuery();

//获得列的相关信息

ResultSetMetaData metaData = resultSet.getMetaData();

int cols_len = metaData.getColumnCount();

//是否有下一条记录

while (resultSet.next()) {

//反射机制创建实例

T resultObject = cls.newInstance();

for (int i = 0; i < cols_len; i++) {

String cols_name = metaData.getColumnName(i + 1);

Object cols_value = resultSet.getObject(cols_name);

if (cols_value == null) {

cols_value = "";

}

//通过列名来获得类的属性字段

Field field = cls.getDeclaredField(cols_name);

// 打开javabean的访问private权限

field.setAccessible(true);

//设置反射对象的字段对应的值

field.set(resultObject, cols_value);

}

list.add(resultObject);

}

return list;

}

//数据库释放连接

public void releaseConn() {

//判断结果集是否为空

if (resultSet != null) {

try {

//不为空关闭结果集合

resultSet.close();

catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

//判断SQL执行语句的对象是否为空

if (pstmt != null) {

try {

//不为空关闭

pstmt.close();

catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

//判断连接是否为空

if (connection != null) {

try {

//不为空关闭

connection.close();

catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

 

/**

 * @param args

 */

public static void main(String[] args) {

// TODO Auto-generated method stub

JdbcUtils jdbcUtils = new JdbcUtils();

jdbcUtils.getConnection();

// String sql = "insert into userinfo(username,pswd) values(?,?)";

// List<Object> params = new ArrayList<Object>();

// params.add("rose");

// params.add("123");

// try {

// boolean flag = jdbcUtils.updateByPreparedStatement(sqlparams);

// System.out.println(flag);

// } catch (SQLException e) {

// // TODO Auto-generated catch block

// e.printStackTrace();

// }

String sql = "select * from userinfo ";

//List<Object> params = new ArrayList<Object>();

//params.add(1);

try {

List<UserInfo> list = jdbcUtils.findMoreRefResult(sql,

null, UserInfo.class);

System.out.println(list);

catch (Exception e) {

// TODO: handle exception

finally {

jdbcUtils.releaseConn();

}

}

 

}

 

 

实体类用于java反射机制

public class UserInfo implements Serializable {

/**

 * 

 */

//序列化

private static final long serialVersionUID = 1L;

 

private int id;

private String username;

private String pswd;

 

@Override

public String toString() {

return "UserInfo [id=" + id + ", username=" + username + ", pswd="

pswd + "]";

}

 

public int getId() {

return id;

}

 

public void setId(int id) {

this.id = id;

}

 

public String getUsername() {

return username;

}

 

public void setUsername(String username) {

this.username = username;

}

 

public String getPswd() {

return pswd;

}

 

public void setPswd(String pswd) {

this.pswd = pswd;

}

 

public static long getSerialversionuid() {

return serialVersionUID;

}

 

public UserInfo() {

// TODO Auto-generated constructor stub

}

 

}

JDBC框架