Java连接数据库DBHelper增删改查[多条数据]

  1. 云栖社区>
  2. 博客>
  3. 正文

Java连接数据库DBHelper增删改查[多条数据]

二进制循环 2017-10-08 19:32:31 浏览526
展开阅读全文

补充!忘记写思路了。。。
思路
1. 使用Class.forName()加载驱动
2. 驱动管理指定数据库并连接 Connection conn = DriverManager.getConnection()
3. 连接后,使用连接获取预处理(处理sql语句) PreparedStatement pst = conn.preparedStatement(“sql语句”)
4. 使用预处理执行相应操作得到一个结果集 ResultSet rs = pst.executeQuery();
5. 获取元数据即数据库中一部分数据 ResultSetMetaData rsd = rs.getMetaData();
6. rsd中则包含数据库信息一定要要判断rsd.next() 是否有值,才能进一步操作
7. 根据数据库字段名获取数据库中相应的值 rs.getObject(“字段名”); 8.最后关闭连接,预处理,结果集


上午一大早被吵醒…干脆起来写代码,于是就有了这个DBHelper工具类,算是复习复习。
在实际开发过程中没有数据库基本是不能活呀!改工具类写了较详细的注释。
都是根据自己的理解写的,如果不对之处欢迎提出!不胜感激。

文件包括:
- jar包 oracle和mysql
- 一下描述到的类和配置文件

文件结构图
这里写图片描述

此类支持以下功能

  1. 增加
  2. 删除
  3. 修改
  4. 查询结果只有单条数据
  5. 查询结果有多条数据
  6. 多条语句查询

MyDbHelper类

package com.wy.mydb;

import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.wy.properties.MyProperties;

public class MyDbHelper {
    private  Connection conn = null;
    private  PreparedStatement ps = null;
    private  ResultSet rs = null;

    //加载驱动
    static {
        try {
            //方式一  固定写死  不方便更改数据库操作
//          Class.forName("com.mysql.jdbc.Driver"); //Oracle驱动为: oracle.jdbc.driver.OracleDriver
            //方式二  读取配置文件操作  如果需要更换数据库只需要修改配置文件即可   推荐
            try {
                Class.forName(MyProperties.getInstance().getProperty("driverName"));
            } catch (IOException e) {
                e.printStackTrace();
            }

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } 
    }


    //驱动管理连接指定数据库  获取连接对象
    public Connection getConnection() {

        try {
            //方式一   固定写死  不方便更改数据库操作
            //驱动管理指定数据库并连接          参数说明  端口信息  数据库账户  密码
//          conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "a");
            //方式二  读取配置文件操作  如果需要更换数据库只需要修改配置文件即可   推荐
            try {
                conn = DriverManager.getConnection(MyProperties.getInstance().getProperty("url"),MyProperties.getInstance());
            } catch (IOException e) {
                e.printStackTrace();
            }

        } catch (SQLException e) {
            e.printStackTrace();
        }
        return conn;
    }

    //关闭所有对象              连接                预处理                 结果集
    public void closeAll(Connection conn,PreparedStatement ps,ResultSet rs) {
        if(conn!=null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(ps!=null) {
            try {
                ps.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(rs!=null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }



    /**单条语句的增删改   说明:在执行成功后函数返回的结果为非零整数
     * @param sql  需要执行的sql语句
     * @param params 执行sql语句的参数
     * @return
     */
    public int doUpdate(String sql,List<Object> params) {
        int result = 0;
        //获取连接
        conn = getConnection();
        //预处理
        try {
            ps = conn.prepareStatement(sql);
            //设置参数得到结果集
            this.setParams(ps,params);
            //预处理执行得到结果反馈
            result = ps.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            //关闭所有对象
            this.closeAll(conn, ps, rs);
        }
        return result;
    }


    /**
     * 多条语句的增删改     说明:这些语句要么同时成功,要么都失败
     * @param sqls   多条sql语句
     * @param params 执行参数
     * @return
     */
    public int doUpdate(List<String> sqls,List<Object> params) {
        int result = 0;
        //获取连接
        conn = getConnection();
        try {
            //多条语句的执行涉及到事务    设置事务提交方式为手动
            conn.setAutoCommit(false);
            //判断sql语句集合
            if(sqls!=null&&sqls.size()>0) {
                //循环每一条语句执行
                for(int i=0;i<sqls.size();i++) {
                    ps = conn.prepareStatement(  sqls.get(i) );
                    //设置参数
                    ps.setObject(i+1, params.get(i));
                    //执行并反馈
                    result = ps.executeUpdate();
                }
            }
            //手动提交数据
            conn.commit();
        } catch (SQLException e) {
            //出现错误则回滚数据
            try {
                conn.rollback();
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
            e.printStackTrace();
        } finally {
            //回复事务自动提交
            try {
                conn.setAutoCommit(true);
            } catch (SQLException e) {
                e.printStackTrace();
            }
            //关闭所有对象
            this.closeAll(conn, ps, rs);
        }   
        return result;
    }



    /**
     * 设置预处理的参数
     * @param ps      预处理
     * @param params 参数集合
     * @throws SQLException 
     */
    public void setParams(PreparedStatement ps,List<Object> params) throws SQLException {
        if(params!=null&&params.size()>0) {
            for(int i=0;i<params.size();i++) {
                ps.setObject(i+1, params.get(i));
            }
        }
    }


    /**
     * 查询sql语句单条结果
     * @param sql   查询的sql语句
     * @param params执行sql所需参数
     * @return
     */
    public Map<String,Object> findSingleObject(String sql,List<Object> params){
        Map<String,Object> map = new HashMap<String,Object>();
        //获取连接
        conn = getConnection();
        //预处理
        try {
            ps = conn.prepareStatement(sql);
            //设置参数
            this.setParams(ps, params);
            //执行查询得到结果集
            rs = ps.executeQuery();
            //获取数据库该表所有字段名
            List<String> names = getAllColumnName(rs);
            if(rs.next()) {
                //循环names
                for(String name:names) {
                    map.put(name,  rs.getObject(name) );
                }
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            //关闭对象
            this.closeAll(conn, ps, rs);
        }
        return map;
    }


    /**
     * 查询sql语句多条结果
     * @param sql
     * @param params
     * @return
     */
    public List<Map<String,Object>> findMulitObject(String sql,List<Object> params){
        List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();
        //连接
        conn = this.getConnection();
        //预处理
        try {
            ps = conn.prepareStatement(sql);
            //设置参数
            this.setParams(ps, params);
            //执行查询得到结果集
            rs = ps.executeQuery();
            //获取所有列名
            List<String> names = this.getAllColumnName(rs);
            while(rs.next()) { //注意这里不能用if 因为使用if的话只能执行一次 最后得到的结果就成了查一条数据
                Map<String, Object> map = new HashMap<String,Object>();
                //循环迭代
                for(String name:names) {
                    map.put(name, rs.getObject(name));
                }
                list.add( map );
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return list;
    }



    /**
     * 根据结果集获取数据库中的所有列表名
     * @param rs
     * @return
     */
    private List<String> getAllColumnName(ResultSet rs) {
        List<String> names = new ArrayList<String>();
        try {
            ResultSetMetaData rsmd = rs.getMetaData();
            for(int i=0;i<rsmd.getColumnCount();i++) {
                names.add(   rsmd.getColumnName(i+1)  );
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return names;
    }

}

MyProperties类 说明:用于读取配置文件db.properties

package com.wy.properties;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

/**
 * 整个类只需要创建一个对象
 * 设计成单例模式
 */
public class MyProperties extends Properties{

    private static MyProperties myProperties;

    private MyProperties() throws IOException{
        InputStream in = MyProperties.class.getClassLoader().getResourceAsStream("db.properties");
        try {
            this.load(in);
        } catch (IOException e) {       
            e.printStackTrace();
            throw e;
        }
    }

    public static MyProperties getInstance() throws IOException{
        if(null==myProperties){
            myProperties = new MyProperties();
        }
        return myProperties;
    }
}

db.properties 说明:输入自己的数据库链接密码 注意 所有输入后面不能有空格! 那句英文我感觉有错误…写英文的原因是,中文会被处理

#oracle
#driverName=oracle.jdbc.driver.OracleDriver
#url=jdbc:oracle:thin:@localhost:1521:orcl
#user=scott
#password=   please input your database password

#mysql  #please input your database password
driverName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/test
user=root
password=   please input your database password

数据库文件

create table student(
    sid int primary key auto_increment,
    sname varchar(10)
)

insert into student(sname) values('马小跳')
insert into student(sname) values('淘气包')

select * from student where sid = 2
delete from student where sid = 3

完整文件请移步网盘下载http://pan.baidu.com/s/1o7EshNs pw2t

网友评论

登录后评论
0/500
评论
二进制循环
+ 关注