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

来源:互联网 发布:英国哪个城市最美 知乎 编辑:程序博客网 时间:2024/06/05 20:55

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

简单的回顾了一下之前学习的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 blocke.printStackTrace();} catch (SQLException e) {// TODO Auto-generated catch blocke.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
原创粉丝点击