新手也能看懂,基于Spring boot2.0的Spring boot+MyBatis整合

Spring boot整合Mybatis有两种常用的方式,一种就是我们常见的xml的方式,还有一种就是全注解的方式。我觉得这两者没有谁比谁好,在SQL语句不太长的情况下,我觉得全注解的方式一定是比较清晰简洁的。但是,复杂的SQL确实不太适合和代码写在一起。

一、开发前的准备

1.1环境参数

  • 开发工具:IDEA
  • 基础工具:Maven+JDK8
  • 所用技术:SpringBoot+Mybatis
  • 数据库:MySQL
  • Spring boot版本:2.1.0

1.2创建工程

创建一个基本的SpringBoot项目。

1.3 创建数据库和user用户表

我们的用户表很简单,只有4个字段:用户id,姓名,年龄,余额,如下图所示:

添加了“账户余额”字段是为了给大家简单的演示一下事务管理的方式。

建表语句:

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

1.4 配置pom文件中的相关依赖

由于要整合SpringBoot和MyBatis,所以加入了artifactid为mybatis-spring-boot-starter的依赖;由于使用了MySQL数据库,所以加入了artifactid为mysql-connector-java的依赖。

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>1.3.2</version>
    </denendency>

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connecter-java</artifactId>
        <scope>runtime</scope>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactid>
        <scope>test</scope>
    </dependency>
</dependencies>

1.5 配置application.properties

由于我使用的是比较新的MySQL连接驱动,所以配置文件可能和之前有一点不同。

server.port=8333
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/erp?useUnicode=true&&useSSL=false&&serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=admin
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

注意:我们使用的 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.

上面异常的意思是:com.mysql.jdbc.Driver 被弃用了。新的驱动类是 com.mysql.cj.jdbc.Driver。驱动程序通过SPI自动注册,手动加载类通常是不必要。

如果你非要写把com.mysql.jdbc.Driver 改为com.mysql.cj.jdbc.Driver 即可。

1.6 创建用户类Bean

User.java

public class User{
    private int id;
    private String name;
    private int age;
    private double money;
    ...
    此处省略了getter、setter以及toString方法
}

二、全注解的方式

先来看一下全注解的方式,这种方式与后面提到的xml的方式的区别仅仅在于一个将SQL语句写在Java代码中,一个下载xml配置文件中。全注解方式转换成xml方式仅需做一点点改变即可,我在后面会提到。

项目结构:

2.1 Dao层开发

UserDao.java

@Mapper
public interface UserDao{
    /**
     *通过名字查询用户信息
     */
    @Select("SELECT * FROM user WHERE name=#{name}")
    User findUserByName(@Param("name") String name);

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

    /**
     *插入用户信息
     */
    @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={#aga},money={#money} WHERE id=#{id}")
    void update(@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);
}

2.2service层

@Service
public class UserService{
    @Autowired
    private UserDao userDao;

    /**
     *根据名字查找用户
     */
    public User selectUserByName(String name){
        return userDao.findUserByName(name);
    }

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

    /**
     *插入两个用户
     */
    public void insertService(){
        userDao.insertUser("SnailClimb",22,3000.0);
        userDao.insertUser("Daisy",19,3000.0);
    }

    /**
     *模拟事物。由于加上了@Transactional注解,如果转账中途出了意外SnailClimb和Daisy的钱都不回改变
     */
    @Transactional
    public void changeMoney(){
        userDao.updateUser("SnailClimb",22,2000.0,3);
        //模拟转账过程中可能遇到的意外状况
        int temp=1/0;
        userDao.updateUser("Daisy",19,4000.0,4);
    }
}

2.3 Controller层

@RestController
@RequestMapping("/user")
public class UserController{
    @Autowired
    private UserService userService;

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

    @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";
    }
}

2.4 启动类

//此注解表示SpringBoot启动类
@SpringBootApplication
//此注解表示动态扫描DAO接口所在包,实际上不加下面这条语句也可以找到
@MapperScan("top.snailclimb.dao")
public class MainApplication(){
    
    public static void main(String[] args){
        SpringApplication.run(MainApplication.class,args);
    }
}

2.5 简单测试

上面代码经过测试都没问题,这里贴一下根据姓名查询的测试的结果

三、xml的方式

项目结构:

相比于注解的方式主要有以下几点改变,非常容易实现。

3.1 Dao层的改动

我这里只演示一个根据姓名找人的方法。

UserDao.java

@Mapper
public interface UserDao{
    /**
     *通过名字查询用户信息
     */
    User findUserByName(String name);
}

UserMapper.xml

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

<mapper namespace="top.snailclimb.dao.UserDao">

    <select id="findUserByName" parrmenterType="String" resultType="top.snailclimb.bean.user">
        SELECT * FROM user WHERE name=#{name}
    </select>
</mapper>

3.2 配置文件的改动

配置文件中加入下面这句话:

mybatis.mapper-locations=classpath:mapper/*.xml

转载自:https://github.com/Snailclimb/springboot-integration-examples/blob/master/md/springboot-mybatis.md

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值