一、JDBC概述
1.什么是JDBC
- 是一种用于执行SQL语句的Java API
- 它由一组用Java语言编写的类和接口组成
- JDBC提供了一种操作数据的标准
- JDBC的目标是使Java程序员使用JDBC可以连接任何提供了JDBC驱动程序的数据库系统
2.驱动连接
java.sql包装的就是JDBC的API。各大数据库厂商就会对JDBC的API提供实现类驱动包。注意不要引错包,不用引用这个不要引入com.mysql..Xxx类
二、连接MySQL
连接主要分为两步,第一步为加载驱动,第二步为建立连接获取连接对象。由于我用的数据库是MySQL所以在这只介绍MySQL连接。MySQL经历升级后现在分为两种驱动连接。具体的可以看这篇博文https://www.cnblogs.com/NyanKoSenSei/p/11510438.html。由于我使用的是MySQL8所以这边只列出5以上版本的连接方法
public static void main(String[] args) throws Exception {
//1.加载驱动
//把com.mysql.jdbc.Driver这份字节码加载进JVM
//当一份字节码被加载到JVM时,就会执行该字节码中的静态代码块
Class.forName("com.mysql.cj.jdbc.Driver");
//2.获取连接对象
//url数据库地址
String url = "jdbc:mysql://localhost:3306/promission?serverTimezone=UTC&characterEncoding=utf-8";
//用户名
String user = "root";
//密码
String password = "123456";
//获取连接对象
Connection conn = DriverManager.getConnection(url, user, password);
System.out.println(conn);
}
java在1.6以后可以不需要写第一步加载驱动,java会自动将图中文件将此字节码加载进jvm。但是如果是做javaweb开发则必须加上第一步,javaweb不会自动加载此字节码。
三、DDL&DML
连接好数据库后我们改怎么建表,插入呢?
- 用string创建sql语句对象
- 创建Statement接口,用来执行静态sql语句对象
- 把SQL语句发送到数据库中去执行,并返回执行的结果。对于DQL返回查询的结果集,对于DML返回受影响的行数,对于DDL返回0。
- executeUpate(String)执行DML和DDL语句
- 关闭资源
//编写sql语句
String s = "create table stu(id int, age int, name varchar(20))";
Statement st = conn.createStatement();
//执行sql
int row = st.executeUpdate(s);
//关闭资源
st.close();
conn.close();
为什么需要释放资源?
Connection连接就相当于Java和到Mysql之间建立管道。连接只连接到数据,Statement 就相当于从数据库又接了一个管道连接Mysql的执行程序。就如下图一般,所以在我们使用完后需要一级一级释放资源。
我们已经大致了解了如何利用jdbc操纵数据库,上面代码都直接将异常抛出了,但实际中我们不能这么做所以下面提供较为完整的代码
public static void main(String[] args) {
Connection conn = null;
Statement st = null;
try {
// 1.加载驱动
// 把com.mysql.jdbc.Driver这份字节码加载进JVM
// 当一份字节码被加载到JVM时,就会执行该字节码中的静态代码块
Class.forName("com.mysql.cj.jdbc.Driver");
// 2.获取连接对象
// url数据库地址
String url = "jdbc:mysql://localhost:3306/jdbc_db?serverTimezone=UTC&characterEncoding=utf-8";
// 用户名
String user = "root";
// 密码
String password = "123456";
// 获取连接对象
conn = DriverManager.getConnection(url, user, password);
// 3.编写sql语句
String s = "insert into stu(id, age, name)values(001, 20, 'xiaoming')";
st = conn.createStatement();
// 4.执行sql
int row = st.executeUpdate(s);
System.out.println(row);
} catch (Exception e) {
} finally {
// 5.关闭资源
if (st != null) {
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
三、查询(DQL)
查询操作与上面类似,只是查询操作使用的是executeQuery(Sql)方法返回的是一个结果集(ResultSet)并不是像上面一般返回一个值。结果集中表示的是数据库查询的结果的集合,在执行查询语句时就会得到一个这样的结果。
查询常用方法有:
- boolean next():判断是否有下一行数据,若有,则向下移动一行指针.
- getXxx(int columnIndex):获取当前行中,第几列.(从1开始):不推荐
- getXxx(String columnName):获取当前行中的,指定列名的列的值.columnName是列名/列的别名
- 若列的类型是VARCHAR/CHAR/TEXT,都使用getString来获取列的值.
- 若列的类型是int/integer/-->getInt来获取列的值.
- executeQuery(Sql)会得到一个结果集
下图是java-MySQL常用数据类型对照表
下面列出一次查询多条数据的代码,异常全部抛出方便阅读:
public static void main(String[] args) throws Exception {
Class.forName("com.mysql.cj.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/jdbc_db?serverTimezone=UTC&characterEncoding=utf-8";
String user = "root";
String pwd = "123456";
Connection conn = DriverManager.getConnection(url, user, pwd);
String sql = "SELECT * FROM stu;";
Statement st = conn.createStatement();
ResultSet set = st.executeQuery(sql);
while(set.next()) {
int id = set.getInt("id");
int age = set.getInt("age");
String name = set.getString("name");
System.out.println("id = "+id+" age = "+age+" name = "+name);
}
st.close();
conn.close();
}
四、DAO
1.什么是DAO
我们在前面可以发现,每次我们访问数据库都需要重复的写加载驱动、连接语句等等。这样会产生许多的重复代码,并且十分的不方便。所以DAO便应运而生了。什么是DAO?DAO全称Data Access Object(数据存取对象),位于业务逻辑(test)和持久化数据(DB)之间实现对持久化数据的访问。以后我们程序便是通过DAO进行访问数据库,通过DAO提供的操作进行对数据库的访问、修改。
2.ORM
在进行DAO设计前我们先需要了解ORM。什么是ORM?ORM是对象关系映射,将关系数据库中表中的记录映射成为对象,以对象的形式展现,因此ORM的目的是为了方便开发人员以面向对象的思想来实现对数据库的操作。对应关系如下图所示
具体的一个代码例子如下:
3.domain
了解完ORM接下来我们还需要了解domain。那么什么是domain?domain就是一类类,这个类符合JavaBean规范(一个类当中有字段和该字段的getter与Setter方法)。domain的作用是用户与数据库交互的核心中转站。正如我们上面提到的ORM一般,domain其实就是orm加上getter与setter方法。
一个domain类如下图所示:
如何使用domain保存数据?见下图
在此图中我们很容易可以看出,通过对Stu类(domain)的一个对象s进行赋值,然后将s传入DAO层,在DAO层中解析s对象,取出对象中的数据,将数据拼接成sql语句然后对DB进行操作。
如何使用domain获取数据?见下图
在此图中我们表示了domain如何从DB中获取数据,在test1我们想要获取id = 1的记录,所以我们利用DAO层中的getStu(id)方法查询DB,将DB返回给我们的结果封装到一个Stu对象中,最后返回这个对象给test1。