Java小记-JDBC(超级无敌认真好用,万字收藏篇!!!!)

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 加载驱动

  1. 数据库驱动:由数据库厂商提供,其中包含数据库操作具体实现类,不同数据库有不同的驱动,同一数据库的不同版本,也有不同驱动(驱动免费)

    MySQL5.X版本驱动字符串"com.mysql.jdbc.Driver"

    MySQL8.X版本驱动字符串"com.mysql.cj.jdbc.Driver"

    Class.forName("com.mysql.cj.jdbc.Driver");//加载驱动
    

1.2 连接数据库

  1. 使用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

  1. 从Maven官网中下载Maven插件,并安装到自己的电脑上(与开发工具绑定),或使用开发工具自带的Maven插件(推荐)

  2. 如果使用的不是IDEA开发工具自带的Maven插件,则需要在IDEA中配置“文件->设置->构建,执行,部署->构建工具”在其中 设置“Maven”

  3. 在本地创建一个“Maven仓库(本地库)”,新建文件夹,并在新建文件夹内部创建一个名字为“respository”的文件夹,并添加“settings.xml”文件(Maven配置文件)

  4. 在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>
  1. 在IDEA的构建工具中,使用自己的配置文件和本地资源库
  2. 配置结束,新建Maven项目

3 使用JDBC对数据库进行增删改查操作

3.1 “增删改”具体操作步骤:

  1. 加载驱动
Class.forName("com.mysql.cj.jdbc.Driver")
  1. 连接数据库
Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/test?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false","root","*****")
  1. 写sql语句
String sql=("/*增删改语句*/")
  1. 创建预处理对象,使用连接对象和SQL语句创建预处理对象
PrepardStatement ps=new PrepardStatment(sql);
  1. 发送并执行sql语句,并返回执行结果,返回数据库中数据受影响行数
int num=ps.executeUpDate();
//检查是否修改成功
if (i>0){
    System.out.println("修改成功")
}
else{
    System.out.println("修改失败")
  1. 释放资源
ps.close();
conn.close();

3.2 PrepardStatement和Statement的区别

始终使用PrepardStatement

  • 处理对象:Statement

  • 预处理对象:PrepardStatement

    1. PrepareStatement实例包含已经编译的SQL语句,会将SQL语句进行预编译,所以执行速度
      比Statement高。
      ​ prepareStatment事先对语句进行预处理,效率会高很多。
      ​ Statment没有进行预处理,所以每次都要载入语句,所以效率比较低

    2. PrepareStatement对象中的SQL语句可以包含一个或者多个参数,在SQL语句创建时
      可以不指定参数,可以为参数位置保留一个?作为占位符,每个问号的值必须在该语句
      执行前通过适当的setInt()或者setString()方法来提供

    3. 用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 "查"操作具体步骤

  1. 加载驱动
Class.forName("com.mysql.cj.jdbc.Driver")
  1. 连接数据库
Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/test?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false","root","*****")
  1. 写sql语句
String sql=("/*查语句*/")
  1. 创建预处理对象,使用连接对象和SQL语句创建预处理对象
PrepardStatement ps=new PrepardStatment(sql);
  1. 发送并执行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=nullprotected 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;
}
}

  • 学习来自于西安加中实训
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@活着笑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值