JDBC个人复习资料
https://how2j.cn/
JDBC是什么?
JDBC(Java Data Base Connectivity),通过Java编程语言来对数据库进行访问.
Java数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。JDBC也是Sun Microsystems的商标。我们通常说的JDBC是面向关系型数据库的。
JDBC怎么用?
JDBC的基本使用
要想使用JDBC,实现要导入相应jar包或者相应的maven坐标.
具体流程:
1. 注册驱动
2. 获取数据库连接对象
3. 获取SQL语句操作对象
4. 执行SQL语句
//1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2.建立与数据库的连接
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis", "root", "root");
//3.创建Statement
Statement statement = connection.createStatement();
//4.定义SQL语句
String sql="delete from user where id = 52";
//执行SQL语句
statement.execute(sql);
JDBC的删除,增加,修改
在JDBC中,增加,删除,修改操作相同,只是操作的SQL语句不同.
删除:
String sql="delete from user where id = 52";
//执行SQL语句
statement.execute(sql);
增加:
String sql="INSERT INTO USER (username,sex,address)VALUES('赵','女','唐山')";
//执行sql语句
boolean execute = statement.execute(sql);
修改:
String sql=" update user set sex = '男' where id = 51";
//执行SQL语句
statement.execute(sql);
JDBC查询
//定义SQL语句
String sql=" select * from user ";
//执行SQL语句
ResultSet resultSet = statement.executeQuery(sql);
while (resultSet.next()) {
int id = resultSet.getInt("id");// 可以使用字段名
String username = resultSet.getString(2);// 也可以使用字段的顺序
Date birthday = resultSet.getDate("birthday");
String sex = resultSet.getString(4);
String address = resultSet.getString(5);
System.out.println(id+username+birthday+sex+address);
}
注意:
在取第二列的数据的时候,用的是rs.get(2) ,而不是get(1). 这个是整个Java自带的api里唯二的地方,使用基1的,即2就代表第二个。
Statement和PreparedStatement区别
和 Statement一样,PreparedStatement也是用来执行sql语句的
与创建Statement不同的是,需要根据sql语句创建PreparedStatement
除此之外,还能够通过设置参数,指定相应的值,而不是Statement那样使用字符串拼接
//3.定义SQL语句
String sql=" INSERT INTO USER (username,sex,address)VALUES(?,?,?)";
//4.创建PreparedStatement
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1,"张三");
preparedStatement.setString(2,"男");
preparedStatement.setString(3,"北京");
//执行SQL语句
preparedStatement.execute();
preparedStatement.close();
connection.close();
使用PreparedStatement的优点:
* Statement 需要进行字符串拼接,可读性和维护性比较差,而PreparedStatement 使用参数设置,可读性好,不易犯错.
* PreparedStatement有预编译机制,性能比Statement更快
* 防止SQL注入式攻击
execute与executeUpdate的区别
相同点:
都可以执行增加,删除,修改
不同点:
1. execute可以执行查询语句,然后通过getResultSet,把结果集取出来,而executeUpdate不能执行查询语句
s.execute(sqlSelect);
ResultSet rs = s.getResultSet();
2. execute返回boolean类型,true表示执行的是查询语句,false表示执行的是insert,delete,update等操作,executeUpdate返回的是int,表示有多少条数据受到了影响.
JDBC特殊操作
- 获取自增长ID
在Statement通过execute或者executeUpdate执行完插入语句后,MySQL会为新插入的数据分配一个自增长id,但是无论是execute还是executeUpdate都不会返回这个自增长id是多少。需要通过Statement的getGeneratedKeys获取该id.
preparedStatement.execute();
ResultSet generatedKeys = preparedStatement.getGeneratedKeys();
if (generatedKeys.next()) {
int id = generatedKeys.getInt(1);
System.out.println(id);
}
- 获取元数据
元数据概念:
和数据库服务器相关的数据,比如数据库版本,有哪些表,表有哪些字段,字段类型是什么等等。
//1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2.建立与数据库的连接
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis", "root", "root");
// 查看数据库层面的元数据
// 即数据库服务器版本,驱动版本,都有哪些数据库等等
DatabaseMetaData dbmd = connection.getMetaData();
// 获取数据库服务器产品名称
System.out.println("数据库产品名称:\t"+dbmd.getDatabaseProductName());
// 获取数据库服务器产品版本号
System.out.println("数据库产品版本:\t"+dbmd.getDatabaseProductVersion());
// 获取数据库服务器用作类别和表名之间的分隔符 如test.user
System.out.println("数据库和表分隔符:\t"+dbmd.getCatalogSeparator());
// 获取驱动版本
System.out.println("驱动版本:\t"+dbmd.getDriverVersion());
System.out.println("可用的数据库列表:");
// 获取数据库名称
ResultSet rs = dbmd.getCatalogs();
while (rs.next()) {
System.out.println("数据库名称:\t"+rs.getString(1));
JDBC事务
在事务中的多个操作,要么都成功,要么都失败
通过 setAutoCommit(false);关闭自动提交
使用 commit();进行手动提交
在事务中,及时第一条SQL语句是可以执行的,但是第二条SQL语句有错误,其结果就是两条SQL语句都没有被提交。 除非两条SQL语句都是正确的。
// 有事务的前提下
// 在事务中的多个操作,要么都成功,要么都失败
c.setAutoCommit(false);
// 加血的SQL
String sql1 = "update hero set hp = hp +1 where id = 22";
s.execute(sql1);
// 减血的SQL
// 不小心写错写成了 updata(而非update)
String sql2 = "updata hero set hp = hp -1 where id = 22";
s.execute(sql2);
// 手动提交
c.commit();
注意: MYSQL 表的类型必须是INNODB才支持事务
JDBC ORM思想
ORM(Object Relationship Database Mapping) 就是实现对象和关系数据库的映射关系.数据库中每一个表都对应一个类.每行数据对应一个对象.
JDBC Dao
DAO(DataAccess Object),数据访问对象
实现将对数据库的操作封装在一个类中.其他类需要对数据库进行访问只需要调用该类即可.
JDBC数据库连接池
连接池的概念
与传统方式不同,连接池在使用之前,就会创建好一定数量的连接。
如果有任何线程需要使用连接,那么就从连接池里面借用,而不是自己重新创建.
使用完毕后,又把这个连接归还给连接池供下一次或者其他线程使用。
倘若发生多线程并发情况,连接池里的连接被借用光了,那么其他线程就会临时等待,直到有连接被归还回来,再继续使用。
整个过程,这些连接都不会被关闭,而是不断的被循环使用,从而节约了启动和关闭连接的时间。
常用连接池:
- DBCP
- c3p0
- druid