数据库(JDBC)
1. JDBC是什么?
答:JDBC是一种用于执行SQL语句的javaAPI,可以为多种关系型数据库提供统一访问,它是由一组java语言编写的类和接口,JDBC作用就是访问数据库。
2. Jdbc访问数据库需要用到的类,接口,方法?
答: java反射机制Class.forname(classname)–加载数据库驱动
- java.sql.Connection接口
2.java.sql.DriverManager类[管理一组 JDBC 驱动程序的基本服务]
3.java.sql.Statement接口 [用于执行静态 SQL 语句并返回它所生成结果的对象]
4.java.sql.PreparedStatement接口(SQL 语句被预编译并存储在 PreparedStatement 对象中。然后可以使用此对象多次高效地执行该语句。)
DriverManager
管理JDBC驱动的服务类,主要通过它获取Connection数据库链接,常用方法如下:
public static synchronized Connection getConnection(String url, String user, String password) throws Exception;该方法获得url对应的数据库的连接。
Connection常用数据库操作方法:
Statement createStatement throws SQLException: 该方法返回一个Statement对象。
PreparedStatement prepareStatement(String sql) throws SQLException;该方法返回预编译的Statement对象,即将SQL语句提交到数据库进行预编译。
CallableStatement prepareCall(String sql) throws SQLException:该方法返回CallableStatement对象,该对象用于存储过程的调用。
上面的三个方法都是返回执行SQL语句的Statement对象,PreparedStatement、CallableStatement的对象是Statement的子类,只有获得Statement之后才可以执行SQL语句。
Statement
用于执行SQL语句的API接口,该对象可以执行DDL、DCL语句,也可以执行DML语句,
还可以执行SQL查询语句,当执行查询语句是返回结果集,常用方法如下:
ResultSet executeQuery(String sql) throws SQLException:该方法用于执行查询语句,并返回查询结果对应的ResultSet对象,该方法只用于查询语句。
int executeUpdate(String sql) throws SQLException:该方法用于执行DML语句,并返回受影响的行数;
该方法也可以执行DDL,执行DDL返回0;
boolean execute(String sql) throws SQLException:该方法可以执行任何SQL语句,如果执行后第一个结果是ResultSet对象,则返回true;如果执行后第一个结果为受影响的行数或没有任何结果,则返回false;
PreparedStatement
预编译的statement对象,PreparedStatement是Statement的子接口,它允许数据库预编译SQL(通常指带参数SQL)语句,以后每次只改变SQL命令参数,避免数据库每次都编译SQL语句,这样性能就比较好。而相对于Statement而言,使用PreparedStatement执行SQL语句时,无需重新传入SQL语句,因为它已经预编译了SQL语句。
但是PreparedStatement需要为编译的SQL语句传入参数值,所以它比了如下方法:
void setXxx(int index, value)根据该方法传入的参数值的类型不同,需要使用不同的方法。传入的值的类型根据传入的SQL语句参数而定。
ResultSet
void close() throws SQLException:释放、关闭ResultSet对象
boolean absolute(int row):将结果集移动到第几行,如果row是负数,则移动到倒数第几行。
如果移动到的记录指针指向一条有效记录,则该方法返回true;
void beforeFisrt(): 将ResultSet的记录指针定位到首行之前,这是ResultSet结果集记录指针的初始状态:记录指针的起始位置位于第一行之前。
boolean first():将ResultSet的记录指针定位到首行。如果移动后的记录指针指向一条有效记录,则该方法返回true。
boolean previous():将ResultSet的记录指针定位到上一行,如果移动后的记录指针指向一条有效记录,则该方法返回true。
boolean next():将ResultSet的记录指针定位到下一行。如果移动后的记录指针指向一条有效记录,则返回true。
boolean last():将ResultSet的记录指针定位到最后一行。如果移动后的记录指针指向一条有效记录,则返回true。
void afterLast():将ResultSet的记录指针定位到最后一行之后。
注意:在JDK1.4以前只支持next移动,且每次移动一个位置。到JDK1.5就可以随意定位。
3.Jdbc访问数据库的流程?
答:
- 下载数据库驱动包“mysql-connector-java-5.1.38.jar”
- 打开数据库创建保存数据的数据表
--创建数据库表
create table t_person(
per_id int primary key auto_increment,
per_name varchar(20),
per_age int,
per_sex bit,
per_address varchar(30)
);
- 创建一个普通的java工程
- 导入数据库驱动包到java工程
- 在java工程下创建一个“lib”文件夹,将下载好的数据库驱动赋值到lib文件夹中
- 选中工程—右键–Bulid Path–Configure Bulid Path–Libraries–Add Jars…–自己工程—lib–数据库驱动包—选中—OK
- 参照数据库表创建保存数据的java类
package com.click369.bean;
import java.io.Serializable;
/**
* 保存个人信息的java类
* @author Administrator
*
*/
@SuppressWarnings("serial")
public class Person implements Serializable{
private int perid;
private String pername;
private int perage;
private boolean persex;
private String peraddress;
public int getPerid() {
return perid;
}
public void setPerid(int perid) {
this.perid = perid;
}
public String getPername() {
return pername;
}
public void setPername(String pername) {
this.pername = pername;
}
public int getPerage() {
return perage;
}
public void setPerage(int perage) {
this.perage = perage;
}
public boolean isPersex() {
return persex;
}
public void setPersex(boolean persex) {
this.persex = persex;
}
public String getPeraddress() {
return peraddress;
}
public void setPeraddress(String peraddress) {
this.peraddress = peraddress;
}
}
- 加载数据库驱动得到数据库连接
package com.click369.db;
/**
* 数据库连接的管理类
* 1.加载数据库驱动
* 2.得到数据库连接
* @author Administrator
*
*/
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DBConnection{
//定义数据库驱动名称
private static final String DRIVERNAME="com.mysql.jdbc.Driver";
//定义连接数据库的url
private static final String URL="jdbc:mysql://127.0.0.1:3306/mydb1";
//定义数据库访问用户名
private static final String USERNAME="root";
//定义访问数据库的密码
private static final String PASSWORD="123456";
//加载数据库驱动
//1.构造方法加载数据库驱动
/*
public DBConnection(){
//通过反射机制加载数据库驱动
try {
Class.forName(DRIVERNAME);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
*/
//2.通过静态代码块加载驱动
static{
//通过反射机制加载数据库驱动
try {
Class.forName(DRIVERNAME);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
/**
* 得到数据库连接
*/
public static Connection getMyConnection(){
//定义数据库连接对象
Connection conn=null;
//得到数据库连接
try