spring boot 整合jdbc和事务

news2024/11/24 17:56:17

       访问效果

         springboot连接数据库需要整合jdbc与事务,那么改怎么处理,答案是不需要我们处理,springboot已经实现,我们只需在pom文件中引入对应的库然后简单配置即可实现。jdbc驱动的引入,别忘了还有mybatis引入。下面我们来实现下:

1、j在pom文件中引入dbc驱动与mybatis

        <!--jdbc事务-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>

        <!-- mysql 数据库驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.46</version>
        </dependency>

        <!--mybatis -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.0.1</version>
        </dependency>

 2、数据库连接池参数配置

  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/mumu
    username: "数据库账号"
    password: "数据库密码"

3、mybatis配置

#mybatis
# mybatis配置
mybatis:
  # 实体类别名包路径
  type-aliases-package: springbootdemo.pojo
  # 映射文件路径
  # mapper-locations: classpath:mappers/*.xml
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

4、application配置

在启动类上添加扫描包注解(推荐): import tk.mybatis.spring.annotation.MapperScan;别导错包。
package springbootdemo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import tk.mybatis.spring.annotation.MapperScan;

@SpringBootApplication
@MapperScan("springbootdemo.mapper")
public class Application {

    public static void main(String[] args){
        SpringApplication.run(Application.class,args);
    }

}

5、通用mapper配置

        通用Mapper的作者也为自己的插件编写了启动器,我们直接引入即可。在项目的 pom.xml 文件中加入如下依赖,注意:一旦引入了通用Mapper的启动器,会覆盖Mybatis官方启动器的功能,因此需要移除对官方Mybatis启动器的依赖。

     <!-- 通用mapper -->
        <dependency>
            <groupId>tk.mybatis</groupId>
            <artifactId>mapper-spring-boot-starter</artifactId>
            <version>2.1.5</version>
        </dependency>

6、编写UserMapper

package springbootdemo.mapper;

import springbootdemo.pojo.User;
import tk.mybatis.mapper.common.Mapper;

public interface UserMapper extends Mapper<User> {
}

7、user表(需要自行去mysql创建数据库表新增用户数据,sql语句见下一步)

package springbootdemo.pojo;

import lombok.Data;
import tk.mybatis.mapper.annotation.KeySql;

import javax.persistence.Id;
import javax.persistence.Table;
import java.util.Date;

@Data
@Table(name = "tb_user")
public class User{
    // id
    @Id
    //开启主键自动回填
    @KeySql(useGeneratedKeys = true)
    private Long id;
    // 用户名
    private String userName;
    // 密码
    private String password;
    // 姓名
    private String name;
    // 年龄
    private Integer age;
    // 性别,1男性,2女性
    private Integer sex;
    // 出生日期
    private Date birthday;
    // 创建时间
    private Date created;
    // 更新时间
    private Date updated;
    // 备注
    private String note;
}

8、sql信息


-- ----------------------------
-- Table structure for tb_user
-- ----------------------------
DROP TABLE IF EXISTS `tb_user`;
CREATE TABLE `tb_user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `user_name` varchar(100) DEFAULT NULL COMMENT '用户名',
  `password` varchar(100) DEFAULT NULL COMMENT '密码',
  `name` varchar(100) DEFAULT NULL COMMENT '姓名',
  `age` int(10) DEFAULT NULL COMMENT '年龄',
  `sex` tinyint(1) DEFAULT NULL COMMENT '性别,1男性,2女性',
  `birthday` date DEFAULT NULL COMMENT '出生日期',
  `note` varchar(255) DEFAULT NULL COMMENT '备注',
  `created` datetime DEFAULT NULL COMMENT '创建时间',
  `updated` datetime DEFAULT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `username` (`user_name`)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of tb_user
-- ----------------------------
INSERT INTO `tb_user` VALUES ('1', 'sw', '123456', '千帆v', '30', '1', '1964-08-08', '李先生很棒', '2014-09-19 16:56:04', '2014-09-21 11:24:59');
INSERT INTO `tb_user` VALUES ('2', '34r', '123456', '李哇', '21', '2', '1995-01-01', '李李先生很棒', '2014-09-19 16:56:04', '2014-09-19 16:56:04');
INSERT INTO `tb_user` VALUES ('3', 'dsff', '123456', '王如何', '22', '2', '1994-01-01', '李先生很棒', '2014-09-19 16:56:04', '2014-09-19 16:56:04');
INSERT INTO `tb_user` VALUES ('4', 'ht', '123456', '张奥迪', '20', '1', '1996-09-01', '李先生很棒', '2014-09-19 16:56:04', '2014-09-19 16:56:04');
INSERT INTO `tb_user` VALUES ('5', 'grr', '123456', '李二', '28', '1', '1988-01-01', '李娜李先生很棒', '2014-09-19 16:56:04', '2014-09-19 16:56:04');
INSERT INTO `tb_user` VALUES ('6', 'rr', '123456', '李法人', '23', '1', '1993-08-08', '李雷李先生很棒', '2014-09-20 11:41:15', '2014-09-20 11:41:15');
INSERT INTO `tb_user` VALUES ('7', 'hh', '123456', '威威', '24', '2', '1992-08-08', '李先生很棒', '2014-09-20 11:41:15', '2014-09-20 11:41:15');
INSERT INTO `tb_user` VALUES ('8', 'hrr', '123456', '为如', '21', '2', '2008-07-08', '李先生很棒', '2014-09-20 11:41:15', '2014-09-20 11:41:15');
INSERT INTO `tb_user` VALUES ('9', 'kytt', '123456', '马搭', '18', '2', '2012-08-08', '李先生很棒', '2014-09-20 11:41:15', '2014-09-20 11:41:15');
INSERT INTO `tb_user` VALUES ('10', 'gvr', '123456', '安安', '45', '2', '1971-08-08', '李先生很棒', '2014-09-20 11:41:15', '2014-09-20 11:41:15');
INSERT INTO `tb_user` VALUES ('11', 'htrh', '123456', 'de', '33', '2', '1983-08-08', '李先生很棒', '2014-09-20 11:41:15', '2014-09-20 11:41:15');
INSERT INTO `tb_user` VALUES ('12', 'wre', '123456', '马大哈', '46', '2', '1980-08-08', '李先生很棒', '2014-09-20 11:41:15', '2014-09-20 11:41:15');

9、UserService编写

package springbootdemo.UserService;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.beans.factory.annotation.Autowired;

import springbootdemo.mapper.UserMapper;
import springbootdemo.pojo.User;

@Service
public class UserService {

    @Autowired(required=false)
    private UserMapper userMapper;

    //根据id查询
    public User queryById(Long id) {

        return userMapper.selectByPrimaryKey(id);
    }

    @Transactional
    public void saveUser(User user) {
        System.out.println("新增用户...");
        userMapper.insertSelective(user);
    }
}

10、测试结果

package springbootdemo.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import springbootdemo.UserService.UserService;
import springbootdemo.pojo.User;

import javax.sql.DataSource;

@RestController
public class HelloController {


    @Autowired
    private UserService userService;
    /**
     * 根据id获取用户
     * @param id 用户id
     * @return 用户
     */
    @GetMapping("/user/{id}")
    public User queryById(@PathVariable Long id){
        return userService.queryById(id);
    }

}

11、测试输出结果

浏览器输入地址:http://localhost:8080/user/6

SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@49e8af71] was not registered for synchronization because synchronization is not active
JDBC Connection [HikariProxyConnection@546085857 wrapping com.mysql.jdbc.JDBC4Connection@574e7689] will not be managed by Spring
==>  Preparing: SELECT id,user_name,password,name,age,sex,birthday,created,updated,note FROM tb_user WHERE id = ? 
==> Parameters: 6(Long)
<==    Columns: id, user_name, password, name, age, sex, birthday, created, updated, note
<==        Row: 6, lilei, 123456, 李雷, 23, 1, 1993-08-08, 2014-09-20 11:41:15.0, 2014-09-20 11:41:15.0, 李先生很棒
<==      Total: 1
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@49e8af71]

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

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

相关文章

计数质数,给定整数 n ,返回 所有小于非负整数 n 的质数的数量 。

题记&#xff1a; 给定整数 n &#xff0c;返回 所有小于非负整数 n 的质数的数量 。 示例 1&#xff1a; 输入&#xff1a;n 10 输出&#xff1a;4 解释&#xff1a;小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。 示例 2&#xff1a; 输入&#xff1a;n 0 输出&#x…

活动招募 | 小米黑客马拉松OPEN DAY等你来!

2023年小米黑客马拉松OPEN DAY来啦&#xff01;不知道大家还记得去年黑马的获奖项目“MiGu”头箍吗&#xff1f;用脑电波控制智能家居的想法让大家眼前一亮&#xff01; 2023年黑客马拉松也同样精彩纷呈&#xff01;本届比赛共有76支队伍报名参赛&#xff0c;各个团队不仅在技术…

vue的setup函数

 为了开始使用Composition API&#xff0c;我们需要有一个可以实际使用它&#xff08;编写代码&#xff09;的地方&#xff1b;  在Vue组件中&#xff0c;这个位置就是 setup 函数&#xff1b;◼ setup其实就是组件的另外一个选项&#xff1a; 只不过这个选项强大到我们可…

怎么解决字符乱码的问题

目录 什么是字符乱码 字符乱码是什么原因 怎么解决字符乱码的问题 示例代码 什么是字符乱码 字符乱码是指在文本或字符编码中出现无法正确显示或解析的字符。当使用不同的字符编码格式读取或显示文本时&#xff0c;如果编码格式不匹配或不正确&#xff0c;就会导致字符乱码…

ASP.NET Core - 缓存之内存缓存

1. 缓存 缓存指的是在软件应用运行过程中&#xff0c;将一些数据生成副本直接进行存取&#xff0c;而不是从原始源&#xff08;数据库&#xff0c;业务逻辑计算等&#xff09;读取数据&#xff0c;减少生成内容所需的工作&#xff0c;从而显著提高应用的性能和可伸缩性&#x…

【Spring Cloud】Ribbon 中的几种负载均衡策略

文章目录 前言一、Ribbon 介绍二、负载均衡设置三、7种负载均衡策略3.1.轮询策略3.2.权重策略3.3.随机策略3.4.最小连接数策略3.5.重试策略3.6.可用性敏感策略3.7.区域敏感策略 前言 负载均衡通常有两种实现手段&#xff0c;一种是服务端负载均衡器&#xff0c;另一种是客户端…

Python中怎么处理字符编码问题

什么是字符编码 字符编码是一种将字符或文本表示为数字序列的方式&#xff0c;以便计算机能够理解和处理它们。由于计算机是基于二进制的&#xff0c;只能处理数字&#xff0c;因此需要将字符转换为对应的数字表示。 在字符编码中&#xff0c;每个字符都有一个唯一的编码值与…

中国古代掌握至高权力的8个女人

在封建社会&#xff0c;基本都是男尊女卑&#xff0c;女人想掌握权力比男人难太多了&#xff1b;但是数千年的历史积累沉淀&#xff0c;总也有几个不甘于现状的女人&#xff0c;一步步逐渐掌握国家的权力&#xff0c;但是能做到登基称帝的&#xff0c;仅有一人。 TOP、1 武则天…

Vue 本地应用-计数器

逻辑是在点击按钮的时候执行&#xff0c;那么要为按钮绑定点击事件&#xff0c;整体语法如下&#xff1a; <!DOCTYPE html> <html> <head><meta charset"UTF-8"><title>首页</title><link href"" type"text/c…

【雕爷学编程】Arduino动手做(95)---GY9960手势传感器模块5

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

年出货2亿台,只赚“辛苦钱”!又一家代工巨头押宝汽车电子

7月20日&#xff0c;作为国内ODM龙头之一的华勤技术正式启动招股&#xff0c;拟在上交所主板上市。此前&#xff0c;因技术先进性、科创属性不足等问题&#xff0c;该公司终止科创板IPO。 华勤技术成立于2005年&#xff0c;几年后赶上了全球智能手机的黄金时代&#xff0c;招股…

Moonbeam操作指南:使用区块链索引

索引是指组织数据库以快速查找特定数据。在区块链的背景下&#xff0c;如何储存数据至关重要 — — 通过重要状态变化期间发生的事件。 例如&#xff0c;假设您正在构建一个DApp&#xff0c;其中列出了特定NFT集合的全部所有者。您可以仔细查看该NFT系列销售中发出的所有转让事…

ubuntu安装pycharm No JRE found错误

参考资料&#xff1a; 《UBUNTU14.04 PYCHARM安装及NO JDK FOUND解决方法》 问题&#xff1a; 解决办法&#xff1a; 1.去java官网&#xff0c;下载相应的jdk文件&#xff1a; 2.下载完成后在 jdk-8u151-linux-x64.tar.gz 的运行以下命令&#xff1a; sudo mkdir /usr/lib/jv…

平台化设计产品存在的问题

产品&#xff1a;在将业务抽象成产品或组件时&#xff0c;需要考虑多个因素&#xff0c;包括闭环条款、持久性、可重用性等。只有当业务具备这些关键特征时&#xff0c;才能适合抽象成产品。否则&#xff0c;应该考虑将其作为组件的形式存在&#xff0c;或者使用规则引擎来可视…

谈谈你对Synchronized关键字的理解及使用

synchronized关键字最主要的三种使用方式的总结 修饰实例方法&#xff0c;作用于当前对象实例加锁&#xff0c;进入同步代码前要获得当前对象实例的锁修饰静态方法&#xff0c;作用于当前类对象加锁&#xff0c;进入同步代码前要获得当前类对象的锁 。也就是给当前类加锁&…

13 硬链接和软链接

13.1 硬链接和软链接的区别 硬链接&#xff1a;A---B&#xff0c;假设B是A的硬链接&#xff0c;那么只要存在一个&#xff0c;无论删除哪一个&#xff0c;文件都能访问得到。 软链接&#xff1a;类似于快捷方式&#xff0c;删除源文件&#xff0c;快捷方式就访问不了。 13.2 创…

流星特效案例代码

实际效果&#xff0c;代码下载即可使用 流星图片 <!-- 描述: 流星特效 作者: Jack GUO 日期: 20230727 --> <template> <div class"wrap-container sn-container"> <div class"pd-main-left"> <div class"yun-container&…

计算机组成原理问答6

总线 总线是一组能为多个部件分时共享的公共数据信息传送线路。 基本概念 特性:机械特性(尺寸、形状)、电气特性(传输方向、电平有效范围)、功能特性(数据、地址、控制信号)、时间特性(信号和时序的关系) 分类: 按数据传输格式:串行(一个比特一个比特的传输)…

30.文字自动出现

文字自动出现 html部分 <h1 id"text"></h1><div><label for"speed">速度</label><input type"number" name"speed" id"speed" min"1" max"10" value"1" …

力扣热门100题之字母异位词分组【中等】

题目描述 给你一个字符串数组&#xff0c;请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 示例 1: 输入: strs [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”] 输出: [[“bat”],[“na…