前言

DAO(Data Access Object) 是数据访问层,说白了就是跟数据库打交道的,而数据库都有哪几种操作呢?没错,就是增删改查。这就意味着Dao层要提供增删改查操作。

不知道大家是怎么写Dao层的接口的。如果你没有一个好的思路,那就看看我的思路吧。如果你有更好的思路,欢迎指正。

正文

1.每一个实体类对应一个Dao接口文件和一个mybatis文件

结构如下:

2.UserDao采用统一写法

Dao层只写六个接口就能解决百分之九十的问题

User.java

package com.example.demo.entity;

public class User {
private Long id;
private String username;
private String password;
private String realname; public Long getId() {
return id;
} public void setId(Long id) {
this.id = id;
} public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
} public String getRealname() {
return realname;
} public void setRealname(String realname) {
this.realname = realname;
} @Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
", realname='" + realname + '\'' +
'}';
}
}

UserDao.java

package com.example.demo.dao;

import com.example.demo.entity.User;
import org.apache.ibatis.annotations.Param; import java.util.List; public interface UserDao {
// 用于添加用户
int insertUser(User user); // 用于删除用户
int deleteUser(Long userId); // 用于更新用户
int updateUser(User user); // 用于查询用户
User getUser(Long userId); // 用于查询用户列表
List<User> getUserList(@Param("userCondition") User userCondition,
@Param("rowIndex") int rowIndex,
@Param("pageSize") int pageSize); // 用于查询用户列表数量
int getUserCount(@Param("userCondition") User userCondition);
}

UserDao.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.example.demo.dao.UserDao"> <insert id="insertUser" parameterType="com.example.demo.entity.User"
useGeneratedKeys="true" keyProperty="id" keyColumn="id">
insert into
tb_user(username,password,realname)
values (#{username},#{password},#{realname})
</insert> <delete id="deleteUser">
delete from
tb_user
where id=#{id}
</delete> <update id="updateUser" parameterType="com.example.demo.entity.User"
keyProperty="id" useGeneratedKeys="true">
update tb_user
<set>
<if test="username != null">username = #{username},</if>
<if test="password != null">password = #{password},</if>
<if test="realname != null">realname = #{realname}</if>
</set>
where id=#{id}
</update> <select id="getUser" resultType="com.example.demo.entity.User" parameterType="Long">
select
u.id,
u.username,
u.password,
u.realname
from tb_user u
where ur.id = #{id}
</select> <select id="getUserList" resultType="com.example.demo.entity.User">
select
u.id,
u.username,
u.password,
u.realname
from tb_user u
<where>
<if test="userCondition != null and userCondition.username != null">
and u.username LIKE concat('%',#{userCondition.username},'%')
</if>
<if test="userCondition != null and userCondition.realname != null">
and u.realname LIKE concat('%',#{userCondition.realname},'%')
</if>
</where>
limit #{rowIndex},#{pageSize};
</select> <select id="getUserCount" resultType="int">
select count(1) from tb_user u
<where>
<if test="userCondition != null and userCondition.username != null">
and u.username LIKE concat('%',#{userCondition.username},'%')
</if>
<if test="userCondition != null and userCondition.realname != null">
and u.realname LIKE concat('%',#{userCondition.realname},'%')
</if>
</where>
</select>
</mapper>
3.使用方法

添加用户

User user = new User();
user.setUsername("lauyon");
user.setRealname("lauyon");
user.setPassword("e10adc3949ba59abbe56e057f20f883e");
int insertCount = userDao.insertUser(user); //返回添加数据的条数

删除用户

int deleteCount = userDao.deleteUser(1L);	//返回删除用户的个数

更新用户

User user = new User();
user.setId(1L); // 注意:与添加用户不同
user.setUsername("lauyon2");
user.setRealname("lauyon2");
user.setPassword("pf2wzmefd3sfgh5dfs6sdf");
int count = userDao.updateUser(user); //返回更新数据的条数

查询用户

User user = userDao.getUser(1L);	//返回用户,参数为用户Id

查询用户列表

int listCount = userDao.getUserCount(userCondition);	//返回给service层,用于封装分页对象
List<User> userList = userDao.getUserList(userCondition, (page - 1) * size, size); //page:页码 size:每页的数据数量

至此,已经列举了基本的增删改查接口。当然,还可以组合出其他接口,可以解决大部分实际问题。

如果这篇博客对你有用,点个赞再走呗~

SpringBoot+MyBatis项目Dao层最简单写法的更多相关文章

  1. SpringBoot Mybatis项目中的多数据源支持

    1.概述 有时项目里里需要抽取不同系统中的数据源,需要访问不同的数据库,本文介绍在Springboot+Mybatis项目中如何支持多数据源操作. 有需要的同学可以下载 示例代码 项目结构如下: 2. ...

  2. Mybatis的dao层实现 接口代理方式实现规范+plugins-PageHelper

    Mybatis的dao层实现 接口代理方式实现规范 Mapper接口实现时的相关规范: Mapper接口开发只需要程序员编写Mapper接口而不用具体实现其代码(相当于我们写的Imp实现类) Mapp ...

  3. Mybatis的Dao层实现原理

    1.Mybatis的Dao层实现 1.1 传统开发方式 1.1.1编写UserDao接口 public interface UserDao { List<User> findAll() t ...

  4. 基于Mybatis的Dao层的开发

    基于Mybatis的Dao层开发 SqlSessionFactoryBuilder用于创建SqlSessionFacoty,SqlSessionFacoty一旦创建完成就不需要SqlSessionFa ...

  5. MyBatis开发Dao层的两种方式(原始Dao层开发)

    本文将介绍使用框架mybatis开发原始Dao层来对一个对数据库进行增删改查的案例. Mapper动态代理开发Dao层请阅读我的下一篇博客:MyBatis开发Dao层的两种方式(Mapper动态代理方 ...

  6. MyBatis开发Dao层的两种方式(Mapper动态代理方式)

    MyBatis开发原始Dao层请阅读我的上一篇博客:MyBatis开发Dao层的两种方式(原始Dao层开发) 接上一篇博客继续介绍MyBatis开发Dao层的第二种方式:Mapper动态代理方式 Ma ...

  7. 基于Mybatis的Dao层开发

    转自:https://www.cnblogs.com/rodge-run/p/6528398.html 基于Mybatis的Dao层开发 SqlSessionFactoryBuilder用于创建 Sq ...

  8. IDEA项目搭建四——使用Mybatis实现Dao层

    一.引入mybatis及mysql的jar包 可以从阿里云上面查找版本,db操作放在dao层所以打开该层的pom.xml文件,找到<dependencies>节点增加两个引入 <de ...

  9. 零基础IDEA整合SpringBoot + Mybatis项目,及常见问题详细解答

    开发环境介绍:IDEA + maven + springboot2.1.4 1.用IDEA搭建SpringBoot项目:File - New - Project - Spring Initializr ...

随机推荐

  1. 简易数据分析 15 | Web Scraper 高级用法——CSS 选择器的使用

    这是简易数据分析系列的第 15 篇文章. 年末事情比较忙,很久不更新了,后台一直有读者催更,我看了一些读者给我的私信,发现一些通用的问题,所以单独写篇文章,介绍一些 Web Scraper 的进阶用法 ...

  2. 【题解】有标号的DAG计数4

    [HZOI 2015] 有标号的DAG计数 IV 我们已经知道了\(f_i\)表示不一定需要联通的\(i\)节点的dag方案,考虑合并 参考[题解]P4841 城市规划(指数型母函数+多项式Ln),然 ...

  3. $Poj3714/AcWing\ Raid$ 分治/平面最近点对

    $AcWing$ $Sol$ 平面最近点对板子题,注意要求的是两种不同的点之间的距离. $Code$ #include<bits/stdc++.h> #define il inline # ...

  4. Appium环境搭建超详细教程

    前言: 本系列教程会从软件的基本安装开始,最终目的是通过完成几个案例后, 大家实现自由抓取App中想要的资源. 本系列以后会更的: Appium基本使用及控制真机及安卓模拟器 Mitmproxy抓包工 ...

  5. Markdown数学符号

    上标 语法: x^2 效果: \(x^2\) 下标 语法: x_i 效果: \(x_i\) 整体 语法: x^{2y} 效果: \(x^{2y}\) 大括号 语法: \{\} 效果: \(\{\}\) ...

  6. 「学习笔记」ST表

    问题引入 先让我们看一个简单的问题,有N个元素,Q次操作,每次操作需要求出一段区间内的最大/小值. 这就是著名的RMQ问题. RMQ问题的解法有很多,如线段树.单调队列(某些情况下).ST表等.这里主 ...

  7. 「Luogu P2508」[HAOI2008]圆上的整点 解题报告

    题面 给定圆的半径,求圆上整点数 这是一道很Nice的数学题!超爱!好吧,由于这道题,我去Study了一下复数(complex number)复杂的数 真棒!!! 有兴趣的戳这里!!!\(\huge ...

  8. 「CF670C」Cinema 解题报告

    题面 传送门 思路: 离散化.hash 对于这样一个明显的统计排序的题目,当然轻而易举啦~ 但是!看!语言的编号 a数组和 b数组的值最大在\(10^9\)的级别,所以开个数组来存---That's ...

  9. cannot insert multiple commands into a prepared statement问题原因及解决办法

    问题是这样,我在对数据库进行写操作(添加.删除.修改)时,我想同时删除两个表中的两条关联数据,像这样 let sql = ` DELETE FROM bridge_parts WHERE id = $ ...

  10. Greedy Gift Givers 贪婪的送礼者 USACO 模拟

    1002: 1.1.2 Greedy Gift Givers 贪婪的送礼者 时间限制: 1 Sec  内存限制: 128 MB提交: 9  解决: 9[提交] [状态] [讨论版] [命题人:外部导入 ...