Spring Boot Mybatis 入门示例
Spring Boot Mybatis 入门示例
基于Spring Boot 2.3.4,Junit5
步骤说明
整个工程的最终目录结构如下,添加文件或者新建的目录的参考:
└─src
    ├─main
    │  ├─java
    │  │  └─com
    │  │      └─mall
    │  │          └─MallWeb
    │  │              ├─controllers
    │  │              ├─mapper
    │  │              ├─model
    │  │              └─services
    │  └─resources
    │      └─mybatis
    │          └─mapper
    └─test
        └─java
            └─com
                └─mall
                    └─MallWeb
                        └─mapper
数据库初始化语句
数据库表的初始化语句全部在下面,也可以根据自己的情况进行修改
CREATE DATABASE  IF NOT EXISTS `mall`;
USE `mall`;
CREATE TABLE IF NOT EXISTS `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(16) NOT NULL,
  `password` varchar(16) NOT NULL,
  `phoneNumber` varchar(15) NOT NULL,
  `money` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=latin1;
build.gradle:依赖添加
需要添加下面依赖
- 'mysql:mysql-connector-java:8.0.14'
- 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.0.0'
- 'org.projectlombok:lombok:1.16.16'
dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-web'
	//	MySQL数据库需要
	implementation 'mysql:mysql-connector-java:8.0.14'
	//	spring mybatis
	implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.0.0'
	//	lombok,用于Entity的自动get和set方法生成,不用自己写一大推的get和set方法
	implementation 'org.projectlombok:lombok:1.16.16'
	testImplementation('org.springframework.boot:spring-boot-starter-test') {
		exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
	}
}
application.properties:配置添加
配置文件的编写需要注意参数的配置,比如SSL那个一般要设置为false,driver-class-name也要注意一下,不要写错了,文件的大致内容如下:
# mybatis的config文件位置配置
mybatis.config-location=classpath:mybatis/mybatis-config.xml
# 各个表的xml文件位置配置
mybatis.mapper-locations=classpath:mybatis/mapper/*.xml
mybatis.type-aliases-package=com.neo.model
# 数据库连接信息配置,自行更换数据库,用户名和密码
spring.datasource.url=jdbc:mysql://localhost:3306/mall?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8\
  &useSSL=false
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#springboot + mybatis设置将SQL语句打印到控制台
logging.level.com.mall.MallWeb.mapper=debug
代码编写
入口环境配置Mapper扫描配置
在入口函数添加Mapper扫描配置,这样不必在每个Mapper上加上Mapper注解,大致如下:
package com.mall.MallWeb;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
 * @author lw
 */
@SpringBootApplication
@MapperScan("com.mall.MallWeb.mapper")
public class MallWebApplication {
	public static void main(String[] args) {
		SpringApplication.run(MallWebApplication.class, args);
	}
}
编写实体类
在代码目录下创建model文件夹,用于存储实体(数据库表)。编辑实体类,大致如下:
ppackage com.mall.MallWeb.model;
import java.io.Serializable;
/**
 * @author lw
 */
public class User implements Serializable {
    private Long id;
    private String name;
    private String password;
    private String phoneNumber;
    private Long money;
    public User(String name, String password, String phoneNumber) {
        this.name = name;
        this.password = password;
        this.phoneNumber = phoneNumber;
        this.money = 0L;
    }
    @Override
    public String toString() {
        return id + "::" + name + "::" + password + "::" + phoneNumber + "::" + money;
    }
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public String getPhoneNumber() {
        return phoneNumber;
    }
    public void setPhoneNumber(String phoneNumber) {
        this.phoneNumber = phoneNumber;
    }
    public Long getMoney() {
        return money;
    }
    public void setMoney(Long money) {
        this.money = money;
    }
}
Mapper接口类
新建Mapper文件夹,里面放Mapper相关的接口类。编写Mapper接口类,大致内容如下,@Repository解决idea里面的bean使用错误
package com.mall.MallWeb.mapper;
import com.mall.MallWeb.model.User;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
 * @author lw
 */
@Repository
public interface UserMapper {
    List<User> queryAll();
    User queryOne(Long id);
    void add(User user);
    void update(User user);
}
Mytatis配置文件mybatis-config.xml
新建文件夹 resource/mybatis,下面新建:mybatis-config.xml 文件,写入下面的内容:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <typeAliases>
        <typeAlias alias="Integer" type="java.lang.Integer" />
        <typeAlias alias="Long" type="java.lang.Long" />
        <typeAlias alias="HashMap" type="java.util.HashMap" />
        <typeAlias alias="LinkedHashMap" type="java.util.LinkedHashMap" />
        <typeAlias alias="ArrayList" type="java.util.ArrayList" />
        <typeAlias alias="LinkedList" type="java.util.LinkedList" />
    </typeAliases>
</configuration>
表users查询配置文件User.xml
新建文件夹 resouce/mybatis/mapper,新建文件:User.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="com.mall.MallWeb.mapper.UserMapper" >
    <resultMap id="BaseResultMap" type="com.mall.MallWeb.model.User" >
        <id column="id" property="id" jdbcType="BIGINT" />
        <result column="name" property="name" jdbcType="VARCHAR" />
        <result column="password" property="password" jdbcType="VARCHAR" />
        <result column="phoneNumber" property="phoneNumber" jdbcType="VARCHAR"/>
        <result column="money" property="money" jdbcType="BIGINT" />
    </resultMap>
    <sql id="Base_Column_List" >
        id, name, password, phoneNumber, money
    </sql>
    <insert id="add" parameterType="com.mall.MallWeb.mapper.UserMapper" useGeneratedKeys="true" keyProperty="id">
        INSERT INTO
            users
            (name, password, phoneNumber, money)
        VALUES
            (#{name}, #{password}, #{phoneNumber}, #{money})
    </insert>
    <update id="update" parameterType="com.mall.MallWeb.model.User">
        UPDATE
            users
        SET
        <trim suffixOverrides="," suffix="WHERE id = #{id}">
            <if test="name != null">name = #{name},</if>
            <if test="password != null">password = #{password},</if>
            <if test="phoneNumber != null">phoneNumber = #{phoneNumber},</if>
            <if test="money != null">money = #{money},</if>
        </trim>
    </update>
    <select id="queryAll" resultMap="BaseResultMap">
        SELECT
            <include refid="Base_Column_List" />
        FROM users
    </select>
    <select id="queryOne" resultType="com.mall.MallWeb.model.User" parameterType="java.lang.Long">
        SELECT
            <include refid="Base_Column_List" />
        FROM users
            WHERE id = #{id}
    </select>
</mapper>
测试文件UserMapperTest
大致打代码如下:
在Junit5中没有了RunWith,换成了ExtendWith。测试中使用了真实的数据库,所有开启了测试后的数据回滚,避免测试数据进入数据库
package com.mall.MallWeb.mapper;
import com.mall.MallWeb.model.User;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
@ExtendWith(SpringExtension.class)
@SpringBootTest
public class UserMapperTest {
    @Autowired
    private UserMapper userMapper;
    @Test
    @Transactional
    public void addUserTest() {
        User user = new User("testUser", "testPassword", "testPhone");
        userMapper.add(user);
        assert userMapper.queryAll().size() != 0;
    }
    @Test
    public void queryTest() {
        List<User> users = userMapper.queryAll();
        assert users.size() != 0;
        for (User user: users) {
            System.out.println(user.toString());
        }
    }
    @Test
    @Transactional
    public void updateTest() {
        User user = new User("testUser", "testPassword", "testPhone");
        userMapper.add(user);
        System.out.println(user.toString());
        User newUser = userMapper.queryOne(user.getId());
        System.out.println(newUser.toString());
        newUser.setName("updateUser");
        System.out.println(newUser.toString());
        userMapper.update(newUser);
        System.out.println(newUser.toString());
        User queryUser = userMapper.queryOne(user.getId());
        assert queryUser.getName().equals("updateUser");
    }
}
controllers目录下视图文件:UserController.java
package com.mall.MallWeb.controllers;
import com.mall.MallWeb.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
/**
 * 用户
 */
@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserMapper userMapper;
    @GetMapping("/users")
    public Map users() {
        Map response = new HashMap();
        response.put("status", "success");
        response.put("users", userMapper.queryAll());
        return response;
    }
}
启动与测试
现在开始运行程序,使用浏览器访问链接:http://localhost:8080/user/users
能看到有数据或者没有数据都是成功的(下面的数据是提前插入的)
{
    "users": [
        {
            "id": 6,
            "name": "testUser",
            "password": "testPasspword",
            "phoneNumber": "testPhone",
            "money": 0
        },
        {
            "id": 7,
            "name": "testUser",
            "password": "testPasspword",
            "phoneNumber": "testPhone",
            "money": 0
        },
        {
            "id": 8,
            "name": "testUser",
            "password": "testPasspword",
            "phoneNumber": "testPhone",
            "money": 0
        },
        {
            "id": 9,
            "name": "testUser",
            "password": "testPasspword",
            "phoneNumber": "testPhone",
            "money": 0
        },
        {
            "id": 10,
            "name": "testUser",
            "password": "testPassword",
            "phoneNumber": "testPhone",
            "money": 0
        },
        {
            "id": 11,
            "name": "testUser",
            "password": "testPassword",
            "phoneNumber": "testPhone",
            "money": 0
        },
        {
            "id": 12,
            "name": "testUser",
            "password": "testPassword",
            "phoneNumber": "testPhone",
            "money": 0
        }
    ],
    "status": "success"
}
参考链接
- Spring boot 启动报错-Reason Failed to determine a suitable driver class
- java连接mysql失败Path does not chain with any of the trust anchors
- SpringBoot+Mybatis框架项目的单元测试和集成测试(下)
- Spring Boot(六):如何优雅的使用 Mybatis
- mybatis-spring-boot-test-autoconfigure
- Idea inspects batis mapper bean wrong
- Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required in spring mock mvc test for spring boot with mybatis
- mybatis传入多个参数
- MyBatis多参数传递之Map方式示例——MyBatis学习笔记之十三
- MyBatis多参数传递的四种方式
- Mybatis 开启控制台打印sql语句
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号