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

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);
    }
}


 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

QT 无法打开包括文件 “xxxx.h”: No such file or direcotry 提升控件后提示找不到头文件

问题复现 UI文件提升控件后&#xff0c;提示找不到头文件。 原因 Qt中的ui文件会经过moc编辑器生成ui_xxx.h头文件。 在主页面的ui文件中因为使用了提升的widget&#xff0c;所以ui的ui头文件因该包含自定义控件的头文件。但是头文件的路径可以看出已经错误了。 #include &…

五、分支和循环

目录 1. if 语句 1.1 if 1.2 else 1.3 分支中包含多条语句 1.4 嵌套 if 1.5 悬空 else 问题 2. 关系操作符 3. 条件操作符 4. 逻辑操作符&#xff1a; &&&#xff0c;|| &#xff0c;&#xff01; 4.1 逻辑取反运算符 &#xff01; 4.2 与运算符 &&…

Day50力扣打卡

打卡记录 三个无重叠子数组的最大和 链接 滑动窗口 class Solution:def maxSumOfThreeSubarrays(self, nums: List[int], k: int) -> List[int]:n, ans len(nums), []sum1 sum2 sum3 0maxsum1idx, maxsum12idx 0, ()maxsum1 maxsum12 total 0for i in range(2 * …

LeetCode力扣每日一题(Java):9、回文数

一、题目 二、解题思路 1、我的思路 当x<0时&#xff0c;x一定不是回文数&#xff0c;直接返回false 当x>0且x<10时&#xff0c;x一定是回文数&#xff0c;直接返回true x>10时&#xff0c;先将x转为字符串。将数字转成字符串方法挺多的&#xff0c;以下是&…

C++作业5

完成沙发床的多继承&#xff08;有指针成员&#xff09; 代码&#xff1a; #include <iostream>using namespace std;class Bed { private:double *money; public:Bed(){cout << "Bed::无参构造函数" << endl;}Bed(double money):money(new doub…

如何使用高防CDN防护HTTPS 攻击?有什么优势?

随着互联网的普及&#xff0c;网络安全问题也日益凸显。其中&#xff0c;HTTPS 攻击是一种常见的网络安全威胁&#xff0c;它通过篡改网站数据、窃取用户信息等方式&#xff0c;给网站带来巨大的风险。为了有效防御 HTTPS 攻击&#xff0c;高防 CDN 成为了一个重要的工具。下面…

Redis5新特性-stream

Stream队列 Redis5.0 最大的新特性就是多出了一个数据结构 Stream&#xff0c;它是一个新的强大的 支持多播的可持久化的消息队列&#xff0c;作者声明 Redis Stream 地借鉴了 Kafka 的设计。 生产者 xadd 追加消息 xdel 删除消息&#xff0c;这里的删除仅仅是设置了标志位&am…

Open Inventor 2023.2.1 Crack

Fixed Bugs List 2023.2 2023.2.1 Open Inventor 2023.2.1 MeshViz #OIV-4824 Crash in MeshViz PbNonLinearDataMapping::computeColor Cache #OIV-4867 SoText3 : Texture read access violation – CAS-44904 Core #OIV-4725 Invalid displayed PoCircle color…

Stable Diffusion AI绘画系列【12】:国风美女剑客系列

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

[ 蓝桥杯Web真题 ]-视频弹幕

目录 介绍 准备 目标 效果 规定 思路 解答参考 扩展功能 介绍 弹幕指直接显现在视频上的评论&#xff0c;可以以滚动、停留甚至更多动作特效方式出现在视频上&#xff0c;是观看视频的人发送的简短评论。通过发送弹幕可以给观众一种“实时互动”的错觉&#xff0c;弹幕…

206 反转链表

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

tex中的边框

文章目录 利用tcolorbox宏包给公式加框 利用tcolorbox宏包 tcolorbox可以创建一个盒子的环境&#xff0c;例如&#xff1a; \documentclass{article} \usepackage{tcolorbox} \begin{document}\begin{tcolorbox}[left1cm, right1cm, top0.5cm, bottom0.5cm,colbackblue!10!wh…

Win Server 2019远程桌面服务部署

一、添加远程桌面授权服务 服务器管理 - 添加角色和功能打开“添加角色和功能向导”窗口&#xff0c;选择基于角色或给予功能安装&#xff1a; 打开服务器管理&#xff0c;打开角色和功能&#xff0c;添加远程回话主机和远程桌面授权 image.png 以上配置完成后使用期限为120…

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

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

希宝猫罐头怎么样?专业人士告诉你质量好又便宜的猫罐头推荐

作为从业6年的宠物护理师来说&#xff0c;只买合适的&#xff0c;贵的不如好的&#xff0c;只要配方不出错营养跟得上&#xff0c;观察自家猫咪体质真的基本不怎么出错。希望大家看完这篇文章&#xff0c;各位铲屎官都能买到满意的猫罐头。那么希宝猫罐头在各方面表现怎么样呢&…

Linux系统下Nginx的安装步骤

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

值班日历实现不同人显示不同的颜色区别

前端UI用的移动端的vantUI。这里只是我的思路总结&#xff0c;和用什么UI框架关系不大。 先看效果图&#xff1a; <van-calendarref"calendar":poppable"false":show-confirm"false":style"{ height: 580px }":min-date"minD…

01 高等数学.武忠祥.0基础

第一章 函数与极限 01映射与函数 02 函数概念 对应法则 定义域 常见函数 函数的几种特性 周期函数不一定有最小周期。 涉及额外与复习 存在与任意的关系

专业爬虫框架 _scrapy进阶使用详解

⑴ 中间件 中间件基本介绍 在Scrapy中&#xff0c;中间件是一种插件机制 它允许你在发送请求和处理响应的过程中对Scrapy引擎的行为进行干预和定制。 Scrapy中间件的用途&#xff1a; 修改请求、处理响应、处理异常、设置代理、添加自定义的HTTP头部等等。 Scrapy中间件主要分…