1.JDBC的使用步骤
- 注册驱动 (1)DriverManager:用于注册驱动
- 获取数据库连接 (2)Connection:用于数据库的连接
- 获取执行SQL语句对象 (3)Statement:执行SQL语句的对象
- 执行SQL语句并返回结果 (4)ResultSet:结果集或一张虚拟表
- 处理结果
- 释放资源
2.JDBC注册驱动
在注册驱动前,首先需要将数据库连接的jar包导入项目中
新建一个文件夹lib用于存放jar包,将jar包直接复制进去,选中jar包,右键选择Add as Library即可。
public class Demo02 {
public static void main(String[] args) throws SQLException {
//1.注册驱动
DriverManager.registerDriver(new Driver());
}
}
3. 获取数据库连接
Connection:表示Java程序与数据库之间的连接,只有拿到Connection才能操作数据库。
static Connection getConnection(String url,String user,String password)
URL:链接数据库的url,用于说明数据库的位置
user:数据库的账号
password:数据库的密码
连接数据库的URL地址格式:协议名:自协议://服务器名或ip地址:端口号/数据库名
示例:jdbc:mysql://loacalhost:3306/mydb
//2.获取数据库连接
Connection cn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "root");
4.获取执行SQL语句对象
Statement st = cn.createStatement();
5.JDBC实现对单表数据的增删改
增加一条数据示例(删除与修改只需要更改sql语句即可):
public class Demo03 {
public static void main(String[] args) throws SQLException {
// 1.注册驱动(自动注册)
// 2.获取Connection连接
Connection cn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "root");
// 3.获取Statement(小货车)
Statement st = cn.createStatement();
// 4.执行SQL语句
String sql = "insert into user values(null,'aqi','888')";
//返回影响的行数
int row = st.executeUpdate(sql);
// 5.处理结果
System.out.println(row);
// 6.释放资源
st.close();
cn.close();
}
}
6.查询并处理ResultSet对象
ResultSet用于保存执行查询SQL语句的结果。我们不能一次性取出所有的数据,需要一行一行的取出。其内部有一个指针,记录获取到哪行数据
public class Demo04 {
public static void main(String[] args) throws SQLException {
// 1.注册驱动(自动注册)
// 2.获取连接
Connection cn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "root");
// 3.获取Statement小货车
Statement st = cn.createStatement();
// 4.执行SQL语句
String sql = "SELECT * FROM user;";
ResultSet rs = st.executeQuery(sql);
// 5.处理结果
// System.out.println("rs = " + rs);
List<User> list = new ArrayList<User>();
while (rs.next()) {
//获取当前行的数据
int id = rs.getInt("id");
String name = rs.getString("name");
String password = rs.getString("password");
// System.out.println("id:" + id + " ,name:" + name + " ,password:" + password);
User user = new User(id, name, password);
list.add(user);
}
// 6.关闭资源
rs.close();
st.close();
cn.close();
list.forEach(System.out::println);
}
打印结果:(通过新建User类对查询结果进行封装)
7.JDBC中使用事务
使用步骤:①注册驱动 ②获取连接 ③开启事务 ④获取到Statement ⑤Statement执行SQL ⑥提交或回滚事务 ⑦关闭资源
void setAutoCommit(boolean autoCommit)false:开启事务,true:关闭事务
void commit():提交事务
void rollback():回滚事务
public class Demo05 {
public static void main(String[] args) {
Connection cn = null;
Statement st = null;
try {
// 1.注册驱动(自动注册)
// 2.获取连接
cn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "root");
// 3.开启事务
cn.setAutoCommit(false);
// 4.获取到Statement
st = cn.createStatement();
// 5.Statement执行SQL
// 大壮-500
st.executeUpdate("update account set balance = balance -500 where NAME = 'dazhuang'");
// 小美+500
st.executeUpdate("update account set balance = balance + 500 where NAME = 'xiaomei'");
// 6.成功提交事务
cn.commit();
System.out.println("事务提交成功");
}catch (Exception throwables) {
// 6.失败回滚事务
try {
cn.rollback();
System.out.println("事务失败回滚");
} catch (SQLException e) {
throw new RuntimeException(e);
}
throwables.printStackTrace();
}finally {
try {
st.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
try {
cn.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
}
8.数据库连接池
JDBC访问数据库的步骤:创建数据库——>运行sql语句——>关闭连接,每次数据路访问执行这样重复的操作,但获取数据库连接需要消耗比较多的资源,每次操作都要重新获取新的连接对象,执行一次就把连接关闭,这样数据库连接对象的使用效率很低。
连接池:连接池就是一个容器,连接池中保存了一些数据库的连接,这些连接是可以重复使用的。
连接池原理:
1.启动连接池,连接池就会初始化一些连接
2.当用户需要使用数据库连接,直接冲连接池中取出
3.当用户使用完连接,会将连接重新放回连接池中
将jar包导入到项目中,
相关配置文件:
public class Demo {
public static void main(String[] args) throws Exception {
//3.加载properties文件的内容到Properties对象中
Properties pp = new Properties();
FileInputStream fis = new FileInputStream("xm\\src\\druid.properties");
pp.load(fis);
//4.创建Druid连接池,使用配置文件中的参数
DataSource ds = DruidDataSourceFactory.createDataSource(pp);
//5.从Druid连接池中取出连接
Connection cn = ds.getConnection();
//6.执行SQL语句,预编译的方式
String sql = "insert into user values (null,?,?);";
PreparedStatement ps = cn.prepareStatement(sql);
ps.setString(1,"zyyt");
ps.setString(2,"9999");
int row = ps.executeUpdate();
System.out.println(row);
//7.关闭资源
ps.close();
//使用连接池后,这里不是关闭连接,而是放回连接池
cn.close();
fis.close();
}
}