JDBC编程即JAVA数据库连接,数据库连接完成后,可在eclipse里面执行相关数据库的查询,删除,增添等操作
为了JDBC程序可以跨平台,我们首先要加载相应的驱动文件
以连接MySQL数据库为例
首先在eclipse中创建一个libs包,将驱动文件复制进去,点击OK
或者点击Configure Build Path,在ClassPath里面添加驱动文件
这样我们就可以看到驱动文件已经添加成功了
驱动文件导入成功以后即可以加载数据库驱动
一般使用Class类的forName()静态方法实现
// com.mysql.cj.jdbc.Driver
Class.forName("com.mysql.cj.jdbc.Driver");
为了防止驱动名记不住,我们可以先在外面跟着自动提示打一遍再复制进来
获取连接时,需要传入三个参数分别是
- 连接数据库的URL(jdbc:mysql://localhost:3306(默认端口)/movies_db(数据库名称))
- 登录数据库的账号USER
- 登录数据库的密码PASSWORD
为了便于管理,进行封装
// com.mysql.cj.jdbc.Driver
private static final String DRIVERNAME="com.mysql.cj.jdbc.Driver";
private static final String URL="jdbc:mysql://localhost:3306/movies_db";
private static final String USER="root";
private static final String PASSWORD="123456";
static{
Class.forName(DRIVERNAME);
}
第17行语句会报错
这里直接根据提示抛出异常
static{
try {
Class.forName(DRIVERNAME);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
随后就是使用DriverManager类获取数据库连接
同样,在使用DriverManager类里面的方法时也会报错,抛出异常
public static Connection getConnection() throws Exception{
try {
return DriverManager.getConnection(URL, USER, PASSWORD);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
throw new Exception();
}
}
然后就是释放数据库资源
public static void close(ResultSet rs,Statement stat,Connection conn) throws Exception{
try{
if (rs != null) {
rs.close();
}
if (stat != null) {
stat.cancel();
}
if (conn != null) {
conn.close();
}
}catch(Exception e){
e.printStackTrace();
throw new Exception();
}
}
数据库是否连接成功可以在main方法里面进行测试
public static void main(String[] args) {
try {
Connection conn = getConnection();
System.out.println("连接成功");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
同样,这里也会报错,但是在抛出异常时不能 add throw,这样会改变main方法的固定写法,所以选择try{ }catch{ }
运行测试结果如下
下面就可以定义方法来进行数据库的查询,删除,增添等操作了
一般分为以下几个步骤
- 定义正确的SQL语句
可以在数据库新建查询,在查询里面写语句,查询不报错以后将语句复制进去,用占位符替换值 - 获取数据库连接
- 获取PreparedStatement对象预处理SQL语句
- 执行SQL语句
- 关闭相关资源
新创建一个工具类BASEDAO
定义查询方法:定义一个返回值为二维数组的方法,然后进行遍历,就能把数据库的表的查询数据传进来
public static Object[][] select() throws Exception{
String sql = "SELECT * FROM tb_book";
Connection conn = DbConnection.getConnection();
PreparedStatement stat = conn.prepareStatement(sql,ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
ResultSet rs = stat.executeQuery();
rs.last();
int row = rs.getRow();
int colCount = rs.getMetaData().getColumnCount();
Object[][] data = new Object[row][colCount];
rs.beforeFirst();
while (rs.next()) {
for (int i = 0; i < colCount; i++) {
data[rs.getRow()-1][i] = rs.getObject(i+1);
}
}
DbConnection.close(null, stat, conn);
return data;
}
由于后面在窗体中要滚动条来浏览记录,而结果集的一个特点是只能从上往下浏览,所以先浏览到最后一条数据
rs.last();
然后获取它的行数与列
int row = rs.getRow();
int colCount = rs.getMetaData().getColumnCount();
将行数与列传给二维数组
Object[][] data = new Object[row][colCount];
再返回第一条记录,从第一条开始给他进行遍历,最后再返回数据
while (rs.next()) {
for (int i = 0; i < colCount; i++) {
data[rs.getRow()-1][i] = rs.getObject(i+1);
}
}
同样,也要在main方法里面测试一下查询方法是否正确
System.out.println(select());
定义增添方法:定义一个返回值类型为boolean的方法,添加成功返回true,不成功返回false
public static boolean add(Movies movies) throws Exception {
String sql = "INSERT INTO tb_movies (id,name,duration,area,moviedate,price)"+"VALUES(null,?,?,?,?,?);";
// 获取连接
Connection conn = DbConnection.getConnection();
// 从连接中获取Statement对象
PreparedStatement stat = conn.prepareStatement(sql);
// 用Statement对象执行SQL语句
stat.setObject(1, movies.getName());
stat.setObject(2, movies.getDuration());
stat.setObject(3, movies.getArea());
stat.setObject(4, movies.getMoviedate());
stat.setObject(5, movies.getPrice());
// 处理结果集
int result = stat.executeUpdate();
// 关闭资源
DbConnection.close(null, stat, conn);
return result>0?true:false;
}
写SQL语句直接复制过来有“+”时,要注意被“+“隔开的中间是否有空格,有括号时会默认是隔开的,但是有些语句没有注意空格就会默认语句连在一起,会报错
INSERT INTO tb_movies"+"VALUES(null,?,?,?,?,?);
这个就相当于
是无法添加成功的
同样也需要在main方法里面测试一下
我们首先还是要创建一个包含所有字段的实体类
例如我这里是创建的一个电影的数据库
public class Movies {
private static String id;
private static String name;
private static String duration;
private static String area;
private static String moviedate;
private static double price;
public static String getId() {
return id;
}
public static void setId(String id) {
Movies.id = id;
}
public static String getName() {
return name;
}
public static void setName(String name) {
Movies.name = name;
}
public static String getDuration() {
return duration;
}
public static void setDuration(String price2) {
Movies.duration = price2;
}
public static String getArea() {
return area;
}
public static void setArea(String area) {
Movies.area = area;
}
public static String getMoviedate() {
return moviedate;
}
public static void setMoviedate(String moviedate) {
Movies.moviedate = moviedate;
}
public static double getPrice() {
return price;
}
public static void setPrice(double price) {
Movies.price = price;
}
}
这里可以声明好变量以后
这样可以自动生成
然后在main方法里面设置每个字段的值
Movies movies = new Movies();
movies.setId("NUll");
movies.setName("复仇者联盟");
movies.setDuration("123");
movies.setArea("好莱坞");
movies.setMoviedate("2021-05-27");
movies.setPrice(38);
System.out.println(add(movies));
运行结果如下
再刷新一下数据库里面的表
这里已经添加好了
定义一个删除方法:定义一个返回值类型为boolean的方法,添加成功返回true,不成功返回false
public static boolean delete(Movies movies) throws Exception {
String sql = "DELETE FROM tb_movies WHERE name=?";
// 获取连接
Connection conn = DbConnection.getConnection();
// 从连接中获取Statement对象
PreparedStatement stat = conn.prepareStatement(sql);
// 用Statement对象执行SQL语句
stat.setObject(1, movies.getName());
// 处理结果集
int result = stat.executeUpdate();
// 关闭资源
DbConnection.close(null, stat, conn);
return result>0?true:false;
}
同样,测试一下方法是否定义正确
Movies movies = new Movies();
movies.setName("复仇者联盟");
System.out.println(delete(movies));
运行结果如下
刷新数据库表
删除成功
总结:
- JDBC编程要先导入驱动文件,加载驱动,获取数据库连接,要注意给连接数据库的类DbConnection进行封装(便于管理,实现代码的复用)
- 报错可以抛出异常,但在main方法时不能throw,这样会改变main方法的固定写法
- 定义方法时要注意SQL语句的正确写法。**特别是中间是否空格,这里真的很容易踩雷。**查询语句要注意结果集只能从上往下浏览的特点,浏览到最后一条记录了再去获取它的行数列数
- 方法定义完成后要在main方法里面测试一下方法是否正确定义,方法不报错后去数据库刷新一下表的数据
- 还要注意添加时的字段顺序最好与数据库的表顺序相同,后面在窗体里面添加可以会发现添加不上去的情况,这也是跟字段顺序有关系的
- 要创建实体类