发表于: 2020-10-08 23:44:53
1 1241
今天完成的事情:
遇到的问题:
JDBC入门
JDBC,全称为Java database connectivity。
也就是Java和数据库的连接。
1.什么是 JDBC?(https://blog.csdn.net/qq_43674132/article/details/95171884)
JDBC 规范定义接口(getConnection()),具体的实现由各大数据库厂商来实现。
JDBC 是 Java 访问数据库的标准规范,真正怎么操作数据库还需要具体的实现类,也就是数据库驱动。每个数据库厂商根据自家数据库的通信格式编写好自己数据库的驱动。所以我们只需要会调用 JDBC 接口中的方法即可,数据库驱动由数据库厂商提供。
接口是什么?
接口调用方法,实际上是其实现类重写后的方法。
也就是说:如果数据库是MySQL,它要实现Java里的这个接口,同时重写getConnection方法。
具体是如何连接数据库的,Java不管。
1.注册驱动
DriverManager是Java里的一个类,驱动管理器。
2.获取连接
DriverManager类有一个静态方法getConnection()
直接调用就是获取连接的意思
//2.连接对象
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db4","root","wsj199599");
//3.通过连接对象得到语句对象
stmt = conn.createStatement();
3.创建sql执行语句
connection有一个createStatement()方法。
就是创建语句的意思。
我们数据库查询操作的sql语句。
statement等于是将在Java程序里输入的sql语句告诉给数据库。
这个语句在MySQL内也能运行
String sql = "create table student (id int PRIMARY key auto_increment, name varchar(20) not null, gender boolean, birthday date);";
4.执行语句
也就是我们在数据库上输入的sql语句,只不过在Java里它就是一个字符串。
statement有一个executeUpdate()方法
execute,执行的意思。
Update,更新的意思。
因为输入的sql语句为查询语句,那么就调用执行更新方法。
//5.执行SQL
int count = stmt.executeUpdate(sql);
//6.返回影响行数(DDL 没有返回值)
System.out.println(count);
5.释放资源
1) 需要释放的对象:ResultSet 结果集,Statement 语句,Connection 连接
2) 释放原则:先开的后关,后开的先关。ResultSet Statement Connection
3) 放在哪个代码块中:finally 块
6.查看结果
执行 DML 操作
- 需求:向学生表中添加 4 条记录,主键是自动增长
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
/**
* 向学生表中添加4条记录,主键是自动增长
*/
public class JDBCDemo2 {
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
//1.创建连接对象
try {
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db4","root","wsj199599");
//2.创建Statement 语句对象
stmt = conn.createStatement();
// 3) 执行 SQL 语句:executeUpdate(sql)
int count = 0;
// 4) 返回影响的行数
count += stmt.executeUpdate("insert into student values(null, '孙悟空', 1, '1993-03-24')");
count += stmt.executeUpdate("insert into student values(null, '白骨精', 0, '1995-03-24')");
count += stmt.executeUpdate("insert into student values(null, '猪八戒', 1, '1903-03-08')");
count += stmt.executeUpdate("insert into student values(null, '嫦娥', 0, '1993-03-11')");
System.out.println("插入了" + count + "条记录");
// 5) 释放资源
stmt.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
执行 DQL 操作
ResultSet 接口:
- 作用:封装数据库查询的结果集,对结果集进行遍历,取出每一条记录。
1.next()方法
用于判断下一行是否有数据
如果下一行有数据,就继续循环;
如果下一行没有数据了,就停止循环。
2.getString()方法
参数可以填数据表中的列名,那么得到的结果就是列名对应的具体值
参数也可以填数字,如果是1就是第一个列名也就是id,这样依次往下推
但是一般都是填列名,这样阅读性强,直接就知道获取的是什么数据。
如果填数字,要对数据表了如指掌,不然时常会搞不清楚数字具体对应的是哪一列。
import java.sql.*;
/**
* 查询所有的学生信息
*/
public class JDBCDemo31 {
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
{
try {
//1.创建连接对象
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db4", "root", "wsj199599");
//2.得到语句对象
stmt = conn.createStatement();
//3.执行SQL语句得到结果集 ResultSet 对象
rs = stmt.executeQuery("select * from student");
//4.循环遍历取出每一天记录
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
boolean gender = rs.getBoolean("gender");
Date birthday = rs.getDate("birthday");
//5.输出的控制台上
System.out.println("编号:" + id + ", 姓名:" + name + ", 性别:" + gender + ",生日:" + birthday);
}
//6.释放资源
rs.close();
stmt.close();
conn.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
}
数据库工具类JdbcUtils
- 什么时候自己创建工具类?
如果一个功能经常要用到,我们建议把这个功能做成一个工具类,可以在不同的地方重用。
这是创建工具类基本原则。
import java.io.FileReader;
import java.io.IOException;
import java.net.URL;
import java.sql.*;
import java.util.Properties;
/**
* JDBC工具类
*/
public class JDBCUtils {
private static String url;
private static String user;
private static String password;
private static String driver;
/**
* 文件的读取,只需要读取一次即可拿到这些值。使用静态代码块
*/
static {
//读取资源文件,获取值
try {
//1.创建Properties集合类
Properties pro = new Properties();
//获取src路径下的文件的方式--->ClassLoader 类加速器
ClassLoader classLoader = JDBCUtils.class.getClassLoader();
URL res = classLoader.getResource("jdbc.properties");
String path = res.getPath();
//System.out.println(path);
//2.加载文件
// pro.load(new FileReader("src/yewubiao.properties"));
pro.load(new FileReader(path));
//3.获取数据,赋值
url = pro.getProperty("ur1");
user = pro.getProperty("user");
password = pro.getProperty("password");
driver = pro.getProperty("driver");
//4.注册驱动
Class.forName(driver);
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
/**
* 获取连接
* @return 连接对象
*/
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(url, user, password);
}
/**
* 释放资源
* @param stmt
* @param conn
*/
public static void close(Statement stmt,Connection conn) {
if (stmt != null) {
try {
stmt.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if (conn != null) {
try {
stmt.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
/**
* 释放资源
* @param stmt
* @param conn
*/
public static void close(ResultSet rs,Statement stmt, Connection conn){
if (rs != null) {
try {
rs.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if (stmt != null) {
try {
stmt.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if (conn != null) {
try {
stmt.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
}
数据访问层 - DAO模式
持久化是将程序中的数据在瞬时状态下和持久状态间转换的机制。
持久化的主要操作:读取、查找、保存、修改、删除。
DAO(Data Access Object):数据存取对象,位于业务逻辑和持久化数据之间,能够实现对持久化数据的访问。
DAO在实体类与数据库之间起着转换器的作用,能够把实体类转换为数据库中的记录。
明天计划的事情:学习Junit,学习Spring
收获:对JDBC理解的更深了,知道了Dao大体是什么。
评论