本学习笔记纯粹是为了方便自己学习,当然可能借鉴了很多前辈的东西,只是为了帮助自己梳理知识点,不用做任何商业目的,知识至上。
简单的回顾了一下之前学习的JDBC数据库连接, 现在梳理一下:
方便自己整理,把JDBC这块知识划分成两部分,第一部分是简单的数据库连接,实现简单的增删改查操作;第二部分比较复杂,包括JDBC调用存储过程,事务管理,数据库连接池以及hibernate和mybatis的介绍。
这次先见到那回顾数据库的连接,实现简单的增删改查操作,然后顺便介绍一点存储过程。
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语句,我们可以事先保存在数据库中,在代码中直接调用。
这里只是对存储过程的简单介绍,之后还会有更详细的介绍,包括带参的存储过程。