文章目录
- JDBC
- 前言
- 1 JDBC连接数据库
- 1.1 加载驱动
- 1.2 连接数据库
- 2 Maven介绍
- 2.1 什么是Maven?
- 2.2 使用Maven
- 3 使用JDBC对数据库进行增删改查操作
- 3.1 “增删改”具体操作步骤:
- 3.2 PrepardStatement和Statement的区别
- 3.3 使用?占位符处理SQL语句
- 3.4 "查"操作具体步骤
- 4 JDBC常见错误
- 5 封装DBUtil简化sql操作
JDBC
前言
JDBC – java连接数据库技术 即用
Java操作数据库
通过JDBC对数据库中的数据进行增,删,改,查
JDBC所使用的类和接口都在java.sql包中存放,其中包含下面三个核心对象
(1)Connection:连接对象,表示Java程序与数据库的一个连接
(2)PreparedStatement:预处理对象,预处理对象主义用于:“发送SQL语句”,“执行SQL语句”,“将SQL语句的执行结果回传到程序中”
(3) Resultset:结果集对象,表示执行查询SQL语句后将查询结果封装到Result对象中(查询结果对象)
以上三个对象为JDBC操作的核心对象,但java中只提供了这三个对象的接口,没有实现类,而具体的实现类由数据库厂商提供,不同的数据库厂商会提供不同的实现的
1 JDBC连接数据库
1.1 加载驱动
- 数据库驱动:由数据库厂商提供,其中包含数据库操作具体实现类,不同数据库有不同的驱动,同一数据库的不同版本,也有不同驱动(驱动免费)
MySQL5.X版本驱动字符串
"com.mysql.jdbc.Driver"
MySQL8.X版本驱动字符串
"com.mysql.cj.jdbc.Driver"
Class.forName("com.mysql.cj.jdbc.Driver");//加载驱动
1.2 连接数据库
- 使用DriverManager和连接字符串以及数据库账户名和密码连接
DriverManager:驱动管理器对象,该驱动管理器由Java提供
MySQL5.X版本
"jdbc:mysql://localhost:3306/test"
即可MySQL8.X版本需要加入指定时区 serverTimezone :
DriverManager.getConnection("jdbc:mysql://localhost:3306/test?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false","root","*****")
//jdbc:mysql://数据库服务器地址:3306/数据库名?参数列表
serverTimezone=Asia/Shanghai:设置服务器时区为上海---- 在中国,可以选择Asia/Shanghai或者Asia/Hongkong 设置UTC( 指定时区时间为世界统一时间 ) 会比中国时间早8个小时 。
useUnicode=true:设置使用unicode字符集
characterEncoding=utf-8:设置编码集(避免中文乱码)
useSSL=false:不进行安全检测
Connection dbConn=DriverManager.getConnection("jdbc:mysql://localhost:3306/test?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false","root","*****");
if (dbConn!=null){
System.out.println("连接成功!");
}
else {
System.out.println("连接失败");
}
2 Maven介绍
2.1 什么是Maven?
Maven软件项目管理工具(项目构建工具),通过Maven可以快速构建、打包、发布一个项目
Maven功能包含以下几个:
(1)构建项目
(2)编译打包项目
(3)部署,发布项目
(4)对象项目依赖进行管理
- Maven项目中依赖库进行管理
我们在开发中经常用到各种插件,组件,框架等组件,在使用时每个组件都需要在中加入一个或多个依赖包(jar)
由于依赖包较多,且更新较快,如果开发者都使用手动方式管理这些包比较麻烦,而且容易出错
Maven为开发者提供依赖包的自动管理,当我们在项目中添加一个依赖包时,Maven自动将相关依赖包添加到项目
- Maven仓库
Maven仓库包含了所有java开发所需要的依赖包,Maven将这些依赖包进行管理,使用这些依赖包时只需在Maven中拉取即可
Maven中央库:Maven仓库在国外存放,该仓库称为Maven称为Maven的中央库(中心库)。
Maven镜像库:阿里巴巴在国内做了一个中央库的备份库,这个备份我们称为镜像库,镜像库每10分钟与中央库同步一次
Maven本地库:开发者将自己常用的库下载到本机,在使用时如果本地库存在在本地库获取,如果本地库不存在从镜像库拉取并存储
Maven私服:公司或组织为了本组织内部使用各种库,会将常用的库备份到私服,来供局域网用户使用。
2.2 使用Maven
- 从Maven官网中下载Maven插件,并安装到自己的电脑上(与开发工具绑定),或使用开发工具自带的Maven插件(推荐)
- 如果使用的不是IDEA开发工具自带的Maven插件,则需要在IDEA中配置“文件->设置->构建,执行,部署->构建工具”在其中 设置“Maven”
- 在本地创建一个“Maven仓库(本地库)”,新建文件夹,并在新建文件夹内部创建一个名字为“respository”的文件夹,并添加“settings.xml”文件(Maven配置文件)
- 在settings.xml中进行配置,在配置文件中配置:(1)配置本地资源库(2)配置镜像库
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
https://maven.apache.org/xsd/settings-1.0.0.xsd">
<!--配置本地资源库-->
<localRepository>D:/maven-lib/repository</localRepository>
<interactiveMode/>
<offline/>
<pluginGroups/>
<servers/>
<!--配置Meven镜像-->
<mirrors>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
<proxies/>
<profiles/>
<activeProfiles/>
</settings>
- 在IDEA的构建工具中,使用自己的配置文件和本地资源库
- 配置结束,新建Maven项目
3 使用JDBC对数据库进行增删改查操作
3.1 “增删改”具体操作步骤:
- 加载驱动
Class.forName("com.mysql.cj.jdbc.Driver")
- 连接数据库
Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/test?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false","root","*****")
- 写sql语句
String sql=("/*增删改语句*/")
- 创建预处理对象,使用连接对象和SQL语句创建预处理对象
PrepardStatement ps=new PrepardStatment(sql);
- 发送并执行sql语句,并返回执行结果,返回数据库中数据受影响行数
int num=ps.executeUpDate(); //检查是否修改成功 if (i>0){ System.out.println("修改成功") } else{ System.out.println("修改失败")
- 释放资源
ps.close(); conn.close();
3.2 PrepardStatement和Statement的区别
始终使用PrepardStatement
- 处理对象:Statement
- 预处理对象:PrepardStatement
- PrepareStatement实例包含已经编译的SQL语句,会将SQL语句进行预编译,所以执行速度
比Statement高。
prepareStatment事先对语句进行预处理,效率会高很多。
Statment没有进行预处理,所以每次都要载入语句,所以效率比较低- PrepareStatement对象中的SQL语句可以包含一个或者多个参数,在SQL语句创建时
可以不指定参数,可以为参数位置保留一个?作为占位符,每个问号的值必须在该语句
执行前通过适当的setInt()或者setString()方法来提供- 用PrepareStatement可以防止sql注入,而Statement不行所以我们尽量使用PrepareStatement。
个 or 语句恒等于真,所以能够执行删除。delect for tbl_name where id=0 or 1=1 ===>delect for tbl_name where id=?
3.3 使用?占位符处理SQL语句
使用
?
占位符防止SQL注入
Scanner scanner=new Scanner(System.in);
System.out.println("请按照部门名称删除部门:");
String DEPTNO=scanner.next();
String sql="DELETE FROM dept WHERE DEPTNO=?";
PreparedStatement ps=conn.prepareStatement(sql);
ps.setString(1,DEPTNO);
/*给?赋值
方法:setXXX(参数1, 参数2)
参数1:?的位置编号,从1开始
参数2:?的值*/
int num= ps.executeUpdate();
if (num>0){
System.out.println("修改成功");
}else {
System.out.println("修改失败");
}
ps.close();
conn.close();
3.4 "查"操作具体步骤
- 加载驱动
Class.forName("com.mysql.cj.jdbc.Driver")
- 连接数据库
Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/test?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false","root","*****")
- 写sql语句
String sql=("/*查语句*/")
- 创建预处理对象,使用连接对象和SQL语句创建预处理对象
PrepardStatement ps=new PrepardStatment(sql);
- 发送并执行sql语句,并返回执行结果,返回ResultSet结果集
ResultSet resultSet=ps.executeQuery();//返回结果集 //处理结果集 while (resultSet.next()){ //根据列编号获取列的数据 int DEPTNO=resultSet.getInt(1); String DNAME=resultSet.getString(2); String LOC=resultSet.getString(3); //根据列名获取列的数据 int DEPTNO=resultSet.getInt("DEPTNO"); String DNAME=resultSet.getString("DNAME"); String LOC=resultSet.getString("LOC"); System.out.println(DEPTNO+" "+DNAME+" "+LOC); }
6.释放资源
ps.close(); conn.close();
4 JDBC常见错误
未知数据库错误
Unknown database '数据库名'
数据库中表不存在
Table '表名' doesn't exist
语法错误
You have an error in your SQL syntax;
参数的值不匹配
No value specified for parameter 2
数据库列与值不匹配
colunn count doesn't match value count at row 1
参数索引超出范围(0 < 1)
Parameter index out of range (0 < 1 )
5 封装DBUtil简化sql操作
public class DBUtil(){
protected Connection conn=null;
protected PreparedStatement ps=null;
protected ResultSet rs=null;
//封装驱动
public Connection getConn() throws Exception{
Class.forName("com.mysql.cj.jdbc.Driver");
conn=DriverManager.getConnection("jdbc://mysql//localhost:3306/数据库名","账号","密码")
return conn;
}
//封装释放资源
public void closeAll(){
try{
if(rs!=null){
rs.close();
}
if(ps!=null){
ps.close();
}
if(conn!=null){
conn.close();
}
}catch(Exception e){
e.getMessage
}finally{
rs=null;
ps=null;
conn=null;
}
}
//封装增删改操作
public int executeUpdate(String sql,Object... element){
try{
//连接数据库
getConn();
//创建预处理对象
ps=conn.prepareStatement(sql);
//设置?占位符
//判断是否有问号占位符
if(element!=null&&element.length()!=0){
for(int i=0;i<element.length();i++){
ps.setObject(i+1,element[i]);
}
}
//执行sql语句,并返回受影响行数
return ps.executeUpdate();
}catch(Exception e){
e.getMessage();
}
return 0;
}
}
- 学习来自于西安加中实训