Java学习笔记1-JDBC数据库连接和无参存储过程

本学习笔记纯粹是为了方便自己学习,当然可能借鉴了很多前辈的东西,只是为了帮助自己梳理知识点,不用做任何商业目的,知识至上。

简单的回顾了一下之前学习的JDBC数据库连接, 现在梳理一下:

方便自己整理,把JDBC这块知识划分成两部分,第一部分是简单的数据库连接,实现简单的增删改查操作;第二部分比较复杂,包括JDBC调用存储过程事务管理数据库连接池以及hibernatemybatis的介绍。

这次先见到那回顾数据库的连接,实现简单的增删改查操作,然后顺便介绍一点存储过程。
1. 数据库的简单连接和增删改查
a. 第一步是知识准备, 需要简单的SQL语句,比如增删改查的简单操作。
b.数据库连接,这里使用的是JDBC + DataBase 数据库驱动连接,需要com.mysql.jdbc.jar
首先建立一个DBUtil类,实现数据库的连接操作,方便控制层的调用。

//MySQL的JDBC URL格式:
//jdbc:mysql//[hostname][:port]/[dbname][?param1=value1][param2=value2]...
private static final String URL = "jdbc:mysql://127.0.0.1:3306/ysong";
private static final String USER = "root";
private static final String PASSWORD = "mysql";

private static Connection conn = null;

//静态块是执行在最早的
static {
try {
//1.加载驱动程序,使用的是java反射机制
Class.forName("com.mysql.jdbc.Driver");
//2.获得数据库的连接
conn = DriverManager.getConnection(URL, USER, PASSWORD);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

public static Connection getConnection() {
return conn;
}

这里我们可以看到,通过jdbc驱动获取数据库的连接,然后通过getConnection()方法获取连接。这样我们的数据连接就搞定了。
c.增删改查操作
数据库的简单操作,增删改查都差不多,这里我们拿添加数据为例:
首先我们新建一个PersonDao类,这个是我们的控制层程序。在PersonDao类中,我们实现addPerson()方法,向数据库中插入数据。

public void addPerson(Person p) throws SQLException {
    Connection conn = DBUtil.getConnection();
    String sql = "" + 
        " INSERT into people_table (name, age, gender) VALUE(?, ?, ?)";
    PreparedStatement ptmt = conn.prepareStatement(sql);
    //设置参数,PreparedStatement
    ptmt.setString(1, p.getName());
    ptmt.setInt(2, p.getAge());
    ptmt.setString(3, p.getGender());
    ptmt.execute();
}

这里我们可以看到,通过调用DBUtil的getConnection()方法获取数据库连接,执行数据库语句,进行添加操作,其中我们使用PreparedStatement对sql语句进行参数设置。

我们在数据库中添加一个Person表,其中包括ID,name, age, gender简单信息。然后在Model层实现一个Person类,方便我们进行数据操作。

下面我把查询的代码列出来:

    /**
     * 通过不确定参数查询person, 
     * 通过List<Map<String, Object>> params, 可以任意添加查询条件,比如 age > 25
     * @param params [name],[age],[gender]..
     * @return person
     * @throws Exception
     */
    public Person queryPersonByTags(List<Map<String,Object>> params) throws Exception {
        Person p = null;
        Connection conn = DBUtil.getConnection();
        StringBuffer sql = new StringBuffer("SELECT * FROM people_table WHERE 1 = 1 ");
        if(params != null && params.size() > 0){
            for(Map<String, Object> param : params){
                sql.append("and " + param.get("name") + " " 
                            + param.get("rela") + " " 
                            + + param.get("value") + " ");
            }
        }
        PreparedStatement ptmt = conn.prepareStatement(sql.toString());
        System.out.println(sql.toString());
        ResultSet rs = ptmt.executeQuery();
        while(rs.next()){
            p = new Person();
            p.setID(rs.getInt("id"));
            p.setAge(rs.getInt("age"));
            p.setGender(rs.getString("gender"));
            p.setName(rs.getString("name"));
        }
        return p;
    }

这里我们使用了一个List<Map<String,Object>>对象来进行参数的设置。
d. 视图层调用
我们已经实现了数据库的连接和增删改查的简单操作,接下来我们就可以在视图层进行调用。具体代码就不详细写了。

2.调用无参存储过程
在这里简单的介绍一下存储过程(Stored Procedure):一组为了完成特定功能的SQL语句集,存储在数据库中经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数来执行它。
存储过程就是一个PL/SQL语句块,可以使用PL/SQL Developer来调试。我之前看过一个视频,说是PL/SQL是对数据库操作最快的,但是个人感觉这个并没有什么依据,不过多了解一点总是没有坏处的。有很多关于PL/SQL和存储过程的文章,推荐看一下。
我使用的是MySQL Navicat, 事先添加了一个Procedure,并命名为sp_select_nofilter()(在MySQL Navicat 上面New Query,直接编写保存就可以了):

CREATE PROCEDURE ysong.sp_select_nofilter()
BEGIN
    SELECT * FROM people_table;
END;

这是一个无参的存储过程,意思很明确,查询people_table中的所有数据。
接下来我们在JDBC中进行调用,我们新建一个ProcedureDao类,实现相应的方法:

public static void select_nofilter() throws SQLException{
        //1.获得链接
        Connection conn = DBUtil.getConnection();
        //2.获得callablestatement
        CallableStatement cs = conn.prepareCall("call sp_select_nofilter()");
        //3.执行存储过程
        cs.execute();
        //4. 处理返回的结果: 1. 结果集  2. 出参
        ResultSet rs = cs.getResultSet();
        while(rs.next()){
            System.out.println(rs.getString("name"));
        }
    }

同样地,我们首先获取数据库连接,然后调用并执行存储过程,得到结果集。其中调用并执行存储过程的代码:

        //获得callablestatement
        CallableStatement cs = conn.prepareCall("call sp_select_nofilter()");
        //执行存储过程
        cs.execute();

我们可以看到,“call sp_select_nofilter()”就是执行我们在数据库中事先保存的存储过程,不需要我们再进行编译,直接就可以调用。
对于一些特定的操作,复杂的SQL语句,我们可以事先保存在数据库中,在代码中直接调用。
这里只是对存储过程的简单介绍,之后还会有更详细的介绍,包括带参的存储过程。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值