使用JDBC连接和操作数据库以及myBatis初级入门

news2024/12/26 12:12:05

JDBC简介和使用

java程序操作数据库的方式有很多种,下面列举一些市面上常用的方式:

从图片分析的知:

MyBatis MyBatisPlus 这两个所占的比重比较大。都是用于简化JDBC开发的
    


   JDBC:(Java DataBase Connectivity),就是使用Java语言操作关系型数据库的一套API。

      

 JDBC的本质:

  •             sun公司官方定义的一套操作所有关系型数据库
  •             各个数据库厂商去实现这套接口,提供忽聚酷驱动jar包
  •             我们使用这套接口(JDBC)编程,真正执行的代码时驱动jar包中的实现类


    快速入门

  •             1,创建项目,引入mysql的驱动,junit依赖

                <dependency>    <groupId>mysql</groupId>    <artifactId>mysql-connector-java</artifactId>    <version>8.0.33</version></dependency>

  •             2,注册驱动

                Class.forName("com.mysql.cj.jdbc.Driver");

  •             3,获取连接对象Connection

                Connection connection = DriverManager.getConnection(
        "jdbc:mysql://localhost:3306/web", "root", "root@1234")

  •             4,获取SQL语句自行对象statement

                Statement statement = connection.createStatement();

  •            5,   执行SQL语句:

           statement.executeUpdate("update user set password = '1234567890' where id = 1");

  •             6,    释放资源:

            statement.close();connection.close();

1,创建maven项目,引入MySQL的驱动和junit单元测试的依赖

在工程下,右击然后点击new,选择Module 

选择 New Module 然后根据自己情况完成右边的配置

    创建好工程之后,添加依赖。

        

2,注册驱动

 //注册驱动
        Class.forName("com.mysql.cj.jdbc.Driver");

 3,获取连接对象Connection

        // 获取连接对象
        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/sde01","root","root");
     

 4,获取SQL语句自行对象statement

// 获取执行SQL的对象   
Statement statement = connection.createStatement();

5, 执行SQL语句:


//执行SQL
statement.executeUpdate("update user set password = '666666' where id = 1");

6,    释放资源:

        statement.close();
        connection.close();

完整操作:

这个数据库是我本地的sde01库中的user表

create table user(
    id int unsigned primary key auto_increment comment 'ID,主键',
    username varchar(20) comment '用户名',
    password varchar(32) comment '密码',
    name varchar(10) comment '姓名',
    age tinyint unsigned comment '年龄'
) comment '用户表';

insert into user(id, username, password, name, age) values (1, 'daqiao', '123456', '大乔', 22),
                                                           (2, 'xiaoqiao', '123456', '小乔', 18),
                                                           (3, 'diaochan', '123456', '貂蝉', 24),
                                                           (4, 'lvbu', '123456', '吕布', 28),
                                                           (5, 'zhaoyun', '12345678', '赵云', 27);

我们在maven工程中,com.sde包下的子包 entity包创建一个User实体类

public class User {
    private Integer id;
    private String password;
    private String username;
    private String name;
    private Integer age;

    public User() {
    }

    public User(Integer id, String password, String username, String name, Integer age) {
        this.id = id;
        this.password = password;
        this.username = username;
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", password='" + password + '\'' +
                ", username='" + username + '\'' +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

在创建一个测试类UpdateTest1:

    @Test
    public void testJdbc() throws Exception {
        //注册驱动
        Class.forName("com.mysql.cj.jdbc.Driver");

        // 获取连接对象
        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/sde01","root","root");
        //创建执行SQL的对象
        Statement statement = connection.createStatement();
        //返回影响的行数
        int rows = statement.executeUpdate("update user set password = '666666' where id = 1");
        System.out.println(rows > 0 ? "修改成功" : "修改失败");
        //关闭资源
        statement.close();
        connection.close();
    }
}

结果:

jdbc中的API详解

        DriverManager

驱动管理器  ,注册驱动, 获取数据库连接 DriverManager.registerDriver(...)

注册驱动的步骤:

 1,当类加载Driver驱动类时,会自动运行静态代码块中

2,Class.forName这步操作可以省略  

SPI机制:Service Provider Interface,JDK内置的一种服务提供发现机制,可以轻松的扩展你得程序(切换实现),实现接口与实现类之间的解耦。

   3    获取数据库连接:DriverManager.getConnection(url,user,password);    

  • url:数据库连接的url  
  • 语法:jdbc:mysql://ip地址(域名)/数据库名?参数键值对1&参数键值对2。
  •  说明:如果连接的时是本机的默认端口的mysql,url可以简写为:jdbc:mysql:///数据库名?参数键值对...              

 

     user:用户名

    password:数据库的密码


        Connection


            Connection的作用:获取执行SQL的对象


                执行普通SQL对象Statement:connection.createStatement()

                执行预编译SQL对象PreparedStatement:connection.preparedStatement()

         可以通过PreparedStatement解决SQL注入问题

  • 获取PreparedStatement对象
  • 设置参数值
  • 执行SQL
   @Test
    public void testLogin() throws Exception {
        Connection connection = PjdbcUtils.getConnection();
        String sql = "select * from user where username = ? and password = ?";
        PreparedStatement ps = connection.prepareStatement(sql);
        ps.setString(1,"xiaoqiao");
        ps.setString(2,"123456");
        ResultSet resultSet = ps.executeQuery();
        while (resultSet.next()){
            int id = resultSet.getInt("id");
            String username = resultSet.getString("username");
            String password = resultSet.getString("password");
            String name = resultSet.getString("name");
            int age = resultSet.getInt("age");
            User user = new User(id,username,password,name,age);
            System.out.println(user);
        }

        PjdbcUtils.close(connection,null,resultSet);
    }

 效果:

   Statement

statement的作用:执行SQL

  •                 执行DDL、DML语句:executeUpdate(sql);  如果是执行DML语句完毕,返回值int代表DML语句影响的函数。
  •         执行SQL语句:executeQuery(sql); 返回值为ResultSet,里面封装了查询结果。

        执行增删改executeUpdate() 会返回一个int类型的数据,表示影响的行数

执行查询时executeQuery() 会返回一个ResultSet的结果集

ResultSet

  •      ResultSet(结果对象集):封装了DQL查询语句查询的结果。
  •     next() 将光标从当前位置向前移动一行,并判断当前行是否是有效行,返回值为boolean
  •     getXxxx()获取数据:可以根据列的编号获取,也可以根据列名获取(推荐使用)

      

 

ResultSet rs = ps.executeQuery();
        while (rs.next()){
            int id = rs.getInt("id");
            String username = rs.getString("username");
            String password = rs.getString("password");
            String name = rs.getString("name");
            int age = rs.getInt("age");
            System.out.println(new User(id,username,password,name,age));
        }
        PjdbcUtils.close(connection,ps,rs);
    }

PreparedStatement


            优势:
                1,安全(防SQL注入)
                2,性能高
            1,获取PreparedStatement对象2,设置参数值 3,执行SQL

新建一个JDBC工具类,PjdbcUtils类

public class PjdbcUtils {
    public static final String URL = "jdbc:mysql://localhost:3306/sde01";  //改成你自己的数据库
    public static final String USER = "root";  //改成你自己的用户名
    public static final String PASSWORD = "root"; //改成你自己的密码

    public static Connection getConnection(){
        //加载驱动
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
        }catch (ClassNotFoundException e){
            e.printStackTrace();
        }
        //连接数据库
        Connection con = null;
        try {
            con = DriverManager.getConnection(URL,USER,PASSWORD);
        }catch (SQLException e){
            e.printStackTrace();
        }
        return con;
    }


//关闭连接
public static void close(Connection con, Statement state, ResultSet rs) {
    if (rs != null) {
        try {
            rs.close();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }
    if (state != null) {
        try {
            state.close();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }
    if (con != null) {
        try {
            con.close();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
             }
         }

    }

}

 使用JDBC完成增删改查的案例:


@DisplayName("使用PreparedStatement完成增删改查")
public class PselectTest {

    /**
     * 测试查询功能
     * @throws Exception
     */
    @Test
    @DisplayName("测试查询功能")
    public void testLogin() throws Exception {
        Connection connection = PjdbcUtils.getConnection();
        String sql = "select * from user where username = ? and password = ?";
        PreparedStatement ps = connection.prepareStatement(sql);
        ps.setString(1,"xiaoqiao");
        ps.setString(2,"123456");
        ResultSet resultSet = ps.executeQuery();
        while (resultSet.next()){
            int id = resultSet.getInt("id");
            String username = resultSet.getString("username");
            String password = resultSet.getString("password");
            String name = resultSet.getString("name");
            int age = resultSet.getInt("age");
            User user = new User(id,username,password,name,age);
            System.out.println(user);
        }

        PjdbcUtils.close(connection,null,resultSet);
    }

    /**
     * 测试删除功能
     * @throws Exception
     */
    @Test
    @DisplayName("测试删除功能")
    public void testDel() throws Exception {
        Connection connection = PjdbcUtils.getConnection();
        String sql = "delete * from user where id = ?";
        PreparedStatement ps = connection.prepareStatement(sql);
        ps.setInt(1,6);
        ps.executeUpdate();

        PjdbcUtils.close(connection,ps,null);
    }

    @Test
    @DisplayName("测试修改功能")
    public void testUpdate() throws Exception {
        Connection connection = PjdbcUtils.getConnection();
        String sql = "update user set username = ?,password = ?,name = ?,age = ? where id = ?";
        PreparedStatement ps = connection.prepareStatement(sql);
        ps.setString(1,"sundaoen");
        ps.setString(2,"121212");
        ps.setString(3,"戴恩");
        ps.setInt(4,18);
        ps.setInt(5,6);
        int rows = ps.executeUpdate();
        System.out.println(rows > 0 ? "修改成功" : "修改失败");
        PjdbcUtils.close(connection,ps,null);
    }

    @Test
    @DisplayName("测试新增功能")
    public void testAdd() throws Exception {
        Connection connection = PjdbcUtils.getConnection();
        String sql = "insert into user values(null,?,?,?,?)";
        PreparedStatement ps = connection.prepareStatement(sql);
        ps.setString(1,"luban");
        ps.setString(2,"666666");
        ps.setString(3,"鲁班");
        ps.setInt(4,13);
        int rows = ps.executeUpdate();
        System.out.println(rows > 0 ? "添加成功" : "添加失败");
        PjdbcUtils.close(connection,ps,null);
    }
}


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1284069.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java开发中一些重要软件安装配置

Java技术栈中重要过程 1、JavaWeb1、开发工具VsCode的安装和使用2、Tomcat服务器3、nodejs的简介和安装4、Vite创建Vue3工程化项目ViteVue3项目的创建、启动、停止ViteVue3项目的目录结构 5、Maven安装和配置 1、JavaWeb 1、开发工具VsCode的安装和使用 1 安装过程 安装过程比…

WEB渗透—反序列化(十一)

Web渗透—反序列化 课程学习分享&#xff08;课程非本人制作&#xff0c;仅提供学习分享&#xff09; 靶场下载地址&#xff1a;GitHub - mcc0624/php_ser_Class: php反序列化靶场课程&#xff0c;基于课程制作的靶场 课程地址&#xff1a;PHP反序列化漏洞学习_哔哩哔_…

【C语言】深入理解C语言中的数学运算和类型转换

文章目录 引言取负运算的奥秘源码探索分析与解读 浮点数运算的精细差异源码分析 精度损失与隐式类型转换精度和除零运算探究float类型和double类型的精度各是多少&#xff08;即十进制有效位的位数&#xff09;&#xff1f;在你的机器上&#xff0c;“负数开方”是如何处理的&a…

pbootcms建站

pbootcms建站 一、下载pbootcms二、安装1、进入宝塔面在网站栏&#xff0c;新建站点&#xff0c;将该址里面文件全部清再将下载的pbootcms上传至该地址。 三、修改关联数据库1、在根目录下/config打开database.php照如下修改这里我使用mysqli数据库。修改并使用自已创建的数据库…

206 反转链表

解题思路可以有两种方法&#xff1a;递归 or 迭代。 \qquad 迭代&#xff1a;通过使用for循环遍历&#xff0c;完成目标。方法直观&#xff0c;容易理解。 \qquad 递归&#xff1a;通过函数调用其自身&#xff0c;完成目标。递归最复杂、最重要的部分就是递归函数的构建&#…

flask web开发学习之初识flask(三)

文章目录 一、flask扩展二、项目配置1. 直接配置2. 使用配置文件3. 使用环境变量4. 实例文件夹 三、flask命令四、模版和静态文件五、flask和mvc架构 一、flask扩展 flask扩展是指那些为Flask框架提供额外功能和特性的库。这些扩展通常遵循Flask的设计原则&#xff0c;易于集成…

电脑发生0x80070002错误,0x80070002错误代码怎么解决

电脑发生0x80070002错误代码是一个常见的问题&#xff0c;它通常与Windows更新或系统文件损坏有关。当你的电脑出现这个错误代码时&#xff0c;在使用电脑时可能会受到影响&#xff0c;因为这可能意味着系统无法正常更新或运行。几天的这篇文章将和大家聊聊0x80070002错误代码怎…

学习UnitTest框架,轻松打造无懈可击的代码!

一、什么是UnitTest&#xff1f; 1、介绍 unittest是Python自带的一个单元测试框架&#xff0c;它可以做单元测试&#xff0c;也能用于编写和运行重复的测试工作。 它给自动化测试用例开发和执行提供了丰富的断言方法&#xff0c;判断测试用例是否通过&#xff0c;并最终生成…

Shell数组函数:数组(一)

一、数组简介&#xff1a; 变量&#xff1a;用一个固定的字符串&#xff0c;代替一个不固定字符串。数组&#xff1a;用一个固定的字符串&#xff0c;代替多个不固定字符串。 二、类型 普通数组&#xff1a;只能使用整数作为数组索引关联数组&#xff1a;可以使用字符串作为…

Web前端 ---- 【vue】vue 组件传值(props、全局事件总线、消息的订阅与发布)

目录 前言 父子组件 父传子 子传父 全局事件总线 什么叫全局事件总线 如何创建全局事件总线 如何在组件上获取到这个全局vc对象 最常用的创建全局事件总线 兄弟组件 消息订阅与发布 安装 使用 爷孙组件 前言 在上篇文章我们介绍了父子组件之间的传值通信&#xff…

鸿蒙4.0开发笔记之ArkTS装饰器语法基础之发布者订阅者模式@Provide和@Consume(十三)

1、定义 在鸿蒙系统的官方语言ArkTS中&#xff0c;有一套类似于发布者和订阅的模式&#xff0c;使用Provide、Consume两个装饰器来实现。 Provide、Consume&#xff1a;Provide/Consume装饰的变量用于跨组件层级&#xff08;多层组件&#xff09;同步状态变量&#xff0c;可以…

【Altium designer 20】

Altium designer 20 1. Altium designer 201.1 原理图库1.1.1 上划岗 在字母前面加\在加字母1.1.2 自定义快捷键1.1.3 对齐1.1.4 在原有的电路图中使用封装1.1.5 利用excel创建IC类元件库1.1.6 现有原理图库分类以及调用1.1.7 现有原理图库中自动生成原理图库 1.2 绘制原理图1.…

PHP项目启动记录

PHP项目启动记录 1. 项目整体目录2. bash_profile3. nginx的conf配置4. vim /etc/hosts5. php -v6.修改nginx后重新加载nginx7. npm run watch-app --moduleattendance --platformmobile8. vim ~/.zshrc 1. 项目整体目录 2. bash_profile ~/.bash_profile是Mac系统中的一个配置…

MySQL笔记-第06章_多表查询

视频链接&#xff1a;【MySQL数据库入门到大牛&#xff0c;mysql安装到优化&#xff0c;百科全书级&#xff0c;全网天花板】 文章目录 第06章_多表查询1. 一个案例引发的多表连接1.1 案例说明1.2 笛卡尔积&#xff08;或交叉连接&#xff09;的理解1.3 案例分析与问题解决 2. …

B026-MySQL基础

目录 数据库概述数据库概念数据库的由来和发展常见的关系型数据库服务器&#xff08;DBMS&#xff09;SQL概述表的概念 数据库的安装与配置安装启动和连接MySQL启动MySQL服务连接MySQL MySQL图形化管理软件-Navicat数据库安装失败解决方案 MySQL数据库操作数据库操作和存储引擎…

4K-Resolution Photo Exposure Correction at 125 FPS with ~8K Parameters

MSLTNet开源 | 4K分辨率125FPS8K的参数量&#xff0c;怎养才可以拒绝这样的模型呢&#xff1f; 错误的曝光照片的校正已经被广泛使用深度卷积神经网络或Transformer进行广泛修正。尽管这些方法具有令人鼓舞的表现&#xff0c;但它们通常在高分辨率照片上具有大量的参数数量和沉…

Linux系统下Nginx的安装步骤

目录 Nginx简介Nginx的作用Nginx的安装方法方法一方法二方法三 本文主要介绍在Linux系统下&#xff0c;三种常见Nginx安装方法。 Nginx简介 Nginx是一个高性能的HTTP和反向代理服务器&#xff0c;也可以作为邮件代理服务器和通用的TCP/UDP代理服务器。它最初由Igor Sysoev创建…

JVM之垃圾回收与算法(四)

垃圾回收与算法 1.如何确定垃圾 1.1. 引用计数法 在 Java 中&#xff0c;引用和对象是有关联的。如果要操作对象则必须用引用进行。因此&#xff0c;很显然一个简单的办法是通过引用计数来判断一个对象是否可以回收。简单说&#xff0c;即一个对象如果没有任何与之关联的引用…

GPIO的使用--点亮外接小灯泡--开关控制

目录 一、确定引脚接线模式 接线时注意以下几点&#xff1a; 二、外接小灯泡引脚连接(以F12引脚为例) 1.正极接GPIOF3.3v电压引脚、负极接F12 2.正极接GPIOF3.3v电压引脚、负极接F12 三、问题检查 一、确定引脚接线模式 小灯泡有两级&#xff1a;正极、负极&#xff0c;…

春秋云镜:CVE-2022-28512

靶标介绍&#xff1a; Fantastic Blog (CMS)是一个绝对出色的博客/文章网络内容管理系统。它使您可以轻松地管理您的网站或博客&#xff0c;它为您提供了广泛的功能来定制您的博客以满足您的需求。它具有强大的功能&#xff0c;您无需接触任何代码即可启动并运行您的博客。 该…