微人事项目-mybatis-持久层
摘要
最近将微人事这个开源项目进行了复现,这篇文章记录mybaits访问数据库这一块。
其中MyBatis是一个流行的持久层框架,支持自定义SQL、存储过程和高级映射。MyBatis消除了几乎所有的JDBC代码、手动设置参数和检索结果。MyBatis可以使用简单的XML或注释进行配置,实现对数据库的访问。
项目结构

- 其中mapper是持久层,model是实体类,service是逻辑层,web是表现层。
model和mapper
首先需要定义实体类:

具体如下:
public class Department implements Serializable {
private Integer id;
private String name;
private Integer parentId;
private String depPath;
private Boolean enabled;
private Boolean isParent;
//注意
private List<Department> children = new ArrayList<>();
private Integer result;
//getter and setter()
//...
}
再来看数据库中的数据:

从表中,我们看到表中的列并没有完全包含Department类中的所有成员变量,那是怎样实现的了?这就要看看mapper是怎样实现的了。

从图中可以看到,在mapper层中采用了接口和xml文件的方式访问数据库,没有使用注解的方式。
其中DepartmentMapper接口中定义了诸如删除、插入和更新等操作数据库的方法。
public interface DepartmentMapper {
int deleteByPrimaryKey(Integer id);
int insert(Department record);
int insertSelective(Department record);
Department selectByPrimaryKey(Integer id);
int updateByPrimaryKeySelective(Department record);
int updateByPrimaryKey(Department record);
List<Department> getAllDepartmentsByParentId(Integer pid);
void addDep(Department dep);
void deleteDepById(Department dep);
List<Department> getAllDepartmentsWithOutChildren();
}
接着来看看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的路径。
<mapper namespace="com.codexwj.vhr03.mapper.DepartmentMapper">
//这里注意,在上面的数据表中不完全包含实体类Department中的成员变量,那在这里就需要定义数据表中需要有哪些列了。
<resultMap id="BaseResultMap" type="com.codexwj.vhr03.model.Department">
<id column="id" property="id" jdbcType="INTEGER"/>
<result column="name" property="name" jdbcType="VARCHAR"/>
<result column="parentId" property="parentId" jdbcType="INTEGER"/>
<result column="depPath" property="depPath" jdbcType="VARCHAR"/>
<result column="enabled" property="enabled" jdbcType="BIT"/>
<result column="isParent" property="isParent" jdbcType="BIT"/>
</resultMap>
//这里把children这个属性添加到DepartmentWithChildren中,它是继承于BaseResultMap的。
<resultMap id="DepartmentWithChildren" type="com.*.model.Department" extends="BaseResultMap">
<collection property="children" ofType="com.*.model.Department" select="com.*.mapper.DepartmentMapper.getAllDepartmentsByParentId" column="id"/>
</resultMap>
//表明数据表的列有哪些
<sql id="Base_Column_List">
id, name, parentId, depPath, enabled, isParent
</sql>
// 这里进行数据输出的时候只访问包含于Base_Column_List的数据。
<select id="getAllDepartmentsWithOutChildren" resultMap="BaseResultMap">
select
<include
refid="Base_Column_List">
</include>
from department;
</select>
// 对传入的值进行非空判断,并且只对非空的值进行赋值。
<insert id="insertSelective" parameterType="com.codexwj.vhr03.model.Department">
insert into department
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="id != null">
id,
</if>
<if test="name != null">
name,
</if>
<if test="parentId != null">
parentId,
</if>
<if test="depPath != null">
depPath,
</if>
<if test="enabled != null">
enabled,
</if>
<if test="isParent != null">
isParent,
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="id != null">
#{id,jdbcType=INTEGER},
</if>
<if test="name != null">
#{name,jdbcType=VARCHAR},
</if>
<if test="parentId != null">
#{parentId,jdbcType=INTEGER},
</if>
<if test="depPath != null">
#{depPath,jdbcType=VARCHAR},
</if>
<if test="enabled != null">
#{enabled,jdbcType=BIT},
</if>
<if test="isParent != null">
#{isParent,jdbcType=BIT},
</if>
</trim>
</insert>
//同理insertSelective
<update id="updateByPrimaryKeySelective" parameterType="com.codexwj.vhr03.model.Department">
update department
<set>
<if test="name != null">
name = #{name,jdbcType=VARCHAR},
</if>
<if test="parentId != null">
parentId = #{parentId,jdbcType=INTEGER},
</if>
<if test="depPath != null">
depPath = #{depPath,jdbcType=VARCHAR},
</if>
<if test="enabled != null">
enabled = #{enabled,jdbcType=BIT},
</if>
<if test="isParent != null">
isParent = #{isParent,jdbcType=BIT},
</if>
</set>
where id = #{id,jdbcType=INTEGER}
</update>
思路: 先定义实体类,建立mapper接口,利用xml文件进行配置实现对数据库的增删查改。
如有错误,欢迎指正
微人事项目-mybatis-持久层的更多相关文章
- MyBatis持久层框架学习之01 MyBatis的起源和发展
一.MyBatis的简介 MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架. MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集. MyB ...
- MyBatis持久层框架使用总结 转载
MyBatis持久层框架使用总结 MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google co ...
- MyBatis持久层框架使用总结
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis . 2 ...
- 预研报告——MyBatis持久层的demo
一.预研任务介绍和预研目标 任务介绍: 与 Hibernate 相比, MyBatis 是一个半自动化的持久层框架,以轻量级.效率高.原生代而好评如潮.虽然有在分享会上大致讲解,但是还是重新梳理成文字 ...
- Spring集成MyBatis持久层框架
一.MyBatis介绍 MyBatis 是一款优秀的持久层框架,它支持定制化SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的JDBC代码和手动设置参数以及获取结果集,可以使用简单的XML ...
- spring-boot+mybatis开发实战:如何在spring-boot中使用myabtis持久层框架
前言: 本项目基于maven构建,使用mybatis-spring-boot作为spring-boot项目的持久层框架 spring-boot中使用mybatis持久层框架与原spring项目使用方式 ...
- Mybatis(一):手写一套持久层框架
作者 : 潘潘 未来半年,有幸与导师们一起学习交流,趁这个机会,把所学所感记录下来. 「封面图」 自毕业以后,自己先创业后上班,浮沉了近8年,内心着实焦躁,虽一直是走科班路线,但在技术道路上却始终没静 ...
- 微人事 star 数超 10k,如何打造一个 star 数超 10k 的开源项目
看了下,微人事(https://github.com/lenve/vhr)项目 star 数超 10k 啦,松哥第一个 star 数过万的开源项目就这样诞生了. 两年前差不多就是现在这个时候,松哥所在 ...
- spring boot V部落 V人事项目
公司倒闭 1 年多了,而我在公司倒闭时候做的开源项目,最近却上了 GitHub Trending,看着这个数据,真是不胜唏嘘. 缘起 2017 年 11 月份的时候,松哥所在的公司因为经营不善要关门了 ...
随机推荐
- Numpy的学习2-基础运算1
import numpy as np a=np.array([10,20,30,40]) # array([10, 20, 30, 40]) b=np.arange(4) # array([0, 1, ...
- Spring Cloud Alibaba基础教程-Nacos(二)
在Spring Cloud Alibaba基础教程-Nacos(一)当中学习了,如何从 nacos当中 通过Java的方式获取值,以及连接数据库,下面我们开始第二篇的学习 ,如果对你有帮助,方便下次寻 ...
- JavaEE在职加薪课好客租房项目实战视频教程
JavaEE在职加薪课好客租房项目实战视频教程课程介绍: 本课程采用SOA架构思想进行设计,基于目前主流后端技术框架SpringBoot.SpringMVC.Mybaits.Dubbo等来 ...
- 将.Net Core发布至Docker,并连接 Redis、上传文件到本机、连接sqlserver数据库
此片文章目标是将 .Net Core 发布到 Docker 上,并且连接到在 Docker上的 Redis .上传文件到本机文件夹和连接 sqlserver 数据库. 创建项目 创建项目就不用说了,我 ...
- Redis基础篇(三)持久化:AOF日志
Redis是内存数据库,但是一旦服务器宕机,内存中的数据将会全部丢失. 最简单的恢复方式是从后端数据库恢复,但这种方式有两个问题: 频繁访问数据库,会给数据库带来巨大的压力: 从数据库中读取相比从Re ...
- [leetcode]House Robber1,2
/** * 一. * You are a professional robber planning to rob houses along a street.Each house has a cert ...
- Hadoop支持的压缩格式对比和应用场景以及Hadoop native库
对于文件的存储.传输.磁盘IO读取等操作在使用Hadoop生态圈的存储系统时是非常常见的,而文件的大小等直接影响了这些操作的速度以及对磁盘空间的消耗. 此时,一种常用的方式就是对文件进行压缩.但文件被 ...
- python在线练习
不管学习那门语言都希望能做出实际的东西来,这个实际的东西当然就是项目啦,不用多说大家都知道学编程语言一定要做项目才行. 这里整理了70个Python实战项目列表,都有完整且详细的教程,你可以从中选择自 ...
- redis系列:分布式锁
redis系列:分布式锁 1 介绍 这篇博文讲介绍如何一步步构建一个基于Redis的分布式锁.会从最原始的版本开始,然后根据问题进行调整,最后完成一个较为合理的分布式锁. 本篇文章会将分布式锁的实现分 ...
- vue调起微信扫一扫
vue调起微信扫一扫,两个注意的点 1.url必须是不带参的地址栏,如果传了带参数的地址url有可能会出现安卓机能调,苹果机报错或者安卓和苹果都报错 2.this指代问题在vx.ready等等方法里面 ...