Java-web之JDBC
1.JDBC的概念
(1)JDBC是什么:
JDBC(Java DataBase Connectivity)是Java和数据库之间的一个桥梁,是一个规范而不是一个实现,能够执行SQL语句。它由一组用Java语言编写的类和接口组成。
(2)JDBC的功能:
通过提供的类和接口实现对数据库中表记录的插入删除修改查询等。
(3)JDBC API:
JDBC API可以做:与数据库建立链接,执行SQL语句,处理结果
DriverManager:依据数据库的不同,管理JDBC驱动
Connection:负责连接数据库并担任传送数据的任务
Statement:由Connection产生,负责执行SQL语句
ResultSet:负责保存Statement执行后所产生的查询结果
2.JDBC编程步骤
(1)加载驱动:
下载导入驱动jar包后使用Class类下的静态方法forName来加载驱动:
如 加载MySQL驱动:
Class.forName(“com.mysql.jdbc.Driver”);
加载jdbc-odbc桥接器驱动:
Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);
注意:Class.forName需要捕获ClassNotFoundException.
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Class.forName是把这个类加载到JVM中,加载的时候,就会执行其中的静态初始化块,完成驱动的初始化的相关工作。
(2)创建连接
通过DriverManager获取数据库连接:
DriverManager.getConnection(String url,Stringuser,String pass);
上面的三个参数分别指的是:
●数据库的url
●登录数据库的用户名
●用户密码
数据库url通常写法:
jdbc:subprotocol:other stuff
例如:MySQL中:
●jdbc:mysql://hostname:port/databasename
Access中:
●jdbc:odbc:数据源名称,用户名,密码
因为在进行数据库的增删改查的时候都需要与数据库建立连接,所以可以在项目中将建立连接写成一个工具方法,用的时候直接调用即可:
/**
* 取得数据库的连接
* @return 一个数据库的连接
*/
public static Connection getConnection(){
Connection conn = null;
try {
//初始化驱动类com.mysql.jdbc.Driver
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/exam?characterEncoding=UTF-8","root", "admin");
//该类就在 mysql-connector-java-5.0.8-bin.jar中,如果忘记了第一个步骤的导包,就会抛出ClassNotFoundException
} catch (ClassNotFoundException e) {
e.printStackTrace();
}catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
(3)准备语句:
通过创建Statement或者PreparedStatement接口,执行SQL语句
Statement接口:
在Statement中使用字符串拼接的方式,该方式存在句法复杂,容易犯错等缺点,具体在下文中的对比中介绍。所以Statement在实际过程中使用的非常的少。字符串拼接方式的SQL语句是非常繁琐的,中间有很多的单引号和双引号的混用,极易出错。
●createStatement()
创建基本的Statement对象
Statement s = conn.createStatement();
// 准备sql语句
// 注意: 字符串要用单引号'
String sql = "insert into t_courses values(null,"+"'数学')";
//在statement中使用字符串拼接的方式,这种方式存在诸多问题
s.execute(sql);
System.out.println("执行插入语句成功");
PreparedStatement接口:
与 Statement一样,PreparedStatement也是用来执行sql语句的与创建Statement不同的是,需要根据sql语句创建PreparedStatement。除此之外,还能够通过设置参数,指定相应的值,而不是Statement那样使用字符串拼接。
PreparedStatement的优点:
①其使用参数设置,可读性好,不易记错。在statement中使用字符串拼接,可读性和维护性比较差。
②其具有预编译机制,性能比statement更快。
③其能够有效防止SQL注入攻击。
●prepareStatement(String sql)
根据传入的SQL语句创建预编译的Statement对象
●prepareCall(String sql)
根据传入的SQL语句创建CallableStatement对象
例:给数据库中添加课程:
/**
* 添加课程
* @param courseName 课程名称
*/
public void addCourse(String courseName){
String sql = "insert into t_course(course_name) values(?)";
//该语句为每个 IN 参数保留一个问号(“?”)作为占位符
Connection conn = null; //和数据库取得连接
PreparedStatement pstmt = null; //创建statement
try{
conn = DbUtil.getConnection();
pstmt = (PreparedStatement) conn.prepareStatement(sql);
pstmt.setString(1, courseName); //给占位符赋值
pstmt.executeUpdate(); //执行
}catch(SQLException e){
e.printStackTrace();
}
finally{
DbUtil.close(pstmt);
DbUtil.close(conn); //必须关闭
}
}
PreparedStatement接口中批量操作的方法:
for(int i=1;i<100;i++){
pstmt.setInt(1,8000+i);
pstmt.setString(2,"xx"+i);
pstmt.addBatch();
//批量更新
if(i%10==0){
pstmt.executeBatch();
}
}
(4)执行库操作
使用Statement对象执行SQL语句:
所有Statement对象都有以下三个方法:
①execute()
执行任何SQL语句,通用但不好用
②executeUpdate()
执行DML和DDL语句
执行DML语句返回受SQL语句影响的行数
执行DDL语句返回0
③executeQuery()
只能执行查询语句
返回代表查询结果的ResultSet对象
④execute和executeUpdate的区别
相同点:二者都能够执行增加、删除、修改等操作。
不同点:
(1) execute可以执行查询语句,然后通过getResult把结果取出来。executeUpdate不能执行查询语句。
(2) execute返回Boolean类型,true表示执行的是查询语句,false表示执行的insert、delete、update等。executeUpdate的返回值是int,表示有多少条数据受到了影响。
(5)处理结果
执行的SQL语句是查询语句
●将返回一个ResultSet对象来取出查询结果
●ResultSet对象提供了两类方法:
—next(),previous(),first(),last(),beforeFirst(),afterLast(),absolute()等
用于移动记录的方法【行上的移动和指定】
—getXXX(参数)
获取记录指针指向行,特定列的值【某行列上的移动和指定】
可以使用列索引作为参数【性能好】
可以使用列名称作为参数【可读性强】
●ResultSet对象的实质是一个查询结果集,在逻辑结构上非常类似于一个表
(6)回收资源
●回收数据库资源
—关闭ResultSet
—关闭Statement
—关闭Connection