java项目进入mysql-connector-java-5.1.48.jar
MySQL5.7
一、JDBC概述1、持久化(persistence)
1)什么是持久化?
来自孙卫琴写的《精通Hibernate:Java对象持久化技术详解》中,的解释,感觉还是比较完整:
狭义的理解: “持久化”仅仅指把域对象永久保存到数据库中;广义的理解,“持久化”包括和数据库相关的各种操作(持久化就是将有用的数据
以某种技术保存起来,将来可以再次取出来应用,数据库技术,将内存数据一文件的形式保存在永久介质中(磁盘等)都是持久化的例子.)。
保存:把域对象永久保存到数据库。
更新:更新数据库中域对象的状态。
删除:从数据库中删除一个域对象。
加载:根据特定的OID,把一个域对象从数据库加载到内存。
查询:根据特定的查询条件,把符合查询条件的一个或多个域对象从数据库加载内在存中。
2)为什么要持久化?
持久化技术封装了数据访问细节,为大部分业务逻辑提供面向对象的API。优点:
通过持久化技术可以减少访问数据库数据次数,增加应用程序执行速度;
代码重用性高,能够完成大部分数据库操作;
松散耦合,使持久化不依赖于底层数据库和上层业务逻辑实现,更换数据库时只需修改配置文件而不用修改代码。
2、JDBC(Java DataBase Connectivity)
JDBC(java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序,同时,JDBC也是个商标名。
JDBC访问数据库的主要两种形式:
1)直接使用JDBC的API访问数据库服务器(MySQL/Oracle)。
2)间接使用JDBC的API访问数据库服务器,即使用第三方ORM工具(MyBatis/Hibernate等),底层依然是JDBC.
JDBC是java访问数据库的基石,其他技术都是对JDBC的封装。
JDBC是java访问数据库的一个标准,是进行数据库访问连接的抽象层,接口的具体实现由各大数据库厂商来完成,即驱动包。
JDBC的API在 java.sql包下,在开发中,导包是全部使用java.sql包中的,通用。
二、JDBC实现CRUD1、操作JDBC的步骤:
1、加载注册驱动
2、获取连接对象
3、创建语句对象
4、执行SQL语句
5、释放/关闭资源
2、操作JDBC用到的核心接口:具体查看API
1)java.sql.Driver接口:
每个驱动程序类必须实现的接口。
加载注册驱动时,
通过反射机制会把 com.mysql.jdbc.Driver类字节码加载进JVM,同时,会JVM执行该字节码中的静态代码块。
2)java.sql.DriverManager类:
用于管理一组JDBC驱动程序的基本服务
-
-
static Connection
getConnection(String url, String user, String password)
尝试建立与给定数据库URL的连接。
-
参数
url - 连接数据库的URL,以mysql连接
格式为jdbc:mysql://localhost:3306/数据库名
如果连接为本机,端口为默认的3306,则可简写为jdbc:mysql:///数据库名
user - 正在连接的数据库用户名
password - 用户密码
3)java.sql.Connection接口:
与特定数据库的连接(会话)。 执行SQL语句并在连接的上下文中返回结果。
-
-
Statement
createStatement()
创建一个
Statement
对象,用于将SQL语句发送到数据库。void
close()
Connection
发布此Connection
对象的数据库和JDBC资源,而不是等待它们自动释放。
-
4)java.sql.Statement接口:
用于执行静态SQL语句并返回其生成的结果的对象。
-
-
void
close()
Statement
对象的数据库和JDBC资源,而不是等待它自动关闭时发生。ResultSet
executeQuery(String sql)
执行给定的SQL语句,该语句返回单个
ResultSet
对象。int
executeUpdate(String sql)
执行给定的SQL语句,这可能是
INSERT
,UPDATE
,或DELETE
语句,或者不返回任何内容,如SQL DDL语句的SQL语句。
-
对于DQL返回查询的结果集
对于DML返回受影响的行数
对于DDL返回0
5)java.sql.ResultSet接口:
表示数据库结果集的数据表,通常通过执行查询数据库的语句生成。
ResultSet对象保持一个光标指向其当前的数据行。 最初,光标位于第一行之前。 next方法将光标移动到下一行,并且由于在ResultSet对象中没有更多行时返回false ,因此可以在while循环中使用循环来遍历结果集。
-
-
void
close()
ResultSet
释放此ResultSet
对象的数据库和JDBC资源,而不是等待其自动关闭时发生。boolean
next()
将光标从当前位置移动到下一行。
-
3、创建表
// 创建t_user表,异常先抛出
@Test
public void testCreatTable() throws ClassNotFoundException, SQLException {
String sql = "CREATE TABLE t_user (id bigint(20) NOT NULL AUTO_INCREMENT PRIMARY KEY,username varchar(30) ,age int(11) ) ;";
//1、加载注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2、获取连接对象
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbcdemo", "root", "123456");
//3、创建语句对象
Statement statement = connection.createStatement();
//4、执行SQL语句
int rows = statement.executeUpdate(sql);
//5、释放/关闭资源
statement.close();
connection.close();
System.out.println(rows); //0
}
4、新增、修改和删除
// 新增,修改和删除操作
@Test
public void testIUD() throws Exception {
// String sql = "INSERT INTO t_user(username,age) VALUES('赵云',17)";
// String sql = "UPDATE t_user SET username='赵子龙' WHERE id = 1";
String sql = "DELETE FROM t_user WHERE id = '1'";
//1、加载注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2、获取连接对象
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbcdemo","root","123456");
//3、创建语句对象
Statement statement = connection.createStatement();
//4、执行SQL语句
int rows = statement.executeUpdate(sql);
//5、释放/关闭资源
statement.close();
connection.close();
System.out.println(rows); //1
}
5、select查询
1)查询统计记录条数
/*
1、查询t_user表共多少条记录
mysql> SELECT count(id) rows FROM t_user;
+------+
| rows |
+------+
| 4 |
+------+
1 row in set (0.04 sec)
*/
@Test
public void testSelectCount() throws Exception {
String sql = "SELECT count(id) rows FROM t_user";
//1、加载注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2、获取连接对象
Connection connection= DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbcdemo","root","123456");
//3、创建语句对象
Statement statement = connection.createStatement();
//4、执行SQL语句
ResultSet resultSet = statement.executeQuery(sql);
//处理结果集
if(resultSet.next()){
// long totalCount = resultSet.getLong(1);
long totalCount = resultSet.getLong("rows");
System.out.println(totalCount); //4
}
//5、释放/关闭资源
statement.close();
connection.close();
}
2)查询结果集
/*
2、查询t_user表中age >= 18 的记录
mysql> SELECT * FROM t_user WHERE age >= 18;
+----+----------+-----+
| id | username | age |
+----+----------+-----+
| 3 | 赵云 | 18 |
| 4 | 后裔 | 18 |
| 5 | 猴子 | 19 |
+----+----------+-----+
3 rows in set (0.04 sec)
*/
@Test
public void testSelect() throws Exception {
String sql = "SELECT * FROM t_user WHERE age >= 18";
//1、加载注册对象
Class.forName("com.mysql.jdbc.Driver");
//2、获取连接数据库
Connection connection= DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbcdemo","root","123456");
//3、创建语句对象
Statement statement = connection.createStatement();
//4、执行SQL语句
ResultSet resultSet = statement.executeQuery(sql);
//处理结果集
while (resultSet.next()){
long id = resultSet.getLong("id");
String username = resultSet.getString("username");
int age = resultSet.getInt("age");
System.out.println(id + "," + username + "," + age);
}
//5、释放/关闭资源
statement.close();
connection.close();
}
站在前辈的肩膀上,每天进步一点点
ends~