首页 > 其他分享 >day04 --> (JDBC基本概念、快速入门、对JDBC中各个接口和类详解)

day04 --> (JDBC基本概念、快速入门、对JDBC中各个接口和类详解)

时间:2022-09-28 17:47:17浏览次数:55  
标签:JDBC java String -- sql day04 jdbc mysql

一、JDBC:

1、概念:Java DataBase Connectivity  --> Java数据库连接,Java语言操作数据库

本质:官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包,我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类

Person 接口 ,Worker 类        Person person = new Worker(); --> 父类引用指向子类对象,如果Person中有一个ear方法,则 person.eat() 会调用Worker里边真正的实现类的方法

 2、快速入门:

步骤:

1.导入驱动jar包 :mysql-connector-java-5.1.37-bin.jar

(1)复制 mysql-connector-java-5.1.37-bin.jar 到项目的libs目录下

(2)右键 --> Add As Library 【真正加入jar包到项目中】

2.注册驱动

3.获取数据库的连接对象 Connection

4.定义sql语句

5.获取执行sql语句的对象 Statement

6.执行sql,接收返回结果

7.处理结果

8.释放资源

 代码实现:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

//JDBC快速入门
public class JdbcDemo1 {
    public static void main(String[] args) throws Exception {
        //1、导入驱动jar包
        //2、注册驱动
        Class.forName("com.mysql.jdbc.Driver");
        //3、获取数据库连接对象
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db3", "root", "root");
        //4.定义sql
        String sql = "update account set balance = 500 where id = 1";
        //5、获取执行sql的对象
        Statement stmt = conn.createStatement();
        //6、执行sql
         int count = stmt.executeUpdate(sql);
        //7、处理结果
        System.out.println(count);
        //8、释放资源
        stmt.close();
        conn.close();
    }
}

 

 3、详解各个对象:

1.DriverManager : 驱动管理对象

功能:

1.注册驱动 【告诉程序该使用哪个数据库驱动jar包】

  注册与给定的驱动程序:

写代码使用:Class.forName("com.mysql.jdbc.Driver");

com --> mysql --> jdbc --> Driver.java

 通过查看源码可以发现:在com.mysql.jdbc.Driver类中存在静态代码块

小细节:mysql-connection-java 5 版本之后的驱动jar包中可以不写注册驱动【META-INF --> services --> java.sql.Driver已注册驱动】

2.获取数据库连接

参数:

url:指定连接的路径(IP、端口、数据库的名称)

语法:jdbc:mysql://ip地址(域名):端口号/数据库名称

例子:jdbc:mysql://localhost:3306/db3

细节:如果连接的是本机的一个mysql服务器,并且mysql服务默认端口是3306,则url可以简写为:jdbc:mysql:///数据库名称

2.Connection : 数据库连接对象

1.功能:

1.获取执行sql对象

Statement creatStatement()

PreparedStatement preparestatement(String sql)

2.管理事务:

开启事务:

 调用该方法设置参数为false,即开启事务

提交事务:

回滚事务:

3.Statement : 执行sql的对象

1.执行sql

1、【了解】:boolean execute(String sql) : 可以执行任意的sql

2、int executeUpdate(String sql) : 执行DML(insert、update、delete),DDL(对表和库进行操作,不常用,库和表多已提前建好)

返回值:影响的行数;作用:我们可以通过影响的行数来判断DML语句是否执行成功【大于0成功,反之失败】

3、

执行DQL(select)语句,返回的是ResulSet结果集对象

2.练习:

1、account表 添加一条记录

2、account表 修改一条记录

3、account表 删除一条记录

4.ResultSet : 结果集对象

游标:相当于Java中数组的索引,默认指向表中第一行的第一列

boolean next() : 游标向下移动一行,判断当前行是否是最后一行的末尾(是否有数据),如果是返回false,反之返回true。

getXxx(参数) : 获取数据【可用于后期封装数据】

Xxx : 代表数据类型,如:int getInt(), String getString

参数:

1.int : 代表列的编号,从1开始, 如:getString(1),获取第一列的数据

2.String:代表列的名称,如 : getDouble("balance")

注意:

1.游标向下移动一行

2.判断是否有数据

3.获取数据

*练习:查询emp表的数据将其封装为 对象,然后装载集合,返回。

分析:

1.定义Emp类

2.定义一个方法 : public List<Emp> findAll(){ }

3.实现方法:select * from emp;

抽取JDBC工具类:JDBCUtils

目的:简化书写

分析:

1、注册驱动

2、抽取一个方法获取去连接对象

不想传递参数(麻烦),还得保证工具类的通用性

解决方法:配置文件

jdbc.properties

url = 

user = 

password = 

3、抽取一个方法释放资源

代码实现:

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、创建Properti对象
            Properties pro = new Properties();

            //2、加载文件
            //pro.load(new FileReader("src/jdbc.properties")); //FileNotFoundException
            //pro.load(new FileReader("src/jdbc.properties")); //绝对路径
            //获取src路径下的文件的方式 --> ClassLoader(类加载器,可以加载字节码进内存,还可以获取src下的资源文件路径)
            ClassLoader classLoader = JDBCUtils.class.getClassLoader();
            URL resource = classLoader.getResource("jdbc.properties"); //统一资源定位符(定位文件绝对路径)
            String path =resource.getPath();
            pro.load(new FileReader(path));
            System.out.println(path); //打印的就是该文件的绝对路径

            //3、获取文件中的值
            url = pro.getProperty("url");
            user = pro.getProperty("user");
            password = pro.getProperty("password");
            driver = pro.getProperty("driver");

            //4、注册驱动
            try {
                Class.forName(driver);
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 连接对象
     * @return
     */
    public static Connection getConnection() throws SQLException {
            return DriverManager.getConnection(url,user,password);
    }

    public static void close(Statement stmt,Connection conn){
        if (stmt != null){
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if (conn != null){
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    public static void close(ResultSet rs, Statement stmt, Connection conn){

        if (rs != null){
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if (stmt != null){
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if (conn != null){
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

}

 

练习:

需求:通过键盘录入用户名和密码,判断用户是否登录成功

实现步骤:

1、创建数据库表

sql准备:

CREATE TABLE USER(
        id INT PRIMARY KEY auto_increment,
        username varchar(32),
        password varchar(32)
);

SELECT * from USER;

INSERT INTO USER VALUES(null,'zhangsan','123'),(null,'lisi','234');

5.PrepareStatement : 执行sql的对象

1.SQL注入问题:在拼接sql的时候,有一些sql的特殊关键字与字符串的拼接,会造成安全性问题

1.例如:用户名随便输入,输入密码:a ' or 'a' = 'a

2.sql : select * from user where username = '输入的用户名' and password = 'a' or 'a' = 'a'   -->后边恒为真

2.解决sql注入问题:使用preparedStatement对象来解决

3.预编译的SQL : 参数使用 ? 作为占位符

4.步骤:

1.导入驱动jar包 :mysql-connector-java-5.1.37-bin.jar

2.注册驱动

3.获取数据库的连接对象 Connection

4.定义sql语句

注意:sql的参数使用 ? 作为占位符,例如:select * from user where username = ? and password = ?

5.获取执行sql语句的对象 PreparedStatement

Connection.prepareStatement(String sql)

给 ?赋值:

方法:setXxx(参数1,参数2)

参数1 : ?的位置,从1开始

参数2 :?的值

6.执行sql,接收返回结果,不需要传递sql语句了(上一步传递过了)

7.处理结果

8.释放资源

 5.注意:后期都会使用PreparedStatement来完成增删改查的所有操作,原因:

1.可以防止SQL注入

2.效率更高

JDBC控制事务:

1.事务:一个包含多个步骤的业务操作,如果这个业务操作被事务管理,则这多个步骤要么同时成功,要么同时失效

2.操作:

1.开启事务

2.提交事务

3.回滚事务

3.使用Connection对象管理事务:

开启事务:setAutoCommit(boolean autoCommit) : 调用该方法设置参数为false,即开启事务

在执行sql之前开启

提交事务:commit()

所有操作正常执行之后

回滚事务:rollback

catch中

标签:JDBC,java,String,--,sql,day04,jdbc,mysql
From: https://www.cnblogs.com/yumengqifei/p/16736289.html

相关文章

  • 前端 el-table 本地搜索
    <el-inputstyle="width:12vw;"size="mini"v-model="askSearch.goodsName"placeholder="请输入物品名称搜索"clearable></el-input>//搜索框 //el-table 表格 ......
  • 16 -- 排序算法之插入排序
    算法介绍:插入排序属于内部排序法,时对于待排序的元素以插入的方式找到改元素的适当位置,以达到排序的目的。【类似于生活中的斗地主游戏,每抓起一张牌按照便把改张牌按照指定......
  • AI智能检测识别平台EasyCVR出现卡顿及反应慢的原因分析以及解决方法
    EasyCVR平台是我们支持协议最全面的视频平台,它能支持标准协议,包括:国标GB/T28181、RTMP、RTSP/Onvif协议,以及厂家的私有协议与SDK,如:海康Ehome协议、海康SDK、大华SDK等。平......
  • 25 bootstrap--v3--datetimepicker时间选择器--应用
    在模板中引用响应的文件比如:layout.html<linkrel="stylesheet"href="{%static'stark/plugins/datetimepicker/css/bootstrap-datetimepicker.css'%}"/><scripts......
  • geoserver 安装
    下载满足要求的geoserverdockerpullkartoza/geoserver:2.21.1自定义用户密码启动docker,数据路径按需求挂载出来/opt/geoserver/data_dirdockerrun--namege......
  • error CS8773: "Feature 'global using directive' is not available in C# 9.0" afte
    errorCS8773:"Feature'globalusingdirective'isnotavailableinC#9.0"afterdowngradefromnet6.0tonet5.0回答1remove<ImplicitUsings>enable</Implici......
  • 程序员修炼之道—从小工到专家(一)
    第一章——注重实效的哲学(上)1.我的源码让猫给吃了出现了未曾预见到的问题,要设法尽可能职业地处理它们,可以为自己的能力自豪,同时对于无知和错误必须诚实面对。对于不可能......
  • VMWare Workstation安装Ghost版系统
    新建虚拟机的教程可以参考安装纯净版系统的教程,这里不再赘述,下面主要看下与安装纯净版系统的不同之处。如果我们直接启动,会报错networkbootfromamd79c978a,如下图 ......
  • Maven-私服搭建与配置
    一、maven私服搭建1.下载地址https://help.sonatype.com/repomanager3/product-information/download/download-archives---repository-manager-32.启用tar-zxvfnexu......
  • 使用Linux命令sort及uniq对文件或屏幕输出进行分组统计
    【转载】:https://blog.51cto.com/hanzhichao/3436177  在日常Linux操作常常需要对一些文件或屏幕数次中重复的字段进行分组统计。另外分组统计也是常考的面试题之一。......