前面的文章介绍了
Spring Boot整合JPA
实现数据库的访问功能,这里再次介绍Spring Boot整合Mybatis实现数据的增删改查功能。
一、Maven依赖
这里贴出Spring Boot整合Mybatis
的完整pom.xml
文件代码:
4.0.0
springboot.example
springboot-mybatis
1.0-SNAPSHOT
jar
Spring Boot整合Mybatis案例
org.springframework.boot
spring-boot-starter-parent
1.5.9.RELEASE
UTF-8
UTF-8
1.8
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-test
test
org.springframework.boot
spring-boot-devtools
runtime
mysql
mysql-connector-java
runtime
org.springframework.boot
spring-boot-starter-data-jpa
org.projectlombok
lombok
com.alibaba
druid
1.1.6
org.mybatis.spring.boot
mybatis-spring-boot-starter
1.3.1
org.springframework.boot
spring-boot-maven-plugin
这里不仅整合了Mybatis
,还集成了Druid
连接池。观察上面的依赖,我还加入了lombok
插件依赖,这个已经被集成到了Spring Boot
中,它可以动态地生成实体类的getter
和setter
等方法,使得实体类更加简洁,继续往下看,你会发现我的实体类没有getter
和setter
等方法,那是因为我加入了@Data
注解,它会运行是创建getter
和setter
等方法。不明白的可以百度搜索一下lombok
的用法,在使用它的时候,你的IDE必须得安装它的插件,如果你嫌麻烦,直接手动删除依赖,删除实体类的@Data
注解,使用IDE生成getter
和setter
等方法。
二、配置文件
spring:
profiles:
active: dev # 启用开发配置
---
# 开发配置
spring:
profiles: dev
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: Asia/Chongqing
# 数据库配置
datasource:
driverClassName: com.mysql.jdbc.Driver
url: jdbc:mysql://192.168.25.1:3306/test?characterEncoding=utf8
username: root
password: root
# 配置Durid连接池
type: com.alibaba.druid.pool.DruidDataSource
jpa:
database: MYSQL
show-sql: true
hibernate:
ddl-auto: update
properties:
hibernate:
dialect: org.hibernate.dialect.MySQL5Dialect
server:
port: 8080
这里配置JPA仅仅是为了启动项目的时候会自动根据实体类到数据库中创建相应的表,没有其他作用,实际项目中应该将其去掉。
三、主要代码
1 主程序
package com.lemon.springboot.application;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
/**
* @author lemon
* @date 2018/1/4 下午9:24
*/
@SpringBootApplication
@EnableAutoConfiguration
@EntityScan(basePackages = {"com.huangtianci.entity"})
@MapperScan(basePackages = {"com.huangtianci.dao"})
public class MainApplication {
public static void main(String[] args) {
SpringApplication.run(MainApplication.class, args);
}
}
因为需要使用JPA自动生成表,所以加上了@EntityScan
注解,@MapperScan
用来扫描mapper
类。
2 实体类
package com.lemon.springboot.entity;
import lombok.Data;
import javax.persistence.*;
/**
* @author lemon
* @date 2018/1/4 下午9:27
*/
@Data
@Entity
@Table(name = "product")
public class Product {
@Id
@GeneratedValue
@Column(name = "product_id")
private Integer productId;
@Column(name = "product_name")
private String productName;
@Column(name = "product_stock")
private Integer productStock;
}
@Data
注解可以动态为实体类生成getter
和setter
等方法。
3 Mapper类
package com.lemon.springboot.dao;
import com.lemon.springboot.entity.Product;
import org.apache.ibatis.annotations.*;
import java.util.List;
import java.util.Map;
/**
* Mybatis接口
*
* @author lemon
* @date 2018/1/3 下午10:06
*/
public interface ProductMapper {
/**
* 按照map方式插入数据,map是键值对,插入的时候#{}里面的值将从map中取
*
* @param map 需要插入的数据
* @return 插入成功返回1,失败返回0
*/
@Insert("insert into product(product_name, product_stock) values(#{product_name, jdbcType=VARCHAR}, #{product_stock, jdbcType=INTEGER})")
int insertByMap(Map map);
/**
* 直接根据对象属性来进行插入,也就是说直接插入对象到数据库,要保持字段和SQL语句内的预留字段一致
*
* @param product 商品对象
* @return 插入成功返回1,失败返回0
*/
@Insert("insert into product(product_name, product_stock) values(#{productName, jdbcType=VARCHAR}, #{productStock, jdbcType=INTEGER})")
int insertByObject(Product product);
/**
* 根据ID来查询商品,由于ID是独一唯二的,所以只会查询到一条数据或者0条,用Product对象来接收数据,
* 注意:接收数据要进行映射才可以接收成功,用Results注解来映射
*
* @param productId 商品ID
* @return Product对象
*/
@Select("select * from product where product_id = #{productId}")
@Results({
@Result(column = "product_id", property = "productId"),
@Result(column = "product_name", property = "productName"),
@Result(column = "product_stock", property = "productStock")
})
Product findByProductId(Integer productId);
/**
* 当商品名字重复是时候,我们根据商品名字查询,将查询到多条数据,这时候应该使用List来接收数据
*
* @param productName 商品名字
* @return 商品的集合
*/
@Select("select * from product where product_name = #{productName}")
@Results({
@Result(column = "product_id", property = "productId"),
@Result(column = "product_name", property = "productName"),
@Result(column = "product_stock", property = "productStock")
})
List findByProductName(String productName);
/**
* 根据一个字段ID来修改商品名称,当传入多个参数的时候,需要使用@Param注解来是SQL语句中名字和参数名字一致,这样就不会出错
*
* @param productId 商品ID
* @param productName 商品名称
* @return 更新成功返回1,失败返回0
*/
@Update("update product set product_name = #{productName} where product_id = #{productId}")
int updateByProductId(@Param("productId") Integer productId, @Param("productName") String productName);
/**
* 根据一个对象来更新数据
*
* @param product 商品对象
* @return 更新成功返回1,失败返回0
*/
@Update("update product set product_name = #{productName} where product_id = #{productId}")
int updateByObject(Product product);
/**
* 根据ID来删除记录,也可以根据对象来删除,道理和上面的更新一致
*
* @param productId 商品ID
* @return 删除成功返回1,失败返回0
*/
@Delete("delete from product where product_id = #{productId}")
int deleteByProductId(Integer productId);
}
这个接口实现了简单的增删改查,具体使用方法,一看就明白,注释很清楚。
四、测试
这里做出了简单的测试类:
package com.lemon.springboot.dao;
import com.lemon.springboot.application.MainApplication;
import com.lemon.springboot.entity.Product;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author lemon
* @date 2018/1/4 下午9:30
*/
@RunWith(SpringRunner.class)
@SpringBootTest(classes = MainApplication.class)
public class ProductMapperTest {
@Autowired
private ProductMapper mapper;
@Test
public void insertByMap() {
Map map = new HashMap<>();
map.put("product_name", "apple");
map.put("product_stock", 200);
int result = mapper.insertByMap(map);
// 下面这一句是检测返回结果是否为1,不为1将报错
Assert.assertEquals(1, result);
}
@Test
public void insertByObject() {
Product product = new Product();
product.setProductName("banana");
product.setProductStock(10);
int result = mapper.insertByObject(product);
// 下面这一句是检测返回结果是否为1,不为1将报错
Assert.assertEquals(1, result);
}
@Test
public void findByProductId() {
Product result = mapper.findByProductId(1);
System.out.println(result);
Assert.assertNotNull(result);
}
@Test
public void findByProductName() {
// 由于前面只插入了一个名字为apple的商品,请你在运行这个案例之前在运行一下第一个或者第二个例子,你设置名字还是apple,库存改一下,这样数据库就有两条数据了,方便测试
List result = mapper.findByProductName("apple");
System.out.println("一共查询的数据条数是:" + result.size());
Assert.assertNotEquals(0, result.size());
}
@Test
public void updateByProductId() {
// 将第一条记录的名字由apple改成orange橙子
int result = mapper.updateByProductId(1, "orange");
Assert.assertNotEquals(0, result);
}
@Test
public void updateByObject() {
// 我们将第一条记录的名字修改成火龙果
Product product = new Product();
product.setProductId(1);
product.setProductName("pitaya");
int result = mapper.updateByObject(product);
// 下面这一句是检测返回结果是否为1,不为1将报错
Assert.assertEquals(1, result);
}
@Test
public void deleteByProductId() {
int result = mapper.deleteByProductId(1);
Assert.assertEquals(1, result);
}
}
这个测试类最好从第一个案例依个测试。
该案例的简单项目已经放到了码云上,欢迎下载。
请看另一篇:Spring Boot整合JPA实现数据的增删改查。