一、JDBC

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

为了使用JDBC操作数据库,首先,我们需要在pom.xml文件中引入依赖

<dependencies><!-- MySQL JDBC driver --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.30</version></dependency><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter</artifactId><version>5.9.3</version><scope>test</scope></dependency>
</dependencies>

JDBC案例

    public void testUpdate() throws Exception {//1、注册驱动Class.forName("com.mysql.cj.jdbc.Driver");//2、获取数据库连接String url ="jdbc:mysql://localhost:3306/web01";String username ="root";String password ="1234";Connection connection = DriverManager.getConnection(url, username, password);//3、获取sql执行对象Statement statement = connection.createStatement();//4、执行SQLint i = statement.executeUpdate("update user set age = 25 where id =1");//DMLSystem.out.println("SQL语句执行完毕影响的记录数为:"+ i);//5、释放资源statement.close();connection.close();}

预编译SQL

这是一种编写SQL语句时,不将其中的数据写死,而是用占位符代替,在后续需要查询时替换占位符的方法。

conn.prepareStatement("SELECT * FROM user WHERE username = ? AND password = ?");
pstmt.setString(1, "daqiao");
pstmt.setString(2, "123456");
ResultSet resultSet = pstmt.executeQuery();

这种呢,并未将参数值在SQL语句中写死,而是使用 ? 进行占位,然后再指定每一个占位符对应的值是多少,而最终在执行SQL语句的时候,程序会将SQL语句(SELECT * FROM user WHERE username = ? AND password = ?),以及参数值("daqiao", "123456")都发送给数据库,然后在执行的时候,会使用参数值,将?占位符替换掉。

那这种预编译的SQL,也是在项目开发中推荐使用的SQL语句。主要的作用有两个:​
防止SQL注入​(例如输入密码时输入引号等符号然后传入程序,恶意更改程序内容)
性能更高

当我们使用JDBC查询数据库中的数据时,需要创建一个类用于存储查询返回的值(其中成员变量的数据类型为封装后的数据类型)。ResultSet(结果集对象):封装了DQL查询语句查询的结果。

package org.example;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@AllArgsConstructor
@NoArgsConstructor
@Data
public class User {private Integer id;private String username;private String password;private String name;private Integer age;
}
public void testSelect(){String url ="jdbc:mysql://localhost:3306/web01";String username ="root";String password ="1234";Connection conn=null;PreparedStatement stmt = null;ResultSet rs = null;        //封装返回的结果集try {Class.forName("com.mysql.cj.jdbc.Driver");conn = DriverManager.getConnection(url, username, password);//?为占位符String sql = "SELECT id,username,password,name,age FROM user WHERE username=? AND password=?";//预编译SQLstmt = conn.prepareStatement(sql);stmt.setString(1, "daqiao");        //为占位符赋值stmt.setString(2, "123456");rs = stmt.executeQuery();while(rs.next()){User user = new User(rs.getInt("id"),rs.getString("username"),rs.getString("password"),rs.getString("name"),rs.getInt("age"));System.out.println( user);  //用Lombol的@Data注解生成的toString()方法}} catch (Exception e) {e.printStackTrace();} finally {try{if(rs != null) rs.close();if(stmt != null) stmt.close();if(conn != null) conn.close();}catch (Exception e){e.printStackTrace();}}}

Mybatis

MyBatis是一款优秀的持久层框架,用于简化JDBC的开发。

在IDEA中使用Mybatis需要在创建项目时引入以下三个文件。mybatis的起步依赖、mysql的驱动包、lombok。

项目工程创建完成后,自动在pom.xml文件中,导入Mybatis依赖和MySQL驱动依赖。

配置Mybatis

application.properties 中配置数据库的连接信息。

#数据库访问的url地址
spring.datasource.url=jdbc:mysql://localhost:3306/web
#数据库驱动类类名
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#访问数据库-用户名
spring.datasource.username=root
#访问数据库-密码
spring.datasource.password=root@1234

在创建出来的springboot工程中,在引导类所在包下,在创建一个包 mapper 。在 mapper 包下创建一个接口 UserMapper ,这是一个持久层接口(Mybatis的持久层接口规范一般都叫 XxxMapper)。

程序案例

package com.codeblossom.springbootwebmyhabitsquickstract.pojo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@AllArgsConstructor
@NoArgsConstructor
@Data
public class User {private Integer id;private String username;private String password;private String name;private Integer age;
}
package com.codeblossom.springbootwebmyhabitsquickstract.mapper;import com.codeblossom.springbootwebmyhabitsquickstract.pojo.User;
import org.apache.ibatis.annotations.*;import java.util.List;@Mapper         //应用程序创建时,会自动为该接口创建一个实现类对象(代理对象),并且会自动将该实现类放入IOC容器 -bean对象
public interface UserMapper {//@Select("select * from user")   // 查询所有用户public List<User> findAll();/*** 根据id删除*/@Delete("delete from user where id=#{id}")public Integer deleteById(int id);  //Integer返回值,表示受影响的行数/*新增一个用户*/@Insert("insert into user(username,password,name,age) values(#{username},#{password},#{name},#{age})")public Integer Insert(User user);/*根据id更新用户信息*/@Update("update user set username=#{username},password=#{password},name=#{name},age=#{age} where id=#{id}")public Integer updateById(User user);/*根据用户名和密码查询用户信息*/@Select("select * from user where username=#{username} and password=#{password}")public User findByUsernameAndPassword(@Param("username") String username, @Param("password") String password);  //因为用户名唯一,所以可以直接用一个对象封装返回
}
package com.codeblossom.springbootwebmyhabitsquickstract;import com.codeblossom.springbootwebmyhabitsquickstract.mapper.UserMapper;
import com.codeblossom.springbootwebmyhabitsquickstract.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.util.List;@SpringBootTest //SpringBoot中的单元测试注解,当前测试类中的测试方法运行时,会启动Springboot项目-IOC容器
class SpringBootWebMyhabitsquickstractApplicationTests{@Autowiredprivate UserMapper userMapper;@Testpublic void testFindAll(){List<User> userlist = userMapper.findAll();userlist.forEach(user -> System.out.println(user));}@Testpublic void testDeleteById(){int result = userMapper.deleteById(1);System.out.println(result);}@Testpublic void testInsert(){User user = new User();user.setUsername("admin");user.setPassword("123456");user.setName("管理员");user.setAge(18);int result = userMapper.Insert(user);System.out.println(result);}@Testpublic void testUpdate(){User user = new User();user.setId(6);user.setUsername("admin");user.setPassword("123456");user.setName("管理员");user.setAge(19);int result = userMapper.updateById(user);System.out.println(result);}@Testpublic void testfindByUsernameAndPassword(){User user = userMapper.findByUsernameAndPassword("admin","123456");System.out.println(user);}
}

XML映射配置

使用Mybatis的注解方式,主要是来完成一些简单的增删改查功能。如果需要实现复杂的SQL功能,建议使用XML来配置映射语句,也就是将SQL语句写在XML配置文件中。

在Mybatis中使用XML映射文件方式开发,需要符合一定的规范:

  1. XML映射文件的名称与Mapper接口名称一致,并且将XML映射文件和Mapper接口放置在相同包下(同包同名)

  2. XML映射文件的namespace属性为Mapper接口全限定名一致

  3. XML映射文件中sql语句的id与Mapper接口中的方法名一致,并保持返回类型一致。

xml映射文件中的dtd约束,直接从mybatis官网复制即可; 或者直接AI生成。 

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace=""></mapper>

案例

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.codeblossom.springbootwebmyhabitsquickstract.mapper.UserMapper"><select id="findAll" resultType="com.codeblossom.springbootwebmyhabitsquickstract.pojo.User">
<!--        id为方法名,resultType:查询返回单条记录所封装的类型(用于查询语句上面)-->select * from user</select></mapper>

XML映射文件的namespace属性为Mapper接口全限定名

XML映射文件中sql语句的id与Mapper接口中的方法名一致,并保持返回类型一致

若是想要在别的路径下使用xml文件,可以在application.properties 中配置

#指定XML映射配置文件的位置
#在mapper下创建xml文件
mybatis.mapper-locations=classpath:mapper/*.xml

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

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

相关文章

cell2location复现

https://github.com/BayraktarLab/cell2location/issues/348 根据你已下载的本地 wheel 文件&#xff0c;可以通过以下方式修改安装命令&#xff0c;优先从本地路径安装 jaxlib&#xff0c;同时保持其他依赖的安装方式不变&#xff1a; 解决方案 # 安装 jax (从远程 PyPI 源) p…

什么是 npm、Yarn、pnpm? 有什么区别? 分别适应什么场景?

什么是 npm、Yarn、pnpm? 有什么区别? 分别适应什么场景? 在前端开发中&#xff0c;包管理工具扮演着非常重要的角色。它们帮助开发者高效地管理项目的依赖&#xff0c;确保项目中所需的所有第三方库和工具都能按时安装&#xff0c;并且兼容版本。npm、Yarn 和 pnpm 是三款…

深度隐匿源IP:高防+群联AI云防护防绕过实战

隐蔽性挑战 黑客常通过以下手段绕过基础防护&#xff1a; HTTPS证书嗅探&#xff1a;访问 https://源站IP&#xff0c;通过证书域名匹配暴露真实IP历史解析记录追踪&#xff1a;从DNS数据库获取旧A记录CDN缓存渗透&#xff1a;利用边缘节点回源漏洞定位源站 三重防护方案 高防I…

如何加快golang编译速度

跟着我的步骤来&#xff1a;第一步&#xff1a;(点击edit)第二步&#xff1a;将go tool arguments设置为-p4&#xff0c;初始值设为4&#xff0c; 代表最多同时编译4个包&#xff08;非文件&#xff09;。电脑性能好时&#xff0c;可设为CPU最大核心数&#xff08;充分利用多核…

浏览器自动化方案

B端后台列表页自动新增素材方案 我设计了一套完整的浏览器自动化方案&#xff0c;使用 Puppeteer 实现B端后台列表页的自动新增素材功能。该方案包含数据组织、浏览器操作、错误处理等完整流程。 一、技术选型 浏览器自动化工具&#xff1a;Puppeteer (https://pptr.dev)任务调…

MPPT电路设计

反激的具体计算过程要写好起码要一天&#xff0c;所以本次先更MPPT。这章不计算具体参数&#xff0c;只做分析。 目录 一、电路作用 二、电路设计 采样电路和输入电路 主体电路 驱动电路 一、电路作用 MPPT电路是一种广泛应用于光伏发电、风力发电等新能源系统中的关键电…

【基于飞浆训练车牌识别模型】

基于飞浆训练车牌识别模型 基于飞浆训练车牌识别模型 LPRNet&#xff08;License Plate Recognition via Deep Neural Networks&#xff09;是一种轻量级卷积神经网络&#xff0c;专为端到端车牌识别设计&#xff0c;由Intel IOTG Computer Vision Group的Sergey Zherzdev于201…

No module named ‘sklearn‘

1、运行python数据分析库时报错 No module named sklearn2、原因 虚拟环境未安装 sklearn 库&#xff08;即 scikit-learn&#xff09;。 3、解决方案 pip install scikit-learn使用国内镜像源&#xff1a; pip install scikit-learn -i https://mirrors.aliyun.com/pypi/simpl…

XPath注入攻击详解:原理、危害与防御

什么是XPath注入&#xff1f; XPath注入&#xff08;XPath Injection&#xff09;是一种针对使用XPath查询语言的应用程序的安全攻击技术&#xff0c;类似于SQL注入。当应用程序使用用户提供的输入来构造XPath查询而没有进行适当的过滤或转义时&#xff0c;攻击者可以通过构造恶…

网络编程(套接字)

目录 一、套接字 1、套接字的作用 2、关于TCP和UDP协议 1. TCP协议 2. UDP协议 3. 两者的区别 2、套接字函数 1&#xff09;函数 socket&#xff08;创建套接字同文件描述符&#xff09; 2&#xff09;准备套接字用结构体 1. 套接字的结构体 2. 客户端的套接字&…

R语言安装包

# 在安装过程中指定源地址 install.packages("RCurl", repos "https://mirrors.tuna.tsinghua.edu.cn/CRAN/") # 查看当前镜像 options()$repos # 设置为中科大镜像 options("repos" c(CRAN"https://mirrors.ustc.edu.cn/CRAN/")…

微服务引擎 MSE 及云原生 API 网关 2025 年 5 月产品动态

点击此处&#xff0c;了解微服务引擎 MSE 产品详情。

性能测试过程中监控linux服务器资源情况

文章目录1. cpu使用情况&#xff08;1&#xff09;性能瓶颈类型CPU密集型瓶颈​​I/O或等待瓶颈​&#xff08;2&#xff09;资源分配与竞争​资源争用分析​虚拟化环境资源分配​&#xff08;3&#xff09;系统稳定性与异常​​异常波动与毛刺​​过热降频影响​&#xff08;4…

使用defineExpose暴露子组件的属性和方法、页面生命周期onLoad和onReady的使用

欢迎来到我的UniApp技术专栏&#xff01;&#x1f389; 在这里&#xff0c;我将与大家分享关于UniApp开发的实用技巧、最佳实践和项目经验。 专栏特色&#xff1a; &#x1f4f1; 跨平台开发一站式解决方案 &#x1f680; 从入门到精通的完整学习路径 &#x1f4a1; 实战项目经…

新手必看!VSCodePyCharm 配置 OpenCV 超详细教程(支持 Python 和 C++ 双语言)

新手必看&#xff01;VSCode&PyCharm 配置 OpenCV 超详细教程&#xff08;支持 Python 和 C 双语言&#xff09; 适用对象&#xff1a;初学者&#xff0c;希望在 VSCode 与 PyCharm 两款常用 IDE 中&#xff0c;学会配置并使用 OpenCV&#xff0c;分别实现 Python 与 C 环境…

PyTorch深度学习框架入门案例实战

PyTorch深度学习框架详解与实战 1. PyTorch简介与环境配置 1.1 安装与导入 # 基础导入 import torch import torch.nn as nn import torch.nn.functional as F import torch.optim as optim from torch.utils.data import DataLoader, TensorDataset import numpy as np import…

Spring Boot - Spring Boot 集成 MyBatis 分页实现 手写 SQL 分页

一、准备阶段 1、依赖引入 pom.xml <properties>...<postgresql.verison>42.5.6</postgresql.verison><mybatis.version>3.0.1</mybatis.version> </properties><dependencies>...<!-- postgresql 驱动 --><dependency>…

李宏毅《生成式人工智能导论》 | 第9讲 AI Agent

文章目录大模型未来趋势&#xff1a;以大型语言模型打造的AgentAI Agent运行的可能原理有记忆的ChatGPT大模型未来趋势&#xff1a;以大型语言模型打造的Agent 人类需要做多步骤的复杂任务&#xff0c;AI可以做到这件事吗&#xff1f; 如果可以我们将其称为AI Agent&#xff…

OCR 与 AI 图像识别:协同共生的智能双引擎

OCR 擅长提取图像中的文字信息&#xff0c;但面对复杂背景、扭曲角度的图片时&#xff0c;容易受干扰&#xff1b;AI 图像识别能解析图像场景、物体形态&#xff0c;却难以精准捕捉文字细节 —— 两者结合才能释放最大价值。比如在票据处理中&#xff0c;AI 图像识别先定位票据…

C# 按照主题的订阅 按照类型的订阅

安装TinyPubSub库&#xff0c;按照 主题发布订阅using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Form…