[Mybatis+SpringBoot] 使用全注解方式实现SpringBoot整合Mybatis_新建项目,用全注解方法完成springboot整合-程序员宅基地

技术标签: java  mybatis  mysql  SpringBoot  

前言:
网上关于这部分的资料有很多,但是都很零散,今天为了总结一下以前自己学习的,所以准备在这里写一篇完整的教程,希望对你们有用。

项目结构

在这里插入图片描述

开发环境

  • 开工工具:IDEA
  • 基础工具:Maven JDK8
  • 技术:Spring+Mybatis
  • 数据库:Mysql
  • SpringBoot版本:2.1.1

创建工程

  • 创建springboot工程
    在这里插入图片描述
    在这里插入图片描述
    工程这里就不细说了,贴一下pom文件内容吧。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.2.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.asong.demo</groupId>
    <artifactId>demomybat</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>
    <name>demomybat</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.1</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--Mysql数据库驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.15</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.yml</include>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.yml</include>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
        </resources>
    </build>
</project>

创建数据库表

因为为了测试,我们的用户表只创建4个字段如下:

CREATE TABLE `user` (
  `id` int(13) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `name` varchar(33) DEFAULT NULL COMMENT '姓名',
  `age` int(3) DEFAULT NULL COMMENT '年龄',
  `money` double DEFAULT NULL COMMENT '账户余额',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8

配置application.yml文件

如下:

server:
  port: 8080

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
    username: root
    password: root

这里需要注意的是,我们使用的mysql-connector-java 8+ ,JDBC 连接到mysql-connector-java 6+以上的需要指定时区 serverTimezone=GMT%2B8。另外我们之前使用配置 Mysql数据连接是一般是这样指定driver-class-name=com.mysql.jdbc.Driver,但是现在不可以必须为 否则控制台下面的异常:

Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.

代码实现

1. 创建用户类Bean
public class User {
    
    private int id;
    private String name;
    private int age;
    private double money;

    public User(){
    }

    public User(int id, String name, int age, double money) {
    
        this.id = id;
        this.name = name;
        this.age = age;
        this.money = money;
    }

    public int getId() {
    
        return id;
    }

    public String getName() {
    
        return name;
    }

    public int getAge() {
    
        return age;
    }

    public double getMoney() {
    
        return money;
    }

    public void setId(int id) {
    
        this.id = id;
    }

    public void setName(String name) {
    
        this.name = name;
    }

    public void setAge(int age) {
    
        this.age = age;
    }

    public void setMoney(double money) {
    
        this.money = money;
    }

    @Override
    public String toString() {
    
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", money=" + money +
                '}';
    }
}
2.Dao层
@Mapper
public interface UserDao {
    
    /**
     * 通过名字查询用户信息
     */
    @Select("SELECT * FROM user WHERE name = #{name}")
    User findUserByName(@Param("name") String name);

    /**
     * 查询所有用户信息
     * @return
     */
    @Select("SELECT * FROM user")
    List<User> findAllUser();

    /**
     * 插入用户信息
     * @param name
     * @param age
     * @param money
     */
    @Insert("INSERT INTO user(name, age,money) VALUES(#{name}, #{age}, #{money})")
    void insertUser(@Param("name") String name,@Param("age") Integer age,@Param("money") Double money);

    /**
     * 根据 id 更新用户信息
     */
    @Update("UPDATE  user SET name = #{name},age = #{age},money= #{money} WHERE id = #{id}")
    void updateUser(@Param("name") String name, @Param("age") Integer age, @Param("money") Double money,
                    @Param("id") int id);

    /**
     * 根据 id 删除用户信息
     */
    @Delete("DELETE from user WHERE id = #{id}")
    void deleteUser(@Param("id") int id);
}
3. Service层
@Service
public class UserService {
    
    @Autowired
    private UserDao userDao;

    /**
     * 根据名字查找用户
     * @param name
     * @return
     */

    public User selectUserByName(String name)
    {
    
        return userDao.findUserByName(name);
    }

    /**
     * 插入两个用户
     */
    public void insertService(){
    
        userDao.insertUser("sunsong",22,4000.0);
        userDao.insertUser("zhang",20,4000.0);
    }

    /**
     * 查找所有用户
     * @return
     */
    public List<User> selectAllUser(){
    
        return userDao.findAllUser();
    }

    /**
     * 根据id删除用户
     * @param id
     */
    public void deleteService(int id)
    {
    
        userDao.deleteUser(id);
    }
    @Transactional
    public void changemoney(){
    
        userDao.updateUser("sunsong",21,2000.0,3);
        //模拟转账过程中可能遇到的意外情况
        int test = 1 / 0;
        userDao.updateUser("zhang",19,3000.0,4);
    }
}
4. Controller层
@Controller
@RequestMapping("/user")
public class UserController {
    

    @Autowired
    private UserService userService;

    @RequestMapping("/query")
    public User testQuery() {
    
        return userService.selectUserByName("sunsong");
    }

    @RequestMapping("/insert")
    public List<User> testInsert() {
    
        userService.insertService();
        return userService.selectAllUser();
    }


    @RequestMapping("/changemoney")
    public List<User> testchangemoney() {
    
        userService.changemoney();
        return userService.selectAllUser();
    }

    @RequestMapping("/delete")
    public String testDelete() {
    
        userService.deleteService(3);
        return "OK";
    }
}

运行程序

在这里插入图片描述
在这里插入图片描述

总结

这个项目完全是通过全注解方式进行开发,还可以通过XML方式的进行开发,等我发下一次整理发出来吧,总体实现还是很简单。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_39397165/article/details/103824884

智能推荐

STM32G030F6P6烧录程序无法启动运行-程序员宅基地

文章浏览阅读2k次。原因分析,STM32G030F6P6与STM32F系列的启动特点有一些差异,主要是默认的nBOOT_SEL被设置为1,即由内部BOOT位配置启动,使用官方提供的STM32CubeProgrammer修改不了nBOOT_SEL配置,后来通过命令行执行下列代码后,修改nBOOT_SEL为0,芯片可正常启动。初次使用STM32G030F6P6开发了一款电路板,但是发现烧录程序后无法启动运行的问题。_stm32g030f6p6烧录

黑马程序员————IO流操作的基本规律和使用方法_io流操作的熟练应用-程序员宅基地

文章浏览阅读359次。O流的操作规律之所以要弄清楚这个规律,是因为流的对象太多,开发时不知道用哪个对象合适。想要知道开发时用到哪个对象,只要通过四个明确即可。1.明确源和目的(汇) 源:InputStream Reader 目的:OutputStream Writer2.明确数据是否是纯文本数据 源:是纯文本 Reader_io流操作的熟练应用

Blender基础操作:移动游标位置、快速设置原点_blender移动游标-程序员宅基地

文章浏览阅读6k次,点赞3次,收藏2次。如何快速设置原点,如何移动游标的位置_blender移动游标

友盟qq分享回调无论成功失败全部跳转onCancel_友盟分享qq oncancel-程序员宅基地

文章浏览阅读1.2k次。友盟社会化sdk,qq分享回调无论成功失败全部跳转onCancel解决方法:application中的qqid和manifests的qqid需要填写同一个,如果用默认的就全都用默认id。_友盟分享qq oncancel

【雕爷学编程】Arduino 手册之布尔运算符&&(逻辑与)_arduino &&-程序员宅基地

文章浏览阅读474次。2)布尔运算符&& (逻辑与)的操作数必须是布尔类型的值,即真(true)或假(false)。一般来说,非零的值会被转换为真(true),零的值会被转换为假(false)。因此,在使用布尔运算符&& (逻辑与)时,最好确保操作数是布尔类型的值,或者使用比较运算符将其转换为布尔类型的值。3)布尔运算符&& (逻辑与)的结果也是布尔类型的值,即真(true)或假(false)。布尔运算符&& (逻辑与)的案例四:这个案例是使用Arduino和一个超声波传感器来测量距离,并根据距离的大小显示不同的颜色。_arduino &&

【雕爷学编程】MicroPython手册之 ESP32-S3 WebREPL (Web浏览器交互提示)_micropython webrepl-程序员宅基地

文章浏览阅读417次。需要正确连接硬件并了解所使用的传感器和设备的规范和特性非常重要。对于涉及到硬件操作的代码,请确保在使用之前充分了解和确认所使用的引脚和电平等参数的正确性和安全性。此外,使用ADC(模拟-数字转换器)读取传感器数据是一种常见的做法,对于不同的传感器类型,可能需要使用不同的引脚和参数来初始化ADC。建议采取适当的安全措施,如设置访问权限、使用安全的网络连接和加密传输数据,以保护ESP32-S3的系统和数据安全。远程监控和控制:通过WebREPL,用户可以远程监控和控制连接到ESP32-S3的传感器和执行器。_micropython webrepl

随便推点

JSON parse error: Unexpected end-of-input: ... PushbackInputStream ... JsonEOFException_json parse error: unexpected end-of-input: expecte-程序员宅基地

文章浏览阅读3.2w次,点赞38次,收藏14次。错误异常信息:JSON parse error: Unexpected end-of-input: expected close marker for Object (start marker at [Source: (PushbackInputStream); line: 1, column: 1]); nested exception is com.fasterxml.jackson.cor..._json parse error: unexpected end-of-input: expected close marker for object

计算机四级网络工程师操作题,计算机四级《网络工程师》练习题-程序员宅基地

文章浏览阅读258次。计算机四级《网络工程师》练习题计算机四级是针对计算机的熟练以及掌握程度进行评估的一种国家型等级考试。考试为无纸化考试,不含操作题。下面就来和小编一起看看计算机四级《网络工程师》练习题吧。1文件系统中,文件访问控制信息存储的合理位置是A.文件控制块B.文件分配表C.用户口令表D.系统注册表参考答案:A2下列对文件的描述中,哪一项与文件的物理结构相关?A.文件长度B.用户对文件的存取方式C.文件中记录..._计算机四级 操作题

BranchCache在sharepoint2013使用-程序员宅基地

文章浏览阅读31次。BranchCache 是 Windows 7、Windows 8、Windows Server2008R2 和 Windows Server 2012 操作系统的一项功能,此功能可在本地分支机构的计算机上对来自文件和广域网 (WAN) 中 Web 服务器的内容进行缓存。在异地分布式 SharePoint Server 2013 环境中,BranchCache 可通过缓存用户从 SharePo...

ThinkPHP全行业小程序运营管理系统源码+一键生成小程序_thinkphp内核全行业小程序运营管理系统源码+自由diy布局+一键生成小程序.rar-程序员宅基地

文章浏览阅读58次。代理商管理:拥有底层源码系统,发展自己的代理商,列表清晰展示各代理商状态,详细设置对代理商账号信息、创建小程序的个数、系统到期时间等进行管理。消息通知:设置商品状态通知、成团通知、预约预定通知、系统表单通知、会员卡开卡通知等消息模板,配置商家收发消息邮箱实现邮件通知。积分签到、积分兑换商城、拼团、店内点餐、手机客服等插件可用,满足各种行业场景营销需求,助力客户小程序营销推广。无需代码编程,无需技术基础,简单的操作页面,清晰的模块分划,详尽的功能组件,让您短时间即可轻松玩转小程序。_thinkphp内核全行业小程序运营管理系统源码+自由diy布局+一键生成小程序.rar

php-resque 极简php消息队列-程序员宅基地

文章浏览阅读271次。安装首先这货需要在linux下跑,非得用windows就别看了,也不是不能装,费劲且性能渣得有composer,嫌慢的也拉倒吧,别看了,本文不介绍没有composer怎么办安装composer也不是本文要点,在ubuntu(其实为了不折腾QQ我装的是deepin)中就是一行命令php...

python中科学技术法、int转字节数据、从二进制文件读取小数float_python 读取二进制转小数-程序员宅基地

文章浏览阅读622次。1.python中小数按科学技术法的形式输出:print("%e" % number)2.int.from_bytes(bytes, bytesorder='big'/'little', signed=False)参数解释:bytes是需要解析的字节;bytesorder是说明要解释的字节中左边是高位还是右边是高位,big左边是高位,little左边是低位;signed表示当前解析的是否是有符号数。int.to_bytes()是int.from_bytes的逆过程,把十进制整数,转换为byt_python 读取二进制转小数

推荐文章

热门文章

相关标签