java.sql.Drvier 驱动接口 java.sql.DriverManager:驱动管理类(管理jdbc的驱动服务) java.sql.Connection:与特定数据库的一种会话连接 java.sql.Statement:执行静态sql语句 (执行对象,操作数据库) java.sql.ResultSet:获取数据表的结果集 (接口)JDBC操作步骤中API说明
Jdbc的操作步骤:
1)导包并且注册驱动
Class.forName("com.mysql.jdbc.Driver) ; //mysql5.5对应5.1jar包
这样写的目的是为了保证向后的兼容性:目的就是加载这个类!
本身注册驱动使用的是DriverManager:管理jdbc的驱动服务
方法:public static void registerDriver(Driver driver) throws SQLException
方法的形式参数是接口,需要接口的子实现类对象
接口:java.sql.Drvier
但是不需要使用这种写法,因为驱动jar包已经完成一件事情,注册驱动
public class Driver implements java.sql.Driver //类一加载的时候,就会执行静态代码块,注册驱动
static {
try {
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}
2)获取数据库的连接对象
Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/myee_2203_02",
"root",
"123456"
);
涉及一个类java.sql.DrivarManager:驱动管理类
//获取数据库的连接对象,返回值是java.sql.Connection
public static Connection getConnection(String url, String user, String password) throws SQLException
参数1:url 统一自定义定位符
url: jdbc:mysql://域名:端口号/库名
参数2:user: 登录mysql的用户,默认都是管理员用户
参数3:password:登录mysql的密码
java.sql.Connection //与特定数据库的一种会话连接------连接对象去获取描述表的信息等等
3)获取执行对象
Statement createStatement() throws SQLException //获取执行对象;
PreparedStatement prepareStatement(String sql) throws SQLException //获取预编译对象,并且将sql发送给数据库进行预编译
java.sql.Statement:执行静态sql语句,针对DDL语句(建表),DML语句(insert into,delete ,update)
insert into 表名 values(值1,值2,值3...) ; sql语句直接写死
通用的方法:
int executeUpdate(String sql) //通用的更新操作 针对DDL,DML语句
ResultSet executeQuery(String sql) //针对查询语句的操作 DQL语句
java.sql. PreparedStatement extends java.sql.Statement //预编译对象,
insert into 表名 values(?,?,?,?...) ; //预编译的sql语句
int executeUpdate() //通用的更新操作 针对DDL,DML语句
ResultSet executeQuery() //针对查询语句的操作 DQL语句
java.sql.ResultSet:表示数据库结果集的数据表,通常通过执行查询数据库的语句生成。
封装JDBC基本操作的工具类的步骤
JdbcUtils类
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;
public class JdbcUtils {
//成员变量声明
private static String url = null;
private static String username = null;
private static String password = null;
private static String driverClassname = null;
//try--catch-->ctrl+alt+t---->选择 6
//静态代码块
static {
try {
//应该要获取url,username,password,driverClassname 这几个值
//需要properties配置文件
//java.util.Properties:属性集合列表 :属性列表中的每个键及其对应的值都是一个字符串。
Properties prop = new Properties();
//System.out.println(prop);
//有个功能:public void load(InputStream inStream):将输入流中的内容到属性集合列表中
//读取src下面的jdbc.properties配置文件
//当期类.class.getClassLoader().getResourceAsStream("配置文件的名称xxx.properties") ;---获取资源文件所在的输入流对象
InputStream inputStream = JdbcUtils.class.getClassLoader().getResourceAsStream("jdbc.properties");
//加载流对象到属性集合列表中
prop.load(inputStream);
//System.out.println(prop);
//java.util.Properties的特有功能:可以通过键获取值
//public String getProperty(String key)
driverClassname = prop.getProperty("driverClassname"); //获取驱动类
url = prop.getProperty("url"); //获取url
username = prop.getProperty("username"); //用户名
password = prop.getProperty("password");//密码
//注册驱动
Class.forName(driverClassname);
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
private JdbcUtils() {
}
//获取连接对象
public static Connection getConnnection() {
try {
Connection connection = DriverManager.getConnection(
url,
username,
password
);
return connection;
} catch (SQLException e) {
e.printStackTrace();
}
return null ;
}
//释放资源
//如果是针对ddl语句或者dml语句,Statement对象以及Connection对象关闭
public static void close(Statement stmt, Connection conn) {
close(null, stmt, conn);
}
//如果是针对DQL语句,ResultSet对象以及Statement以及Connection对象关闭
public static void close(ResultSet rs, Statement stmt, Connection conn) {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
//以后事务管理也可以封装到这块
}
jdbc.properties文件
driverClassname=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/myee_2203_02 username=root password=123456JDBC如何操作DQL语句、操作步骤
//1)导包,注册驱动
Class.forName("com.mysql.jdbc.Driver") ;
//2)获取数据库的连接对象
Connnection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/库名",
"root",
"登录数据库的密码"
) ;
//3)准备sql---查询语句
String sql = "select * from 表名" ;
//4)获取执行对象Statement
Statement stmt = conn.createStatement() ;
//5)执行dql语句
ResultSet rs = stmt.executeQuery(sql) ;
//6)遍历结果集的数据
while(rs.next()){
字段类型 变量名= rs.getXXX("字段名称") ;
//或者是 字段类型 变量名 = rs.getXXX(列的索引值) ; //列的索引值1..开始
//使用这个变量名
}
//7)释放资源
rs.close();
stmt.close() ;
conn.close() ;
练习
myee_2203有一张表学生表,将学生表一条数据查询出来,封装学生类中(学生实体),
将多条数据封装到List集合中List
将学生表的数据封装到学生类中,将学生类添加到集合中,遍历集合!
分析:
1)需要有一个学生类,类中每一个属性和表中的字段一一对应
2)JDBC操作执行DQL语句-- 查询学生表数据
3)创建学生类,查询一条,封装一个学生数据,将这个学生类中的数据添加到集合中
4)遍历集合
import com.qf.jdbc_04.JdbcUtils;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
//测试类
public class Test {
public static void main(String[] args) throws Exception {
//调用
List list = findAllStudent();
if(list!=null){
for(Student s:list){
System.out.println(s) ;//执行toString()方法
System.out.println(s.getId()+"----"+s.getName()+"---"+s.getGender()+"---"+s.getAddress()+"---"+s.getHobby());
}
}
}
//定义一个功能
public static List findAllStudent() throws Exception {
//1)创建一个List集合
List list = new ArrayList<>() ;
//2)JDBC操作,获取数据库的连接对象
Connection conn = JdbcUtils.getConnnection();
//3)准备sql
String sql = "select * from student" ;
//4)获取执行对象并且同时执行查询操作
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);
//声明一个Student类型变量s
Student s = null ;
while(rs.next()){//判断是否有下一条数据
//只要下一条数据,就是一个学生对象
s = new Student() ;
//封装数据
//int id = rs.getInt("id"); //获取id值
s.setId(rs.getInt("id"));
s.setName(rs.getString("name"));
s.setGender(rs.getString("gender"));
s.setAddress(rs.getString("address"));
s.setHobby(rs.getString("hobby"));
//还需要将s 这些对象添加到集合中
list.add(s) ;
}
return list ;
}
}
学生实体类的属性需要和数据库表字段一一对应
JavaBean规范特点:
1)当前这个类是具体类–能够描述现实世界事物
2)这个类中属性私有化的
3)这个类需要通过公共的访问方法,setXXX()/getXXX()
4)这个类需要实现序列化接口serializable (目前可以不用),分布式系统中使用;
//学生实体类
public class Student {
private int id ;//编号
private String name ; //姓名
private String gender ;//性别
private String address ;//地址
private String hobby ;//爱好
//alt+ins键 --->选择 constructor--->选择 select none 无参构造方法
public Student() {
}
//alt+ins键 --->选择 constructor--->选中的所有属性
public Student(int id, String name, String gender, String address, String hobby) {
this.id = id;
this.name = name;
this.gender = gender;
this.address = address;
this.hobby = hobby;
}
//alt+ins键 (部分电脑需要按fn) ---->getter and setter
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getHobby() {
return hobby;
}
public void setHobby(String hobby) {
this.hobby = hobby;
}
//alt+ins键--->选择---toString() --防止打印出来地址值
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + ''' +
", gender='" + gender + ''' +
", address='" + address + ''' +
", hobby='" + hobby + ''' +
'}';
}
}



