使用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;}@Overridepublic String toString() {return "User{" +"id=" + id +", password='" + password + '\'' +", username='" + username + '\'' +", name='" + name + '\'' +", age=" + age +'}';}
}

在创建一个测试类UpdateTest1:

    @Testpublic 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
   @Testpublic 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.mzph.cn/news/197216.shtml

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

相关文章

95基于matlab的多目标优化算法NSGA3

基于matlab的多目标优化算法NSGA3&#xff0c;动态输出优化过程&#xff0c;得到最终的多目标优化结果。数据可更换自己的&#xff0c;程序已调通&#xff0c;可直接运行。 95matlab多目标优化 (xiaohongshu.com)

leetcode做题笔记1038. 从二叉搜索树到更大和树

给定一个二叉搜索树 root (BST)&#xff0c;请将它的每个节点的值替换成树中大于或者等于该节点值的所有节点值之和。 提醒一下&#xff0c; 二叉搜索树 满足下列约束条件&#xff1a; 节点的左子树仅包含键 小于 节点键的节点。节点的右子树仅包含键 大于 节点键的节点。左右…

智能优化算法应用:基于树种算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于树种算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于树种算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.树种算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…

【腾讯云云上实验室】个人对腾讯云向量数据库的体验心得

目录 前言Tencent Cloud VectorDB概念使用初体验腾讯云向量数据库的优势应用场景有哪些&#xff1f;未来展望番外篇&#xff1a;腾讯云向量数据库的设计核心结语 前言 还是那句话&#xff0c;不用多说想必大家都能猜到&#xff0c;现在技术圈最火的是什么&#xff1f;非人工智…

【LeetCode热题100】【双指针】三数之和

给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可以包含重复的三元组。 示例 …

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

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

OpenResty(nginx+lua+resty-http)实现访问鉴权

OpenResty(nginxluaresty-http)实现访问鉴权 最近用BI框架解决了一些报表需求并生成了公开链接&#xff0c;现在CMS开发人员打算将其嵌入到业务系统中&#xff0c;结果发现公开链接一旦泄露任何人都可以访问&#xff0c;需要实现BI系统报表与业务系统同步的权限控制。但是目前…

视频分割方法:批量剪辑高效分割视频,提取m3u8视频技巧

随着互联网的快速发展&#xff0c;视频已成为获取信息、娱乐、学习等多种需求的重要载体。然而&#xff0c;很多时候&#xff0c;需要的只是视频的一部分&#xff0c;这就要对视频进行分割。而m3u8视频是一种常见的流媒体文件格式&#xff0c;通常用于在线视频播放。本文将分享…

【前端首屏加载速度优化(0): 谷歌浏览器时间参数】

DOMContentLoaded 浏览器已经完全加载了 HTML&#xff0c;DOM树构建完成&#xff0c;但是像是 <img> 和样式表等外部资源可能并没有下载完毕。 Load DOM树构建完成后&#xff0c;继续加载 html/css 中的外部资源&#xff0c;加载完成之后&#xff0c;视为页面加载完成。…

听说这样寄快递会很省钱!速来收藏!便宜寄快递!

哈喽&#xff0c;小伙伴们&#xff0c;今天介绍一个寄快递省钱的小妙招。话不多说&#xff0c;小编直接开整&#xff01; 在闪侠惠递这个快递折扣平台下单送快递&#xff0c;不仅方便&#xff0c;而且运费更便宜。平台整合了京东、顺丰、圆通、申通、极兔、等快递公司可供选择…

【学习笔记】混淆矩阵

混淆矩阵&#xff08;Confusion Matrix&#xff09;&#xff0c;又称为错误矩阵&#xff0c;是一种特别适用于监督学习中分类问题评估模型性能的工具。在机器学习领域&#xff0c;混淆矩阵能够清晰地显示算法模型的分类结果和实际情况之间的差异&#xff0c;常用于二分类和多分…

任意文件上传漏洞实战和防范

文件上传漏洞广泛存在于Web1.0时代&#xff0c;恶意攻击者的主要攻击手法是将可执行脚本&#xff08;WebShell&#xff09;上传至目标服务器&#xff0c;以达到控制目标服务器的目的。 此漏洞成立的前提条件至少有下面两个&#xff1a; 1.可以上传对应的脚本文件&#xff0c;…

第一个小记录达成:第一个年费会员用户

早上看到&#xff0c;欸&#xff0c;有个用户好像充了 9.9 元&#xff0c;挺开心&#xff0c;刚刚看飞书消息&#xff0c;看到了这条分享给朋友&#xff0c;等等&#xff0c;是充值了 99 元&#xff0c;有个用户充了年费&#xff0c;偶买噶&#xff0c;开心 &#x1fae1; 这是…

华为OD机试 - 仿LISP运算 - 逻辑分析(Java 2023 B卷 200分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#…

hql面试题之上海某资深数仓开发工程师面试题-求不连续月份的月平均值

1.题目 A,B两组产品的月平均值&#xff0c;月平均值是当月的前三个月值的一个平均值&#xff0c;注意月份是不连续的&#xff0c;如果当月的前面的月份不存在&#xff0c;则为0。如A组2023-04的月平均值为2023年1月的数据加2023-02月的数据的平均值&#xff0c;因为没有其他月…

股票代码合法验证:python字符串str应用

从键盘输入六位股票代码字符串&#xff0c;判定合法并输出板块分类&#xff0c;否则输出“NO”。 (笔记模板由python脚本于2023年12月04日 19:19:07创建&#xff0c;本篇笔记适合熟悉python字符串和字典的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https:…

Oracle 中换行chr(10)、回车chr(13)

一、前言 chr(n)&#xff1a;返回 ascii 值对应的字符。 ascii(char)&#xff1a;返回字符 char对应的ascii 值。 chr(n) 和 ascii(char) 作用刚好是相反的。 SQL> select chr(65) from dual; 控制台显示&#xff1a;ASQL> select ascii(A) from dual; 控制台显示&am…

开源CDN软件GoEdge —— 筑梦之路

官方网站&#xff1a;GoEdge CDN - 制作自己的CDN - GoEdge CDN | 自建CDN GoEdge是一款管理分布式CDN边缘节点的开源工具软件&#xff0c;目的是让用户轻松地、低成本地创建CDN/WAF等应用。 特性 免费 - 开源、免费、自由、开放 简单 - 架构简单清晰&#xff0c;安装简单&a…

Android,JNI开发和NDK之间的联系

Android&#xff0c;JNI开发和NDK。 1.jni和ndk jni是在jdk中就有出现的 在我们jdk路径中 D:\java\jdk11\include 这就是jdk中的jni Android开发环境中的ndk也有jni&#xff0c; D:\Android\sdk\ndk\20.0.5594570\toolchains\llvm\prebuilt\windows-x86_64\sysroot\usr\in…

解决msvcp140.dll丢失问题的5种方法,验证有效

在计算机编程和软件开发中&#xff0c;我们经常会遇到一些陌生的DLL文件&#xff0c;比如msvcp140.dll。这些DLL文件是动态链接库&#xff08;Dynamic Link Libraries&#xff09;的缩写&#xff0c;它们包含了可以被多个程序共享的代码和数据。那么&#xff0c;msvcp140.dll是…