前言:JDBC(Java Database Connectivity),中文翻译为:Java数据库连接,是Java和数据库之间的一个桥梁,是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了查询、更新数据库等方法。
简单来说JDBC的作用:与数据库建立连接,发送操作数据库的语句,然后处理结果。
说明:
如果已经准备好相应的jar包,可以从第二条开始看起。
本篇博文写的范围比较广,可以在目录中选择自己需要的方面去了解!
本人写了代码后,都测试了一遍,代码部分几乎没问题!
此篇博文本人肝了两天半,对于初学者来说,应该算是介绍得比较全面了!
一.导入相应版本的jar包
mysql-connector-java在Java应用程序通过JDBC访问mySQL数据库时需要该包支持,是一个驱动包,下载及导入过程:
1.百度搜索maven,如下图,点击第一个链接:
2.按照提示点击,通过测试
3.进入主页面之后,在搜索栏中输入mysql,选择第一个MySQL Connector
4.点进进入之后,会有很多版本,我们根据自己mysql数据库的版本,选择对应年份发布的mysql-connector-java
比如我的mysql版本是8.0.11,它是2018年4月份发布的,一般我们选择同年或之后发布的更高版本是不会出错的,我选择的是目前的最新 版本mysql-connector-java-8.0.21.jar,点击选择它
5.之后我们点击jar即可下载
6.下载好文件之后,我们在module中新建一个Directory,取名为lib
7.然后把刚下载好的jar包直接拖到lib里面去,根据提示点击ok,导入完成!
8.导入后我们看不了jar包中的内容,我们在lib上点击右键选择Add as Library… ,点击ok。
9.之后我们就可以看到jar包里面的内容了
以上就完成了驱动包的导入!
二.获取连接对象(原始方式和druid连接池方式)
1.原始的jdbc连接方式:
public class Task {
@Test
public void toTest() throws Exception {
//1.加载驱动(Driver这个类)反射机制,不懂反射想了解的可以进本人主页,java栏中查看相关博文
Class.forName("com.mysql.cj.jdbc.Driver");
//2.获取连接对象 ,第一个参数是数据库的url,前面基本一致后面ysw_blog是数据库名
Connection con = DriverManager.getConnection(
"jdbc:mysql://127.0.0.1:3306/ysw_blog",
"root",
"你的密码");
//输出连接对象的哈希地址
System.out.println(con);
}
}
测试结果截图:
2.druid连接池方式
这个步骤我们需要导入druid的jar包,jar包下载方式可以去maven主页下载,可以参考上面的步骤,下载好后也是直接把jar包拖入lib目录中
导入后lib目录下有这两个jar包
druid连接池方式,代码+注释如下:
@Test
public void toTest1() throws SQLException {
//1.创建druid的数据源
DruidDataSource ds = new DruidDataSource();
//2.给数据源配置传入参数
ds.setDriverClassName("com.mysql.cj.jdbc.Driver");
ds.setUrl("jdbc:mysql://127.0.0.1:3306/ysw_blog");
ds.setUsername("root");
ds.setPassword("你的密码");
//3.通过数据源可以获取连接对象
DruidPooledConnection con = ds.getConnection();
System.out.println(con);
}
测试结果截图:
ps:红色字体不是报错,正常的
三.查询修改操作
三.查询修改操作
1.使用原始的jdbc方式去对数据库进行增删改查
1.使用原始的jdbc方式去对数据库进行增删改查
I.代码部分(注释详细到每一步):
I.代码部分(注释详细到每一步):
import org.junit.Before;
import org.junit.Test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class Task1 {
//@SuppressWarnings("all")的作用:可以让编译器不再提醒有重复行的警告
// @SuppressWarnings("all")
//把连接对象变成类成员,这样每次进行单元测试的时候就避免了再次写连接数据库的代码部分
private Connection con;
/***********************************连接数据库******************************/
//@Before注解:在执行@Test注解之前先执行before注解
@Before
public void init() throws Exception {
//1.加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.获取连接对象
con = DriverManager.getConnection(
"jdbc:mysql://127.0.0.1:3306/ysw_blog",
"root",
"你的密码");
}
/**************************************增***********************************/
@Test
//使用原始的jdbc连接,向数据库增加数据
public void toTest0() throws Exception {
//1.创建sql语句模版
String sql="INSERT INTO type VALUES(null,?,?);";
//2.获取能够执行sql语句的对象
PreparedStatement perstmt = con.prepareStatement(sql);
//占位符为问好,即?
//3.给sql模板中的占位符赋值
perstmt.setString(1,"职业");
perstmt.setString(2,"选手");
//4.执行sql
perstmt.executeUpdate();
}
/**************************************删***********************************/
@Test
//使用原始的jdbc连接,删除数据库中的数据
public void toTest1() throws Exception {
//1.创建sql语句模版
String sql="DELETE FROM type WHERE tname = ?;";
//2.获取能够执行sql语句的对象
PreparedStatement perstmt = con.prepareStatement(sql);
//占位符为问好,即?
//3.给sql模板中的占位符赋值
perstmt.setString(1,"职业");
//4.执行sql
perstmt.executeUpdate();
}
/**************************************改***********************************/
//使用原始的jdbc连接,修改数据库中的数据
@Test
public void toTest2() throws Exception {
//1.创建sql语句模版
String sql="UPDATE type SET route = ? WHERE tname = ?;";
//2.获取能够执行sql语句的对象
PreparedStatement perstmt = con.prepareStatement(sql);
//占位符为问好,即?
//3.给sql模板中的占位符赋值
perstmt.setString(1,"jdbc更改了");
perstmt.setString(2,"新插入的");
//4.执行sql
perstmt.executeUpdate();
}
/**************************************查***********************************/
//使用原始的jdbc连接,查找数据库中的指定数据
@Test
public void toTest3() throws Exception {
//1.创建sql语句模版
String sql="SELECT * FROM type WHERE tid =? ;";
//2.获取能够执行sql语句的对象
PreparedStatement perstmt = con.prepareStatement(sql);
//占位符为问好,即?
//3.给sql模板中的占位符赋值
perstmt.setInt(1,2);
//4.执行sql,返回结果集rs
ResultSet rs = perstmt.executeQuery();
//5.如果rs中只有一行,只需判断是否有数据即可 ,如果rs有多行,可以使用循环去遍历每条数据
if(rs.next()){
//在rs.next()指向的这条查询结果中,通过对应的列序号取值
int tid = rs.getInt(1);
String tname = rs.getString(2);
String route = rs.getString(3);
//在rs.next()指向的这条查询结果中,通过对应的列名取值
//int did = rs.getInt("tid");
//String dname = rs.getString("tname");
//String location = rs.getString("route");
System.out.println(tid);
System.out.println(tname);
System.out.println(route);
}
}
@Test
//使用原始的jdbc连接,查找数据库中的数据所有数据
public void toTest4() throws Exception {
//1.创建sql语句模版
String sql="SELECT * FROM type;";
//2.获取能够执行sql语句的对象
PreparedStatement perstmt = con.prepareStatement(sql);
//3.执行sql,返回结果集rs
ResultSet rs = perstmt.executeQuery();
//4.如果rs中只有一行,只需判断是否有数据即可 ,如果rs有多行,可以使用循环去遍历每条数据
while (rs.next()){
//在rs.next()指向的这条查询结果中,通过对应的列名取值
int tid = rs.getInt("tid");
String tname = rs.getString("tname");
String route = rs.getString("route");
System.out.println(tid+"*****"+tname+"*****"+route);
}
}
}
上述代码各个测试部分运行后的截图:
数据库原始的数据:
II.增(对应上面的代码部分toTest0)
II.增(对应上面的代码部分toTest0)
程序运行后控制台截图:
程序运行后数据库对应的type表截图:
ps:因为之前我测试时插入过两条数据,所有最后一条数据插入默认id位9
III.删(对应上面的代码部分toTest1)
III.删(对应上面的代码部分toTest1)
程序运行后控制台截图:
程序运行后数据库对应的type表截图:
IV.改(对应上面的代码部分toTest2)
IV.改(对应上面的代码部分toTest2)
程序运行后控制台截图:
程序运行后数据库对应的type表截图:
V.查 (对应上面的代码部分toTest3和toTest4)
V.查 (对应上面的代码部分toTest3和toTest4)
a.查找数据库中的指定数据,输出到控制台:
a.查找数据库中的指定数据,输出到控制台:
b.查找数据库中的所有数据,输出到控制台:
b.查找数据库中的所有数据,输出到控制台:
2.使用druid连接池方式去对数据库进行增删改查
2.使用druid连接池方式去对数据库进行增删改查
下面只演示druid连接池方式对数据库进行查询操作,其他操作和上面的1.类似,可以参考上面的 1.使用原始的jdbc方式去对数据库进行增删改查.
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidPooledConnection;
import org.junit.Before;
import org.junit.Test;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class Task2 {
//把连接对象变成类成员,这样每次进行单元测试的时候就避免了再次写连接数据库的代码部分
private DruidPooledConnection con;
//@Before注解:在执行@Test注解之前先执行before注解
@Before
public void init() throws SQLException {
//1.创建druid的数据源
DruidDataSource ds = new DruidDataSource();
//2.给数据源配置连接参数
ds.setDriverClassName("com.mysql.cj.jdbc.Driver");
ds.setUrl("jdbc:mysql://127.0.0.1:3306/ysw_blog");
ds.setUsername("root");
ds.setPassword("你的密码");
//3.通过数据源可以获取连接对象
con = ds.getConnection();
}
//查询hero表所有数据
@Test
public void toTest() throws SQLException {
//1.创建sql语句模版
String sql="SELECT * FROM hero;";
//2.获取能够执行sql语句的对象
PreparedStatement perstmt = con.prepareStatement(sql);
//3.执行sql,返回结果集rs
ResultSet rs = perstmt.executeQuery();
//4.如果rs中只有一行,只需判断是否有数据即可 ,如果rs有多行,可以使用循环去遍历每条数据
while (rs.next()){
//在rs.next()指向的这条查询结果中,通过对应的列名取值
int id = rs.getInt("id");
String name = rs.getString("name");
String age = rs.getString("age");
String sex = rs.getString("sex");
String price = rs.getString("price");
String type_id = rs.getString("type_id");
System.out.println(id+"*****"+name+"*****"+age+"*****"+sex+"*****"+price+"*****"+type_id);
}
}
}
hero表数据:
上述代码测试,控制台输出:
四.将查询结果集rs中的数据封装到list集合中
四.将查询结果集rs中的数据封装到list集合中
Hero类:Hero类的一个对象对应查询集rs中的一行数据
比如我的rs集中有15行数据,可以创建15个Hero对象,把查询到的数据封装到对象中。
1.用于测试的主类:
1.用于测试的主类:
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidPooledConnection;
import org.junit.Before;
import org.junit.Test;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
public class Task2 {
//把连接对象变成类成员,这样每次进行单元测试的时候就避免了再次写连接数据库的代码部分
private DruidPooledConnection con;
//@Before注解:在执行@Test注解之前先执行before注解
@Before
public void init() throws SQLException {
//1.创建druid的数据源
DruidDataSource ds = new DruidDataSource();
//2.给数据源配置连接参数
ds.setDriverClassName("com.mysql.cj.jdbc.Driver");
ds.setUrl("jdbc:mysql://127.0.0.1:3306/ysw_blog");
ds.setUsername("root");
ds.setPassword("你的密码");
//3.通过数据源可以获取连接对象
con = ds.getConnection();
}
//查询hero表数据,并封装到List集合中
@Test
public void test2() throws SQLException {
//1.创建sql语句模版
String sql="SELECT * FROM hero;";
//2.获取能够执行sql语句的对象
PreparedStatement perstmt = con.prepareStatement(sql);
//3.执行sql,返回结果集rs
ResultSet rs = perstmt.executeQuery();
ArrayList<Hero> list = new ArrayList<>();
//4.如果rs中只有一行,只需判断是否有数据即可 ,如果rs有多行,可以使用循环去遍历每条数据
while (rs.next()){
//在rs.next()指向的这条查询结果中,通过对应的列名取值
int id = rs.getInt("id");
String name = rs.getString("name");
int age = rs.getInt("age");
String sex = rs.getString("sex");
int price = rs.getInt("price");
int type_id = rs.getInt("type_id");
Hero hero = new Hero(id,name,age,sex,price,type_id);
//hero对象装进list中
list.add(hero);
}
//输出
for(int i = 0 ; i < list.size() ; i++) {
System.out.println(list.get(i));
}
}
}
2.上述代码用到的Hero类:
2.上述代码用到的Hero类:
public class Hero {
private int id; private String name; private int age; private String sex; private int price; private int type_id; //get set方法 public int getId() {
return id; } public void setId(int id) {
this.id = id; } public String getName() {
return name; } public void setName(String name) {
this.name = name; } public int getAge() {
return age; } public void setAge(int age) {
this.age = age; } public String getSex() {
return sex; } public void setSex(String sex) {
this.sex = sex; } public int getPrice() {
return price; } public void setPrice(int price) {
this.price = price; } public int getType_id() {
return type_id; } public void setType_id(int type_id) {
this.type_id = type_id; } //构造方法 public Hero(int id, String name, int age, String sex, int price, int type_id) {
this.id = id; this.name = name; this.age = age; this.sex = sex; this.price = price; this.type_id = type_id; } public Hero() {
} //重新toString,方便输出 @Override public String toString() {
return "Hero{" + "id=" + id + ", name='" + name + '\'' + ", age=" + age + ", sex='" + sex + '\'' + ", price=" + price + ", type_id=" + type_id + '}'; } }
3.运行结果截图:
3.运行结果截图:
五.DbUtils操作
五.DbUtils操作
1.什么是DbUtils
1.什么是DbUtils
DbUtils是Apache组织提供的一个对JDBC进行简单封装的开源工具类库,使用它能够简化JDBC应用程序的开发。
2.导入DbUtils的jar包
2.导入DbUtils的jar包
用这个的时候,我们需要导入DbUtils的jar包,同样也是在maven上去下载,下载好jar包后直接拖入lib中,具体详细细节参考文章开始的一.,即一.导入相应版本的jar包。
3.DbUtils用到的类和方法:
3.DbUtils用到的类和方法:
QueryRunner类:它的主要作用是用来操作执行sql语句
其中有query方法:主要作用是进行查询操作
也有update方法:主页作用是进行增 删 改 操作
ResultSetHandler接口:它的作用主要针对查询到的结果进行操作
4.具体操作(代码+注释):
4.具体操作(代码+注释):
我们在这个过程中需要用到druid连接池去连接数据库
I.query方法使用(代码+注释+截图):
I.query方法使用(代码+注释+截图):
import com.alibaba.druid.pool.DruidDataSource; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.BeanListHandler; import org.junit.Test; import java.sql.SQLException; import java.util.List; public class Task3 {
@Test public void test1() throws Exception {
//1.创建druid的数据源 DruidDataSource ds = new DruidDataSource(); //2.给数据源配置连接参数 ds.setDriverClassName("com.mysql.cj.jdbc.Driver"); ds.setUrl("jdbc:mysql://127.0.0.1:3306/ysw_blog"); ds.setUsername("root"); ds.setPassword("你的密码"); //3.创建qr对象,需要传入数据源ds QueryRunner qr = new QueryRunner(ds); //4.查询操作,把查询到的结果级封装到了Hero的的对象中, // 比如我的rs集中有15行数据,需要创建15个Hero对象,把查询到的数据封装到对象中, //再把对象装入list集合中. List<Hero> list = qr.query("select * from hero ", new BeanListHandler<Hero>(Hero.class)); //输出 for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i)); } } }
运行结果截图:
II.update方法使用(代码+注释+截图):
II.update方法使用(代码+注释+截图):
@Test public void test2() throws Exception {
//1.创建druid的数据源 DruidDataSource ds = new DruidDataSource(); //2.给数据源配置连接参数 ds.setDriverClassName("com.mysql.cj.jdbc.Driver"); ds.setUrl("jdbc:mysql://127.0.0.1:3306/ysw_blog"); ds.setUsername("root"); ds.setPassword("你的密码"); //3.创建qr对象,需要传入数据源ds QueryRunner qr = new QueryRunner(ds); //增删改,可以直接传入执行sql语句 //增 qr.update("INSERT INTO type VALUES (NULL,?,?);","ysw","blog"); //删 qr.update("DELETE FROM type WHERE tid = ?;",6); //改 qr.update("UPDATE type SET tname = 'YuShiwen' WHERE tname = ?;","ysw"); }
增删改运行截图:
原type表截图:
执行增加操作
对应的控制台输出和type表:
执行删除操作
对应的控制台输出和type表:
执行修改操作
对应的控制台输出和type表: