JDBC

JDBC:Java DataBase Connective Java连接数据库
1. 概念: JDBC是一套操作数据库的规范(接口), 使用Java代码操作数据库。
2.jdbc开发步骤:
public class JDBCTest1 {
public static void main(String[] args) throws ClassNotFoundException, SQLException, UnsupportedEncodingException {
// 1.导入驱动jar包 jar .class文件的压缩包
// 2. 加载驱动
Class.forName(“com.mysql.jdbc.Driver”);// 如果jar包是5.1以上的 加载驱动也可以省略不写
// 3.获取连接对象
// 法1:String url = “jdbc:mysql://127.0.0.1:3306/test”;
// “jdbc:mysql://127.0.0.1:3306/test”“;//四部分分别为:主协议:自协议 IP 端口 具体资源
//法2: url jdbc:mysql://localhost:3306/mydemo

String url = “jdbc:mysql:///test”“; // 如果说本地连接数据库 ip和端口号可以省略不写;
String user = “root”;
String password = “123456”;
// DriverManager 作用注册驱动 获取连接对象
Connection conn = DriverManager.getConnection(url, user, password);
// 4.定义sql语句
String sql = “insert into user values(null,’嗨’)”;
// 5.获取操作对象 通过连接对象获取出来
// Statement 操作对象 接口 用于执行静态 SQL 语句并返回它所生成结果的对象。
Statement stat = conn.createStatement();
// 6.执行sql 语句 处理结果
int i = stat.executeUpdate(sql);// stat.executeQuery(sql) 是执行 DQL 语句, 返回的结果是你影响数据库的行数
if (i != 0) {//进行验证
System.out.println(“插入数据成功”);
} else {
System.out.println(“插入数据失败”);
}
// 7.释放资源
stat.close();
conn.close();

}

}

查找数据库的数据
public class JDBCTest2 {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
// 导入驱动jar包
// 加载驱动
Class.forName(“com.mysql.jdbc.Driver”);
// 获取连接对象
Connection conn = DriverManager.getConnection(“jdbc:mysql:///mydemo”, “root”, “123456”);
// 获取操作对象
Statement statement = conn.createStatement();
// 定义sql 语句 DQL
String sql = “select * from user”;
// 执行语句
// statement.executeUpdate(sql)//DML 增删改
// statement.execute(sql); 执行任意sql 语句
// ResultSet 结果集对象 用来封装查询出来的结果
ResultSet resultSet = statement.executeQuery(sql);// 执行DQL 语句
// boolean b = resultSet.next(); 返回值就是用来判断是否还有下一行
User user = null;
ArrayList list = new ArrayList();
while (resultSet.next()) {// 让指针下移一行
// 从结果集中取出数据
// 通过列的编号取数据 从1开始数
// int id = resultSet.getInt(1);
// String username = resultSet.getString(2);
// 通过列名拿数据
int id = resultSet.getInt(“id”);
String username = resultSet.getString(“username”);
// System.out.println(id + “=====” + username);
// 从数据库里取出数据 ,要想使用这些数据,先封装到对象,再把每个对象装到集合里
user = new User(id, username);
// 再把对象装到集合中
list.add(user);
}
// 遍历集合输出
System.out.println(list);
// 释放资源
conn.close();
statement.close();
resultSet.close();

}

}

3.JDBC的接口:
1>、Connection接口:连接对象
1.createStatement():创建数据库连接
2.prepareStatement(String sql):创建预处理语句
3.prepareCall(String sql):创建可调用语句
4.getAutoCommit():获取自动提交的模式
5.setAutoCommit():设置自动提交的模式
6.commit():提交所执行的SQL语句
7.rollback():回滚所执行的SQL语句
8.getMetaData():获取一个DatabaseMetaData对象,该对象包含了有关数据库的基本信息
9.close():关闭数据库连接
10.isClose():判断数据库连接是否超时或被显示关闭
2>、Statement接口:执行命令对象: 把SQL语句发送到数据库执行
1.execute(String sql):执行SQL语句,如果返回值是结果集则为true,否则为false
2.executeQuery(String sql):执行SQL语句,返回值为ResultSet
3.executeUpdate(String sql):执行SQL语句,返回值为所影响的行数
4.addBatch(String sql):向当前Statement对象的命令列表中添加新的批处理SQL语句
5.clearBatch():清空当前Statement对象的命令列表
6.executeBatch():执行当前Statement对象的批处理语句,返回值为每个语句所影响的函数数组
7.getConnection():返回创建了该Statement对象的Connection对象
8.getQueryTimeout():获取等待处理结果的时间
9.setQueryTimeout():设置等待处理结果的时间
3>、ResultSet接口:结果集接口, 必须要保持与数据库的连接!
1.next():将游标下移一行
2.getRow():返回ResultSet中的当前行号
3.refreshRow():更新当前ResultSet中的所有记录
4.getMetaData():返回描述ResultSet的ResultSetMetaData对象
5.isAfterLast(): 是否到了结尾
6.isBeforeFirst(): 是否到了开头
7.isFirst():是否第一条记录
8.isLast(): 是否最后一条记录
9.wasNull():检查列值是否为NULL值,如果列的类型为基本类型,且数据库中的值为0,那么
这项检查就很重要。由于数据库NULL也返回0,所以0值和数据库的NULL不能区分。如果列的类型为对象,可以简单地将返回值与null比较
20.close():关闭当前ResultSet
4>、ResultSetMetaData接口:
1.getColumnCount():返回ResultSet中列的数目
2.getColumnName():返回列在数据库中的名称
3.getColumnType():返回列的SQL类型
4.isNullable():表示该列是否可以存储NULLJDBC

4.JDBC–事务处理
事务使指一组最小逻辑操作单元,里面有多个操作组成。组成事务的每一部分必须要同时提交成功,如果有一个操作失败,整个操作就回滚。
事务ACID特性:
原子性(Atomicity):原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
一致性(Consistency):事务必须使数据库从一个一致性状态变换到另外一个一致性状态。
隔离性(Isolation): 事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
持久性(Durability): 持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响
事务的特性:
原子性,是一个最小逻辑操作单元 。
一致性,事务过程中,数据处于一致状态。
持久性,事务一旦提交成功,对数据的更改会反映到数据库中。
隔离性,事务与事务之间是隔离的。

5.获取自增长键的值
public class JDBCAutoKeyValue {
public static void main(String[] args) throws SQLException {
// 有两张表 添加了外键约束 user 表是主表
// 订单表是从表 这两张表通过外键关联起来 如果在user表里面添加了一个用户 用户的id 是主键
// 那在订单表里面 描述这个用户的订单 那就要拿到这个用户的id
Connection conn = JDBCUtil.getConnection();
// 定义sql语句
String sql = “insert into user values(?,?)”;
// 想要获取到 自增长键的值 在获取预编译对象的时候必须调用两个参数的方法
PreparedStatement statement = conn.prepareStatement(sql, PreparedStatement.RETURN_GENERATED_KEYS);
// statement.setInt(1,300);
statement.setNull(1, Types.INTEGER);// 插入整数空值
statement.setString(2, “李四10”);
// 执行
int i = statement.executeUpdate();
// 获取自增涨键的值
ResultSet resultSet = statement.getGeneratedKeys();
while (resultSet.next()) {
int keys = resultSet.getInt(1);
System.out.println(keys);
}
// 释放资源
JDBCUtil.close(conn, statement, resultSet);

}

}
6.批处理
public class JDBCPCL {
public static void main(String[] args) throws Exception {
//批处理:一次性执行大量数据
ArrayList list = new ArrayList();
for(int i=0;i<100;i++){
User user = new User(i+200,”张三”+i);
list.add(user);
}
//把这50个用户添加到数据库里面去
Connection conn = JDBCUtil.getConnection();
String sql=”insert into user values(?,?)”;
PreparedStatement statement = conn.prepareStatement(sql);
//用批处理来执行循环插入用户
for(User u:list){
statement.setInt(1,u.getId());
statement.setString(2, u.getUsername());
//调用批处理
statement.addBatch();
}
//执行批处理
statement.executeBatch();
//清空批处理
statement.clearBatch();
//释放资源
JDBCUtil.close(conn, statement);
//批处理:添加批处理 addBatch(); 执行批处理 executeBatch(); 清空批处理:clearBatch();
}
}
7.连接池:管理数据库的连接,作用是提高项目的性能.
在连接池初始化的时候存入一定数量的连接,用的时候通过方法获取,不用的时候归还连接即可.
常用连接池:DBCP,C3P0
DBCP:使用步骤:
1.导入jar包(commons-dbcp-1.4.jar和commons-pool-1.5.6.jar)
2.使用api
a.硬编码b.硬编码(不推荐)
//创建连接池
BasicDataSource ds = new BasicDataSource();
//配置信息
ds.setDriverClassName(“com.mysql.jdbc.Driver”);
ds.setUrl(“jdbc:mysql:///day07”);
ds.setUsername(“root”);
ds.setPassword(“1234”);
Connection conn=ds.getConnection();
String sql=”insert into category values(?,?);”;
PreparedStatement st=conn.prepareStatement(sql);
//设置参数
st.setString(1, “c011”);
st.setString(2, “饮料”);
int i = st.executeUpdate();
System.out.println(i);
b.配置文件
//存放配置文件
Properties prop = new Properties();
prop.load(new FileInputStream(“src/dbcp.properties”));
//设置
//prop.setProperty(“driverClassName”, “com.mysql.jdbc.Driver”);
//创建连接池
DataSource ds = new BasicDataSourceFactory().createDataSource(prop);
Connection conn=ds.getConnection();
String sql=”insert into category values(?,?);”;
PreparedStatement st=conn.prepareStatement(sql);
//设置参数
st.setString(1, “c012”);
st.setString(2, “饮料1”);
int i = st.executeUpdate();
System.out.println(i);

C3P0:hibernate和spring使用
有自动回收空闲连接的功能.
使用步骤:
1.导入jar包(c3p0-0.9.1.2.jar)
2.使用api
方式1:硬编码
ComboPooledDataSource ds = new ComboPooledDataSource();
//设置基本参数
ds.setDriverClass(“com.mysql.jdbc.Driver”);
ds.setJdbcUrl(“jdbc:mysql:///day07”);
ds.setUser(“root”);
ds.setPassword(“1234”);
Connection conn=ds.getConnection();
String sql=”insert into category values(?,?);”;
PreparedStatement st=conn.prepareStatement(sql);
//设置参数
st.setString(1, “c013”);
st.setString(2, “毒药”);
int i = st.executeUpdate();
System.out.println(i);
b.配置文件
要求1:配置文件的名称:c3p0.properties 或者 c3p0-config.xml
要求2:配置文件的路径:src下
编码只需要一句话
new ComboPooledDataSource()//使用默认的配置
//可以切换xml配置文件中的标签 来加载不同的配置比如更换Orecal的数据库的配置
new ComboPooledDataSource(String configName)//使用命名的配置 若配置的名字找不到,使用默认的配置.
dbutils:
是apache组织的一个工具类,jdbc的框架,更方便我们使用
使用步骤:
1.导入jar包(commons-dbutils-1.4.jar)
2.创建一个queryrunner类
queryrunner作用:操作sql语句
构造方法: new QueryRunner(Datasource ds);
3.编写sql
4.执行sql
query(..):执行r操作
update(…):执行cud操作

  • 1
    点赞
  • 0
    评论
  • 0
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页

打赏作者

CXX0503

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值