摘要

最近将微人事这个开源项目进行了复现,这篇文章记录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-持久层的更多相关文章

  1. MyBatis持久层框架学习之01 MyBatis的起源和发展

    一.MyBatis的简介  MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.    MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集. MyB ...

  2. MyBatis持久层框架使用总结 转载

    MyBatis持久层框架使用总结   MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google co ...

  3. MyBatis持久层框架使用总结

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

  4. 预研报告——MyBatis持久层的demo

    一.预研任务介绍和预研目标 任务介绍: 与 Hibernate 相比, MyBatis 是一个半自动化的持久层框架,以轻量级.效率高.原生代而好评如潮.虽然有在分享会上大致讲解,但是还是重新梳理成文字 ...

  5. Spring集成MyBatis持久层框架

    一.MyBatis介绍 MyBatis 是一款优秀的持久层框架,它支持定制化SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的JDBC代码和手动设置参数以及获取结果集,可以使用简单的XML ...

  6. spring-boot+mybatis开发实战:如何在spring-boot中使用myabtis持久层框架

    前言: 本项目基于maven构建,使用mybatis-spring-boot作为spring-boot项目的持久层框架 spring-boot中使用mybatis持久层框架与原spring项目使用方式 ...

  7. Mybatis(一):手写一套持久层框架

    作者 : 潘潘 未来半年,有幸与导师们一起学习交流,趁这个机会,把所学所感记录下来. 「封面图」 自毕业以后,自己先创业后上班,浮沉了近8年,内心着实焦躁,虽一直是走科班路线,但在技术道路上却始终没静 ...

  8. 微人事 star 数超 10k,如何打造一个 star 数超 10k 的开源项目

    看了下,微人事(https://github.com/lenve/vhr)项目 star 数超 10k 啦,松哥第一个 star 数过万的开源项目就这样诞生了. 两年前差不多就是现在这个时候,松哥所在 ...

  9. spring boot V部落 V人事项目

    公司倒闭 1 年多了,而我在公司倒闭时候做的开源项目,最近却上了 GitHub Trending,看着这个数据,真是不胜唏嘘. 缘起 2017 年 11 月份的时候,松哥所在的公司因为经营不善要关门了 ...

随机推荐

  1. Python之matplotlib画图

    折线图: Matplotlib处理csv文件 这里写两个其他的. 柱状图,柱状图个人喜欢用pygal来画,有两篇文章 - Pygal之掷骰子 和 pygal之掷骰子 - 2颗面数为6的骰子.下面用ma ...

  2. Collection集合重难点梳理,增强for注意事项和三种遍历的应用场景,栈和队列特点,数组和链表特点,ArrayList源码解析, LinkedList-源码解析

    重难点梳理 使用到的新单词: 1.collection[kəˈlekʃn] 聚集 2.empty[ˈempti] 空的 3.clear[klɪə(r)] 清除 4.iterator 迭代器 学习目标: ...

  3. Js 添加cookie,写入cookie到主域

    if (getCookie("content") != null && getCookie("content") != "" ...

  4. arp欺骗(理论)

    ARP(地址解析协议)在IPv4和以太网的广泛应用,其主要用作将IP地址翻译为以太网的MAC地址. 一.ARP通讯协议过程 局域网的通信不是根据IP地址进行,计算机是根据mac地址来识别一台机器. 每 ...

  5. 创建Web Service项目

    使用AXIS框架   idea方式: 创建后 加入axis依赖包到输出目录,idea也会提示你进行这步操作 项目启动后访问 http://localhost:8080/AxisWebService/s ...

  6. java 的IO类库的基本架构

    java IO 操作的类在java.io 包中,大概可以分为以下几组: 基于字节操作的接口:InputStream 和 OutputStream 基于字符操作的接口:Writer 和 Reader 基 ...

  7. mybatis实现MySQL数据库的增删改查之二

    这里直接附上代码: 1 package com.qijian.pojo; 2 3 import org.apache.ibatis.type.Alias; 4 5 6 public class Use ...

  8. 配置 nginx 访问资源目录,nginx配置 root 与 alias 的区别

    比如说想要把 /home/source 目录作为资源目录,那么需要如下配置: location /source/ { #识别url路径后,nginx会到/home/文件路径下,去匹配/source r ...

  9. Trick:如何去掉html标签点击时的蓝色边框

    我们在用html标签时,如input.button.select,img标签时,点击标签经常出现一个蓝色的边框,这个边框真的很low,想要去掉怎么办   其实,css有样式可以设置一下,这个问题就轻松 ...

  10. java左移右移运算符详解

    在阅读源码的过程中,经常会看到这些符号<< ,>>,>>>,这些符号在Java中叫移位运算符,在写代码的过程中,虽然我们基本上不会去写这些符号,但需要明白这些 ...