第七章:JDBC
7.1:jDBC简介
7.1.1:为什么要使用JDBC
Java是通过JDBC技术实现对数据的访问的,JDBC是java数据库(Java database connectivity)技术的简称,它充当java应用程序与各种不同的数据库之间的媒介,吧数据持久化,这就是一种持久化机制
7.1.2:JDBC工作原理
JDBC API
由Sun公司提供的,包括java应用程序的各种不同数据库交互的接口,如connection(连接) Statement(执行sql命令) ResultSet(返回结果集) PreparedStatement接口。
JDBC Driver Manager
JDBC驱动管理程序,负责各种不同的jDBC驱动,把Java应用程序连接到jDBC驱动程序上,位于jdk的java.sql包下面
JDBC驱动
由各厂家提供的,负责连接不同的数据库,mysql和oracle需要不同的数据库。
7.1.3:JDBC Api介绍
DriverManager:装载驱动程序,并且为创建数据库连接提供支持
Connection:负责连接数据量并且传输数据任务
Statement:由connection产生,负责执行sql语句
resultSet:负责保存Statement执行返回的结果集
preparedStatement:是statement的子接口,由connection产生,也是负责执行sql语句。他的安全性更高,高可读性
7.1.4:jDBC访问数据库的步骤
l 加载JDBC驱动(可能会引发异常,所以用ClassNotFoundExeception来声明try——catch)
Class.forName(“JDBc驱动类名称”);
l 与数据库建立连接
Connection conn=DriverManager.getConnection(“数据库连接字符串“,”数据库用户名”,”密码”);
l 发生sql语句,并且返回结果
Statement st=conn.createStatement(); //创建执行sql语句的对象
ResultSet rs=statement.executeQuery(“sql语句”); //返回结果集
l 处理返回的结果
While(rs.next()){ //判断是否有下一行的数据
//读取
Int id=rs.getInt(“id”); 或者 int id=rs.getInt(0);
};
7.2:连接数据库
7.2.3:使用纯java方式连接数据库
需要引入jar包,mysql-connector-java-5.1.0-bin.jar
package cn.jbit.example02;
import java.sql.Connection;
import java.sql.DriverManager;
import org.apache.log4j.Logger;
public class example02 {
private static Logger logger=Logger.getLogger(example02.class.getName());
public static void main(String[] args) {
Connection conn=null;
//加载驱动
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
// TODO: handle exception
logger.error(e);
}
try {
conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/myschool","root","root");
logger.warn("建立连接成功啦");
System.out.println("建立连接成功啦");
} catch (Exception e) {
// TODO: handle exception
logger.error(e);
}finally {
try {
if(null!=conn) {
conn.close();
System.out.println("关闭连接成功!!");
}
} catch (Exception e) {
// TODO: handle exception
logger.error(e);
}
}
}
}
以上是连接数据库的步骤
7.3:Statement接口和ResultSet接口
l Connection接口的方法
方法名称 |
作用 |
Void close() |
立即释放 连接资源 |
Statement crementstatement() |
创建一个Statement的对象,来讲sql语句发送到数据库 |
PreparedStatement preparedStatement(String sql) |
创建一个preparedStatement对象将参赛化的sql语句发送到数据库 |
Boolean isCloseed() |
查询connection是否关闭 |
l Statement接口的常用方法
方法名称 |
作用 |
Result ExecuteQuery(String sql) |
执行sql查询并且返回ResultSet的对象 |
Int executeUpdate(String sql) |
可以执行 insert,update,delete的操作,返回受影响行数 |
Boolean execute(String sql) |
可以执行任意的sql语句,若执行Result对象,则返回true,若执行更新计数或者不存在的结果,返回false |
以下是添加一个记录到数据库
package cn.jbit.example03;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import org.apache.log4j.Logger;
public class example03 {
private static Logger logger=Logger.getLogger(example03.class.getName());
public static void main(String[] args) {
//申明连接对象
Connection conn=null;
//处理执行sql语句的对象
Statement statement=null;
String name="欧欧";
int health=100;
int love=70;
String starin="酷酷的雪拉瑞";
//加载驱动
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (Exception e) {
logger.error(e);
}
try {
//建立连接
conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/epet","wangchao","root");
System.out.println("建立连接成功啦!!");
//创建执行sql语句的对象
statement=conn.createStatement();
//创建一个连接的对象
StringBuffer sb=new StringBuffer();
sb.append(" insert into dog(id,name,health,love,starin) values(");
sb.append(5+",'");
sb.append(name+"',");
sb.append(health+",");
sb.append(love+",'");
sb.append(starin+"')");
//执行sql语句的命令
statement.execute(sb.toString());
System.out.println("插入狗狗成功啦!!");
} catch (SQLException e) {
logger.error(e);
}finally {
try {
if(null!=statement) {
statement.close();
}
if(null!=conn) {
conn.close();
}
} catch (SQLException e) {
logger.error(e);
}
}
}
}
l ResultSet接口常用的方法
方法名称 |
作用 |
Boolean next() |
判断,将光标移到当前位置的下一行 |
Boolean previous() |
将光标移到上一行 |
Void close() |
关闭ResultSet对象 |
Int getInt(int CloumnIndex) |
以int 下标的形式获取该列的值 |
Int getInt(int CloumnName) |
以int列名的形式获取该列的值 |
float getFloate(int CloumnIndex) |
以float 下标的形式获取该列的值 |
Float getfloat(int CloumnName) |
以float列名的形式获取该列的值 |
String getString(int CloumnIndex) |
以String下标的形式获取该列的值 |
String getString(int CloumnName) |
以String列名的形式获取该列的值 |
Int getRow() |
得到光标当前所指行的行号 |
Boolean absolute(int row) |
将光标移动到指定的行 |
7.4:PreparedStatement接口
7.4.1:为什么要使用:PreparedStatement接口
为了防止sql注入攻击,原因是statement接口方法是要进行sql语句的拼接.不仅麻烦而且存在安全隐患,PreparedStatement解决了这个问题
7.4.2: 使用:PreparedStatement接口
方法名称 |
作用 |
Boolean execute() |
`可以执行任意的sql语句,若执行Result对象,则返回true,若执行更新计数或者不存在的结果,返回false |
ResultSet executeQuery() |
执行sql查询,返回ResultSet的对象 |
Int executeUpdate() |
可以执行 insert,update,delete的操作,返回受影响行数 |
Void setInt(int index,int x) |
将指定的参数设置给java int值,也就是给上面的sql语句的格式(?)设置值,前:下标1开始,后:值 |
Void setobject(int index,int x) |
给定对象设置指定参数 |
步骤:
l 创建PreparedStatement对象
通过connection的preparedStatement(String sql) 方法创建PreparedStatement对象,sql语句可以一个或者多个参数,值用一个?占位符表示。
String sql=Update dog set name=?,health=? Where id=?
PreparedStatement ps=conn.preparedStatement(String sql);
l 给每个占位符的参数设置值
Ps.setInt(int index,int values); //第一个:是下标从1开始,第二个:是值
Ps.setString(int index,Stringvalues); //第一个:是下标从1开始,第二个:是值
l 执行sql语句
在设置各个参数值后,就可以调用preparedStatement的方法了(resultSet executeQuery), int execute() , boolean execute()
示例代码如下
package cn.jbit.example07;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;
import org.apache.log4j.Logger;
public class example07 {
private static Logger logger=Logger.getLogger(example07.class.getName());
public static void main(String[] args) {
Connection conn=null;
PreparedStatement pstatement=null;
ResultSet rs=null;
Scanner input=new Scanner(System.in);
System.out.println("请输入用户名:");
String name=input.next();
System.out.println("输入密码:");
String pass=input.next();
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
logger.error(e.getMessage());
}
try {
conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/epet","wangchao","root");
String str=" select * from master where name=? and password=? ";
pstatement=conn.prepareStatement(str);
pstatement.setString(1, name);
pstatement.setString(2, pass);
rs = pstatement.executeQuery();
if(rs.next()) {
System.out.println("成功!");
}else {
System.out.println("失败!!");
}
} catch (SQLException e) {
logger.error(e.getMessage());
}finally {
try {
rs.close();
pstatement.close();
conn.close();
} catch (SQLException e) {
logger.error(e.getMessage());
}
}
}
}