Jdbc和Mybatis的增删改查

news/2025/1/17 14:42:37/

Jdbc和Mybatis的增删改查

  • 背景
  • 开发前提
  • Jdbc
  • Mybatis
  • 测试出现的问题

背景

在实习期间,结合公司的开发体系架构,在导入公司的综合配置文件依赖之后,在基础上进行JdbcMyabtis增删改查的联系。

开发前提

建立一个标准的 maven 的项目,SDK改为自己本地jdk8位置,修改自己本地的 maven 环境以及仓库引入 springboot 的父依赖项目。导入公司自己封装的依赖包的依赖名称。建立符合要求的包机制,其中主启动类放置的位置需要和依赖自定义扫描的位置一致,否则需要自定义包扫描机制

@ComponentScan(value = "com.mao")

配置 maven 资源导出问题

    <build><resources><resource><directory>src/main/resources</directory><excludes><exclude>**/*.properties</exclude><exclude>**/*.xml</exclude></excludes><filtering>false</filtering></resource><resource><directory>src/main/java</directory><includes><include>**/*.properties</include><include>**/*.xml</include></includes><filtering>false</filtering></resource></resources></build>

mybatis-config.xml 的配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><settings><!-- 这个配置使全局的映射器启用或禁用缓存 --><setting name="cacheEnabled" value="true"/><!-- 全局启用或禁用延迟加载。当禁用时,所有关联对象都会即时加载 --><setting name="lazyLoadingEnabled" value="false"/><!-- 当启用时,有延迟加载属性的对象在被调用时将会完全加载任意属性。否则,每种属性将会按需要加载 --><setting name="aggressiveLazyLoading" value="false"/><!-- 允许或不允许多种结果集从一个单独的语句中返回(需要适合的驱动) --><setting name="multipleResultSetsEnabled" value="true"/><!-- 使用列标签代替列名。不同的驱动在这方便表现不同。参考驱动文档或充分测试两种方法来决定所使用的驱动 --><setting name="useColumnLabel" value="true"/><!-- 允许JDBC支持生成的键。需要适合的驱动。如果设置为true则这个设置强制生成的键被使用,尽管一些驱动拒绝兼容但仍然有效(比如Derby) --><setting name="useGeneratedKeys" value="true"/><!-- 指定MyBatis如何自动映射列到字段/属性。PARTIAL只会自动映射简单,没有嵌套的结果。FULL会自动映射任意复杂的结果(嵌套的或其他情况) --><setting name="autoMappingBehavior" value="PARTIAL"/><!-- 配置默认的执行器。SIMPLE执行器没有什么特别之处。REUSE执行器重用预处理语句。BATCH执行器重用语句和批量更新 --><setting name="defaultExecutorType" value="SIMPLE"/><!-- 设置超时时间,它决定驱动等待一个数据库响应的时间 --><setting name="defaultStatementTimeout" value="25000"/><!--<setting name="logImpl" value="STDOUT_LOGGING" />--></settings></configuration>

Jdbc

Jdbc 英文全称Java Database connect,翻译之后就是Java数据库连接。

在这里插入图片描述

基本的 Jdbc 查询流程

//下面方法有不同的异常,我直接抛出一个大的异常
public static void main(String[] args) throws Exception {   //1、导入 mysql 5 的驱动jar包//2、注册驱动Class.forName("com.mysql.jdbc.Driver");//3、获取数据库的连接对象Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/ems", "root", "123456");//4、定义sql语句String sql = "select * from studnet;";//5、获取执行sql语句的对象Statement stat = con.createStatement();//5、执行sql并接收返回结果ResultSet rs = stat.executeQuery(sql);//6、处理结果while (rs.next()){  //循环一次,游标移动一行System.out.println("id:" + rs.getString(1)); //  获取第一列的数据//获取字段为name的数据System.out.println("name:" + rs.getString("name"));  System.out.println("age:" + rs.getInt(3)); //  获取第三列的数据System.out.println("score:" + rs.getInt(4)); //  获取第四列的数据}//8、释放资源rs.close();stat.close();con.close();}

建立StudentJdbc 类,组件化方面进行 Jdbc 的增删改查,其中引用到公司的jar包依赖,可能会发生数据源的冲突,如下

org.springframework.beans.factory.BeanCreationException:
Error creating bean with name 'studentController': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: 
Error creating bean with name 'studentJdbc': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'javax.sql.DataSource' available: expected single matching bean but found 2: maoDatasource,hisDatasource

就是不清楚的数据源来源,发生了数据源冲突,注入数据源的时候需要通过 name 属性指定数据源

@Component
public class StudentJdbc {@Resource(name = "maoDatasource")private DataSource dataSource;}

查询全部数据的业务函数,由于在自定义的配置文件中已经连接到本地的数据库了,所以在构造连接的时候采用的是无参构造函数生成 statement,在最开始生成变量值为null,在使用的时候进行new的初始化,查询的时候需要增加一个结果集资源,在结束的时候需要逆向关闭三个连接资源。

public List<Student> jdbcList() throws SQLException {List<Student> list = new ArrayList<>();Connection conn = null;Statement statement = null;ResultSet resultSet = null;try {conn = dataSource.getConnection();// 链接创建 Statementstatement = conn.createStatement();resultSet = statement.executeQuery("select * from student where deleted = 0");// 遍历结果集while (resultSet.next()) {int id = resultSet.getInt("id");String username = resultSet.getString("username");String password = resultSet.getString("password");int deleted = resultSet.getInt("deleted");Student student = new Student(id, username, password,deleted);list.add(student);System.out.println("id:" + resultSet.getInt("id") + "用户名:" + resultSet.getString("username") + "密码" + resultSet.getString("password"));}} catch (SQLException e) {throw new RuntimeException(e);}finally {resultSet.close();statement.close();conn.close();}return list;}

增加函数的代码,使用了预编译 Statement,防止 SQL 的注入风险,sql 字符串使用占位符 ? ,预编译sql,通过 prepareStatement 放置对象,占位符标识从 1 开始,最终更新执行,结果返回一个 int 型的变量。

public int jdbcAdd(Student student) throws SQLException {Connection conn = null;PreparedStatement preStatement = null;try {conn = dataSource.getConnection();String sql = "insert into student(id,username,password) values (?,?,?);";preStatement = conn.prepareStatement(sql);preStatement.setInt(1,student.getId());preStatement.setString(2,student.getUsername());preStatement.setString(3,student.getPassword());return preStatement.executeUpdate();} catch (SQLException e) {throw new RuntimeException(e);}finally {preStatement.close();conn.close();}}

修改代码实现

public int jdbcUpdate(Student student) throws SQLException {Connection conn = null;PreparedStatement preStatement = null;try {conn = dataSource.getConnection();String sql = "update student set username = ?,password = ? where id = ?;";preStatement = conn.prepareStatement(sql);preStatement.setString(1,student.getUsername());preStatement.setString(2,student.getPassword());preStatement.setInt(3,student.getId());return preStatement.executeUpdate();} catch (SQLException e) {throw new RuntimeException(e);}finally {conn.close();preStatement.close();}}

删除代码实现

public int jdbcRemove(Integer id) throws SQLException {Connection conn = null;PreparedStatement preStatement = null;try {conn = dataSource.getConnection();String sql = "update student set deleted = 1 where id = ?;";preStatement = conn.prepareStatement(sql);preStatement.setInt(1,id);return preStatement.executeUpdate();} catch (SQLException e) {throw new RuntimeException(e);}finally {preStatement.close();conn.close();}}

Mybatis

Mybatis 官方文档

定义的 mapper接口

public interface StudentMapper {List<Student> list(String username);int add(Student student);int update(Student student);int remove(Integer id);}

对应 mapper.xml 配置文件 SQL 语句的编写

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.sunri.mapper.StudentMapper"><insert id="add" parameterType="com.sunri.entity.Student">insert into student(id,username,password) values (#{id},#{username},#{password});</insert><update id="update">update student<set><if test="username != null">username=#{username},</if><if test="password != null">password=#{password},</if></set>where id = #{id} and deleted = 0;</update><update id="remove">update student set deleted = 1 where id = #{id} and deleted = 0;</update><select id="list" resultType="com.sunri.entity.Student">select * from student<where><if test="username!=null and username!=''">username like '%${username}%'</if>and deleted = 0</where></select></mapper>

测试出现的问题

在这里插入图片描述

类似于这种点击发送即可

在这里插入图片描述


http://www.ppmy.cn/news/38594.html

相关文章

「从零入门推荐系统」14:推荐系统冷启动

作者 | gongyouliu编辑 | gongyouliu作者在第2章《推荐系统基础介绍》中讲述推荐系统面临的挑战时提到冷启动是推荐系统的重要挑战之一。冷启动问题是推荐系统工程实践中非常重要的一个问题&#xff0c;只有解决好冷启动问题&#xff0c;推荐系统的用户体验才会更好。有很多读者…

负载均衡(第十二届蓝桥杯省赛第二场C++A/B组)(自定义排序的使用模板)

题目详细&#xff1a; 解题思路&#xff1a; 每次简单的模拟即可 需要注意的是对于优先队列的自定义排序的使用 优先队列自定义排序的使用方法&#xff1a; struct node{ll endTime;ll cost;friend bool operator<(const node &a,const node &b){return a.endTim…

【区块链技术开发】基于Web3.js以太坊网络上的智能合约的交互及其应用

专栏:【区块链技术开发】 前期文章: 【区块链技术开发】OpenZeppelin智能合约库:提高智能合约的安全性和可靠性,加速去中心化应用DApp的开发与部署 【区块链技术开发】使用Infura连接以太坊节点和OpenZeppelin库来构建安全、可靠的智能合约 【区块链技术开发】 Solidity使…

MySQL查询流程

1.先上图 如上图所示&#xff0c;MySQL分成server层和引擎层两层。 server层&#xff1a;连接器、分析器、优化器、执行器等&#xff0c;主要是对客户端的指令进行分析&#xff0c;优化&#xff0c;提取等操作 引擎层&#xff1a;主要是对数据进行存储和提取&#xff0c;目前…

年薪200W+的 “ChatGPT提示工程师”,是AI时代下逆袭的好职业吗?

作者| Mr.K 编辑| Emma来源| 技术领导力(ID&#xff1a;jishulingdaoli)使用同样的画笔&#xff0c;有人画出百鸟朝凤图&#xff0c;有人画出小鸡吃米图&#xff1b;同样的道理&#xff0c;用户使用同样的ChatGPT&#xff0c;问看上去类似的问题&#xff0c;得出的答案却有的…

springboot(07)邮件发送(qq邮箱)

可以使用Spring Boot提供的spring-boot-starter-mail模块来发送QQ邮件 首先登录QQ邮箱>>>登录成功后找到设置>>>然后找到邮箱设置>>>点击账户>>>找到POP3|SMTP服务>>>点击开启(开启需要验证&#xff0c;验证成功后会有一串授权码…

光度立体法检测原理讲解

光度立体法检测 图像辐照度 决定场景表面片辐射的因素有两个: 1.在场景表面片的照明 投在某一特定表面片上的照明量取决于该表面片在场景中相对于光源的分布位置 2.表面片反射的入射照明部分 在某一特定方向上被表面片反射的入射照明部分取决于表面材料的光学特性 反射类…

零售数据分析之操作篇11:销售占比分析

各位数据的朋友&#xff0c;大家好&#xff0c;我是老周道数据&#xff0c;和你一起&#xff0c;用常人思维数据分析&#xff0c;通过数据讲故事。 上期内容和作业 上一讲讲了排名与TOP的场景&#xff0c;排名是以排序为基础&#xff0c;从1开始标识其排名的序号&#xff1b;…