MyBatis 是一款标准的 ORM 框架,被广泛的应用于各企业开发中。具体细节这里就不在叙述,大家自行查找资料进行学习下。

加载依赖

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

application 配置(application.yml)

mybatis:
config-location: classpath:mybatis/mybatis-config.xml
mapper-locations: classpath:mybatis/mapper/*.xml
type-aliases-package: com.zhb.entity
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8
password: root
username: root

启动类

在启动类中添加对 Mapper 包扫描@MapperScan,Spring Boot 启动的时候会自动加载包路径下的 Mapper。

@Spring BootApplication
@MapperScan("com.zhb.mapper")
public class Application { public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}

或者直接在 Mapper 类上面添加注解@Mapper,建议使用上面那种,不然每个 Mapper 加个注解会很麻烦。

代码展示

这里只说下,我们在controller 中 尽量使用 Restful 风格

@RestController
public class UserController { @Resource
private UserMapper userMapper; @GetMapping(value = "/users")
public List<UserEntity> getUsers() {
List<UserEntity> users=userMapper.getAll();
return users;
} @GetMapping(value = "/users/{id}")
public UserEntity getUser(@PathVariable(value = "id") Long id) {
UserEntity user=userMapper.getOne(id);
return user;
} @PostMapping("/users")
public void save(UserEntity user) {
userMapper.insert(user);
} @PutMapping("/users")
public void update(UserEntity user) {
userMapper.update(user);
} @DeleteMapping(value="/users/{id}")
public void delete(@PathVariable("id") Long id) {
userMapper.delete(id);
} }

实际开发常遇问题

在平常开发中,我们经常会遇到返回树结构,如下展示

[
{
"id": "1",
"name": "山东",
"pid": "0",
"children": [
{
"id": "2",
"name": "济南",
"pid": "1",
"children": [
{
"id": "3",
"name": "高新区",
"pid": "2",
"children": null
}
]
}
]
}
]
(1) java中 通过对list数据进行拼接成树

如下面的方法(这里直接声明了list,往里面添加数据,来演示查询出的list集合)

@GetMapping(value = "/area")
public List<AreaTreeEntity> get(){ List<AreaTreeEntity> res= new ArrayList<>();
Map<String,List<AreaTreeEntity>> childMap = new HashMap<>(16); //为了方便测试,构建list数据
List<AreaTreeEntity> s = new ArrayList<>();
AreaTreeEntity a = new AreaTreeEntity();
a.setId("1");
a.setName("山东");
a.setPid("0");
s.add(a); AreaTreeEntity a1 = new AreaTreeEntity();
a1.setId("2");
a1.setName("济南");
a1.setPid("1");
s.add(a1); AreaTreeEntity a2 = new AreaTreeEntity();
a2.setId("3");
a2.setName("高新区");
a2.setPid("2");
s.add(a2); for(AreaTreeEntity entity : s){ if ("0".equals(entity.getPid())) { res.add(entity);
}
else { List<AreaTreeEntity> childList = (childMap.containsKey(entity.getPid())) ? childMap.get(entity.getPid()) : new ArrayList<>();
childList.add(entity); if (!childMap.containsKey(entity.getPid())){
childMap.put(entity.getPid(),childList);
}
}
} for(AreaTreeEntity entity : res){
findChild(entity,childMap);
} return res;
} public void findChild(AreaTreeEntity entity,Map<String,List<AreaTreeEntity>> childMap){ if (childMap.containsKey(entity.getId())){
List<AreaTreeEntity> chidList = childMap.get(entity.getId());
for (AreaTreeEntity childEntity : chidList){
findChild(childEntity,childMap);
}
entity.setChildren(chidList);
}
}

经过验证,返回数据如下

[
{
"id": "1",
"name": "山东",
"pid": "0",
"children": [
{
"id": "2",
"name": "济南",
"pid": "1",
"children": [
{
"id": "3",
"name": "高新区",
"pid": "2",
"children": null
}
]
}
]
}
]
(2) 使用mabatis的collection 直接查询出树结构

<mapper namespace="com.zhb.mapper.AreaTreeMapper" >
<resultMap id="TreeResultMap" type="com.zhb.entity.AreaTreeEntity" >
<result column="id" property="id" jdbcType="VARCHAR" />
<result column="name" property="name" jdbcType="VARCHAR" />
<collection property="children" column="id" ofType="com.zhb.entity.AreaTreeEntity" javaType="ArrayList" select="selectChildrenById"/>
</resultMap> <select id="getAreaTree" resultMap="TreeResultMap">
select id,name from area where parent_id = '0'
</select> <select id="selectChildrenById" parameterType="java.lang.String" resultMap="TreeResultMap">
select id,name from area where parent_id = #{id}
</select> </mapper>

完整代码下载:github

注:项目中加入swagger ,方便大家测试,直接访问 http://localhost:8080/swagger-ui.html

SpringBoot(九)_springboot集成 MyBatis的更多相关文章

  1. SpringBoot系列之集成Mybatis教程

    SpringBoot系列之集成Mybatis教程 环境准备:IDEA + maven 本博客通过例子的方式,介绍Springboot集成Mybatis的两种方法,一种是通过注解实现,一种是通过xml的 ...

  2. SpringBoot学习之集成mybatis

    一.spring boot集成Mybatis gradle配置: //gradle配置: compile("org.springframework.boot:spring-boot-star ...

  3. SpringBoot(十)_springboot集成Redis

    Redis 介绍 Redis是一款开源的使用ANSI C语言编写.遵守BSD协议.支持网络.可基于内存也可持久化的日志型.Key-Value高性能数据库. 数据模型 Redis 数据模型不仅与关系数据 ...

  4. SpringBoot(八)_springboot集成swagger2

    swagger是一个功能强大的api框架,它的集成非常简单,不仅提供了在线文档的查阅,而且还提供了在线文档的测试. (1) 引入依赖,我们选择现在最新的版本 <dependency> &l ...

  5. springboot 零xml集成mybatis

    maven依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="htt ...

  6. springboot之集成mybatis mongo shiro druid redis jsp

    闲来无事,研究一下spingboot  发现好多地方都不一样了,第一个就是官方默认不支持jsp  于是开始狂找资料  终于让我找到了 首先引入依赖如下: <!-- tomcat的支持.--> ...

  7. springboot集成mybatis(二)

    上篇文章<springboot集成mybatis(一)>介绍了SpringBoot集成MyBatis注解版.本文还是使用上篇中的案例,咱们换个姿势来一遍^_^ 二.MyBatis配置版(X ...

  8. springboot集成mybatis(一)

    MyBatis简介 MyBatis本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation迁移到了google code,并且改名为MyB ...

  9. SpringBoot 集成Mybatis 连接Mysql数据库

    记录SpringBoot 集成Mybatis 连接数据库 防止后面忘记 1.添加Mybatis和Mysql依赖 <dependency> <groupId>org.mybati ...

随机推荐

  1. js中两种定时器的设置及清除

    1.循环执行: var timeid = window.setInterval(“方法名或方法”,“延时”); window.clearInterval(timeid); <script typ ...

  2. P4438 [HNOI/AHOI2018]道路

    辣稽题目 毁我青春 耗我钱财. 设\(f[x][i][j]\)为从1号点走到x点经过i条公路j条铁路,子树的最小代价. \(f[leaf][i][j]=(A+i)(B+j)C\) \(f[x][i][ ...

  3. pathon之多线程详解

    一.线程理论 1.什么是线程 线程指的是一条流水线的工作过程 进程根本就不是一个执行单位,进程其实是一个资源单位--------将资源集合到一起: 一个进程内自带一个线程,线程才是CPU上的执行单位 ...

  4. 菜鸟vimer成长记——第1章、统一概念

    不管学什么技术,我都深信概念是最重要的.是影响整个学习轨迹,决定能在这个技术领域高度. 当然如果你现在的目的不是在学习而在于解决问题(很多人不愿意承认,或者没发现),那概念就暂时没那么重要了. 目的 ...

  5. Laya中的Image、Texture、WebGLImage

    Image Image是Laya的一个UI组件,继承自Component. Image.bitmap属性,是AutoBitmap类型:AutoBitmap继承自Graphics,负责处理图片九宫格逻辑 ...

  6. Unity_屏幕/Viewport/世界坐标的转换

    Unity_屏幕/Viewport/世界/UI坐标的转换 参考: https://www.jianshu.com/p/b5b6ac9ab145 -- 世界.视口.屏幕坐标转换 https://docs ...

  7. shell中与运算 cut切分行 if while综合在一起的一个例子

    前言: 公司要统计 treasury库hive表磁盘空间,写了个脚本,如下: 查询hive仓库表占用hdfs文件大小: hadoop fs -du -h  /user/hive/warehouse/t ...

  8. Linux下出现permission denied的解决办法

    Linux下经常出现permission denied,原因是由于权限不足,有很多文章通过chmod命令更改权限为777,但是很不方便也不适合新手,简单粗暴的方法如下: 命令行中输入 sudo pas ...

  9. 关于java调用Dll文件的异常 %1 不是有效的 Win32 应用程序。

    这个问题 将java的和编辑器都换成32位

  10. CocoStuff—基于Deeplab训练数据的标定工具【一、翻译】(未完)

    一.CocoStuff简介 CocoStuff是一款为deeplab设计的,运行在Matlab中的语义标定工具,其标定结果和结合Deeplab训练出的结果均为mat文件格式,该项目源码已在github ...