持久层框架JDBC篇(1)
有人的地方,就有江湖;人在江湖中,必定离不开那种种纷争,纵然你精通各种武林绝学,要知道人外有人,天外有天,要想自己不被这个江湖淘汰,唯一的途径唯有不断的学习新的武功,但是有个前提,需要有强大的内功做保障才能驾驭得了看上去实用且可以一招制敌的绝学。今天,我们就去网络的江湖中进行修炼,希望我们可以共同成长,将来,一统江湖~
喜欢武侠的朋友都知道,在金庸前辈的《天龙八部》中,有一位记忆力超群,能够记住所有武学秘籍的神仙姐姐----王语嫣,那么在我们网络江湖中,也有一位神仙姐姐------数据库,数据库能够将数据持久化,可以永久的保存起来,需要的时候,可以通过数据库查询到自己想要的数据~我们今天要修炼的是一门内功,他是java与数据库之间的一个桥梁,是一个规范而不是一个实现,能够执行SQL语句。它由一组用Java语言编写的类和接口组成。各种不同类型的数据库都有相应的实现(以mysql为例),学会此门内功,则学起来其他相关功法定会事半功倍~秘籍在下,欲练此功,心静放空~
1.装载相应的数据库的JDBC驱动并进行初始化
(1)导入相应的jar包(不同的数据库需要的jar包是不同的):访问MySQL数据库需要用到第三方的类,这些第三方的类,都被压缩在一个.Jar的文件里。mysql-connector-java-5.0.8-bin.jar包可以在网上下载,或者在MySQL的安装目录下找到。通常下载到该jar包之后将其放到在项目的lib目录下,如果你会使用maven,那么导入依赖即可使用,在此不做过多讲解
(2)初始化驱动:通过初始化驱动类com.mysql.jdbc.Driver,该类就在 mysql-connector-java-5.0.8-bin.jar中。如果你使用的是oracle数据库那么该驱动类将不同。
Class.forName是把这个类加载到JVM中,加载的时候,就会执行其中的静态初始化块,完成驱动的初始化的相关工作。
2.建立JDBC和数据库之间的Connection连接
Connection是与特定数据库连接回话的接口,使用的时候需要导包,而且必须在程序结束的时候将其关闭。getConnection方法也需要捕获SQLException异常。因为在进行数据库的增删改查的时候都需要与数据库建立连接,所以可以在项目中将建立连接写成一个工具方法,用的时候直接调用即可:
/** * 取得数据库的连接 * @return 一个数据库的连接 */public static Connection getConnection(){Connection conn = null;
try {
//初始化驱动类com.mysql.jdbc.Driver
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://IP:3306/数据库名称?characterEncoding=UTF-8","数据库账号", "数据库密码");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
3.创建Statement或者PreparedStatement接口,执行SQL语句
Statement接口创建之后,可以执行SQL语句,完成对数据库的增删改查。其中 ,增删改只需要改变SQL语句的内容就能完成,然而查询略显复杂。在Statement中使用字符串拼接的方式,该方式存在句法复杂,容易犯错等缺点,具体在下文中的对比中介绍。所以Statement在实际过程中使用的非常的少,所以具体的我们放道PreparedStatement那里给出详细代码。
Connection conn=getConnection();Statement s = conn.createStatement();
//拼装sql,字符串要用单引号"
String sql = "insert into t_test values(null,"+""xxx")";
//在statement中使用字符串拼接的方式,这种方式存在诸多问题
s.execute(sql);System.out.println("插入成功");
字符串拼接方式的SQL语句是非常繁琐的,中间有很多的单引号和双引号的混用,极易出错。所以不推荐使用此类,与之有相同功能的还有一个:PreparedStatement~
与 Statement类似,PreparedStatement也是用来执行sql语句的,与创建Statement不同的是,需要根据sql语句创建PreparedStatement。除此之外,还能够通过设置参数,指定相应的值,而不是Statement那样使用字符串拼接,避免出错,接下来我们使用PreparedStatement来写一套增删改查的小例子,利于了解这个类的使用。建表和字段部分在此不讲,请自行准备
添加代码片段:
public void add(String code){//该语句为每个 IN 参数保留一个问号(“?”)作为占位符
String sql = "insert into t_test(code) values(?)";
// 和数据库取得连接
Connection conn = null;
//创建statement
PreparedStatement pstmt = null;
try{
conn =getConnection();
pstmt = (PreparedStatement) conn.prepareStatement(sql);
//给占位符赋值
pstmt.setString(1, courseName);
//执行SQL
pstmt.executeUpdate();
}catch(SQLException e){
e.printStackTrace();
} finally{
close(pstmt);
close(conn);
//必须关闭
}
}
删除代码片段:
public void delete(int id){String sql = "delete from t_test where course_id = ?";
Connection conn = null;
PreparedStatement pstmt = null;
try {
conn = getConnection();
pstmt = (PreparedStatement) conn.prepareStatement(sql);
pstmt.setInt(1, id);
pstmt.executeUpdate();
} catch (SQLException e) {
// TODO: handle exception
e.printStackTrace();
}finally{
//关闭连接
close(pstmt);
close(conn);
}
}
修改代码片段:
public void update(int id,String code){String sql = "update t_test set code =? where id=?";
Connection conn = null;
PreparedStatement pstmt = null;
try {
conn = getConnection();
pstmt = (PreparedStatement) conn.prepareStatement(sql);
//利用Preparedstatement的set方法给占位符赋值
pstmt.setString(1, code);
pstmt.setInt(2, id);
pstmt.executeUpdate();
} catch (SQLException e) {
// TODO: handle exception
e.printStackTrace();
}finally{
close(pstmt);
close(conn);
}
}
通过上面的代码片段可以看出,他们的代码中,有很多相似的地方,除了SQL语句外,其他的地方几乎都是相同的。因为增删改操作是状态性质的操作,不涉及到结果集,所以相对查询来说,他们三个是简单些的操作,下面,我们来看一看查询操作的处理方式:
public List<Test> getTestList(){String sql = "select * from t_test";
Connection conn = null;
PreparedStatement pstmt = null;
//创建一个集合对象用来存放查询到的数据
ResultSet rs = null;
List<Test> testList = new ArrayList<>();
try {
conn = getConnection();
pstmt = (PreparedStatement);
conn.prepareStatement(sql);
rs = (ResultSet) pstmt.executeQuery();
while (rs.next()){
//每个记录对应一个对象
int id = rs.getInt("id");
String code = rs.getString("code");
Test test = new Test();
//将对象放到集合中
test.setId(id);
test.setCode(code);
testList.add(course);
} } catch (SQLException e) {
// TODO: handle exception
e.printStackTrace();
}finally{
close(pstmt);
close(conn);
}
return testList;
}
查询操作使用executeQuery()进行更新。其他相关的问题放在第四步(处理和显示结果)中解释。
4.处理和显示结果
执行查询语句,并把结果集返回给集合ResultSet :利用While(ResultSet.next()){…}循环将集合ResultSet中的结果遍历出来。
while (rs.next()){int id = rs.getInt("id");
String code = rs.getString("code");
//每个记录对应一个对象
Test test = new Test();
test.setId(id);
test.setCode(code);
//将对象放到集合中
testList.add(course);
}
5.释放资源
在JDBC编码的过程中我们创建了Connection、ResultSet等资源,这些资源在使用完毕之后是一定要进行关闭的。关闭的过程中遵循从里到外的原则。
至此,我们就可以很容易的通过java来使用jdbc操作数据库了,然而,这仅仅是jdbc的基本使用,在持久层中,不仅仅涉及操作数据库的知识,还有事务,获取自增、获取元数据、ORM、DAO、数据连接池等内容~为了防止过度修炼,走火入魔,我们需要吸收一下今天所学习的内容,能够熟练使用JDBC操作数据库之后再进行接下来的修炼~
参考文章:https://blog.csdn.net/jungle_rao/article/details/81274720
以上是 持久层框架JDBC篇(1) 的全部内容, 来源链接: utcz.com/z/511967.html