先介绍一下jdbc连接的流程
1,注册驱动
Class.forName("com.mysql.jdbc.Driver");
通过这句代码,我们会得到com.mysql.jdbc.Driver这个类,先将这个类加载进内存,该类中的静态代码块也会随之进入内存,在静态代码块中已经存在了注册代码.
Driver类如下
public class Driver extends NonRegisteringDriver implements java.sql.Driver {
public Driver() throws SQLException {
}
static {
try {
DriverManager.registerDriver(new Driver());
} catch (SQLException var1) {
throw new RuntimeException("Can\'t register driver!");
}
}
}
为什么不使用DriverManager.registerDriver(new Driver());进行注册?
-驱动是分厂家的
-有重复性的操作(重复的进行注册)
2,创建与数据库的连接,获得连接对象
Connection connection = DriverManager.getConnection(
"jdbc:mysql://localhost:3306?user=用户名,&password=密码");
获取连接对象三种方式:
-第一种
Connection connection = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/数据库名?user=用户名,&password=密码");
// ?连接的是参数
// user是参数名
// 用户名是参数值
// &与是在参数与参数之间起到连接作用
-第二种
Connection connection = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/数据库名",
"用户名",
"密码");
-第三种
// 创建一个Properties对象
// 用来存储参数,用户名,密码
Properties properties = new Properties();
// 以key-values的方式存储
properties.setProperty("user","用户名");
properties.setProperty("password","密码");
Connection connection = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/数据库名",properties);
地址的含义
jdbc:mysql://localhost:3306/数据库名
协议:子协议:本机地址:端口号
3,通过连接对象,获得statement对象
Statement statement = connection.createStatement();
4,由statement对象,执行sql语句
statement.excute(sql语句);
执行sql语句可以使用三个执行方法
-boolean a = execute();
返回值类型是boolean类型,如果执行sql语句后,得到了一个ResutlSet对象,那么返回true;
如果执行sql语句后,得到的是受影响的行数,或者没有得到什么结果,那么返回false;
-int b = executeUpdate();
返回值是int类型,返回的是执行sql语句受影响的行数.
-ResultSet resultSet = executeQuery();
返回值是resultSet对象
可以通过while循环遍历resultSet结果集,进行输出.循环条件为resultSet.next();
判断下一行有没有数据,如果有返回true继续循环,如果没有,返回false,跳出循环.
ResultSet中常用的方法:
resultSet.getRow();//获取当前指针所在位置
resultSet.next();//获取当前指针下一行
resultSet.previous();//获取当前指针上一行
5,释放资源
connection.close();
statement.close();
代码块
{
// 普通代码块
}
static {
// 静态代码块
}
静态代码块的执行过程:当类加载进内存,静态的属性,方法,代码块也随之进入内存.
类加载进内存只执行一次,静态的属性,方法,代码块也执行一次.
静态的属性,方法,代码块的执行顺序不分前后,按顺序执行.
JavaBean使用
创建JavaBean类中
必须包含无参的构造方法
类中的属性,可以不是成员变量,但是属性名必须与表中字段名一致
创建类的集合,可以将查询到的信息,set进类的对象中,再将类的对象添加到集合中,如下代码所示
创建JavaBean类
public class stu{
// 与表中字段名相同的属性名
// 空的构造方法
// get与set方法
// toString方法
}
创建jdbc连接类
public class Jdbc{
public static void main(String[] args) {
// 创建集合
List<Stu> list = new ArrayList<>();
Connection conn = null;
Statement statement = null;
ResultSet res = null;
try{
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/数据库名",
"用户名",
"密码");
statement = conn.createStatement();
res = statement.executeQuery(
"select * from stu;");
while(res.next()) {
// 创建stu对象,将数据set进stu对象
Stu stu = new Stu();
stu.setId(res.getInt("id"));
stu.setName(res.getString("name"));
// 将stu对象,添加进集合
list.add(stu);
}
for(Stu stu: list) {
system.out.println(stu);
}catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(stmt != null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(rs != null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
JDBCUtil
我们可以将jdbc连接过程封装成一个工具类,每次先查询数据库中的数据,我们就可以直接调用这个工具类,避免重复的操作.
public class JdbcUtil {
// 先创建成员变量,赋值为空,之后从配置文件中读取数据内容,洗一次修改路径等,我们就直接可以从配置文件中修改.
// 驱动类的路径
private String driverClass = null;
// 连接数据库路径
private String url = null;
// 用户名
private String user = null;
// 密码
private String pass= null;
// 在静态代码块中注册驱动,从配置文件中读取数据
static {
ClassLoader cl = JDBCUtil.class.getClassLoader();
InputStream stream = cl.getResourceAsStream("jdbcfg.properties");
// 得到流中的数据
// 创建一个Properties对象
Properties properties = new Properties();
// 通过Properties对象的load方法,加载流中的数据
try {
prop.load(stream);
}catch (IOException e) {
e.printStrackTrace();
}
//根据key,获得value
driverClass = prop.getProperty("driverClass");
url = prop.getProperty("url");
user = prop.getProperty("user");
pass = prop.getProperty("password");
try {
Class.forName(driverClass);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
// 写一个静态方法,获取连接对象
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(url,user,password);
}
// 写一个静态方法,用来释放资源
// 如果想要释放Connection对象
// 需要调用Connection对象的close方法
// 所以需要将Connection对象传入到release方法中
// 释放资源
// statement对象与ResultSet对象同理
public static void release(Connection connection ,Statement statement,ResultSet res) {
if(connection != null) {
try{
connection.close();
}catch (SQLException e) {
e.printStackTrace();
}
}
if(statement != null) {
try{
statement.close();
}catch (SQLException e) {
e.printStackTrace();
}
}
if(res != null) {
try{
res.close();
}catch (SQLException e) {
e.printStackTrace();
}
}
}
// 重载release方法
// 当不存在ResultSet时
public static void release(Connection connection ,Statement statement) {
release(connection,statement,null)
}
}