学了 Mybatis 之后,发现用 Mybatis 写 Dao层实在是简便多了,主要是在表的映射这块简单了很多。下面是我实现的使用 Mybatis 实现的简单的操作用户表的 Dao 层。

使用 Mybatis 实现 DAO 层,一共有两种方式:

  1. 原始的 DAO 层的实现
  2. 使用 Mapper 代理方式【这里又分两种:直接配置 Mapper 代理;使用包扫描配置 Mapper 代理】

两种方式都需要创建实体类,接口类;

第一种方式需要

  • 创建接口的实现类,并且要继承 SqlSessionDaoSuppurt【用于获取 SqlSession 对象,用于执行CRUD】 ;
  • 需要在 SqlMapConfig.xml 文件中注册对应的 Mapper.xml 文件资源
  • 当然,DAO 层的实现类必须在 Spring 容器中配置 bean

第二种方式需要遵守四个原则:

  • Mapper 接口中方法名 == XxxMappe.xml 文件的中每个 statement 的 id 名
  • 接口方法返回值类型要和 XxxMapper.xml 文件的中定义的每个 sql 的返回值类型 resultType 一致
  • 接口方法参数类型和 XxxMapper.xml 文件的入参类型 parameType 要一致
  • XxxMapper.xml 文件的 namespace 属性必须是对应接口类的全类名

第二种方式 - 01:【直接配置 Mapper 代理的实现】

  • 需要在 applicationContext.xml 文件中添加 MapperFactoryBean 的配置,并且注入 SqlSessionFactory 以及需要被代理的对象

(即之前的 Mapper接口类)

下面是一个简单的配置:

<!-- Mapper代理的方式开发方式一,配置Mapper代理对象 -->
<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<!-- 配置Mapper接口 -->
<property name="mapperInterface" value="com.msym.cloudnote.dao.UserDao" />
<!-- 配置sqlSessionFactory -->
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>

如果没有在mybatis-config.xml 中写 <mappers> 标签指定 XxxMapper.xml 文件的话,或者没有 mybatis-config.xml 文件的话,也可以像如下配置:【其中 mapperLocations 指定的是 XxxMapper.xml 文件】

<!-- 配置SqlSessionFactoryBean,用于Mapper的动态代理 -->
<bean class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 指定连接资源 -->
<property name="dataSource" ref="dbpool" />
<!-- 采用通配符的方式,指定映射文件-->
<property name="mapperLocations" value="classpath:mapper/*.xml" />
</bean>

这里可以指定 sqlMapConfig.xml 的路径,如果整合到 Spring的配置文件的话,就可以通过 mapperLocation,指定 Mapper 文件的位置。

其中配置的 MapperFactoryBean 是属于 mybatis-spring 整合包。

测试方法:

public class UserMapperTest {
private ApplicationContext context; @Before
public void setUp() throws Exception {
this.context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
} @Test
public void testQueryUserById() {
// 根据接口,获取 Mapper 对象
UserMapper userMapper = this.context.getBean(UserMapper.class);
User user = userMapper.queryUserById(1);
System.out.println(user);
}
}

第二种方式 - 02:【采用包扫描设置 Mapper 代理的实现】

  • 需要在 applicationContext.xml 文件中添加 MapperScannerConfigurer 的配置,并注入 Mapper接口所在的包即可,不需要注入 sqlSessionFactory 了【扫描器会自动扫描基本包的及其子类下所有的类】
<!-- Mapper代理的方式开发方式二,扫描包方式配置代理 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 注入基本包,配置Mapper接口所在包 -->
<property name="basePackage" value="com.msym.cloudnote.dao" />
</bean>

代理出来的 Mapper对象 id 就是接口类名,首字母小写。

UserDAO接口文件:

package com.msym.cloudnote.dao;

import com.msym.cloudnote.entity.User;

/**
* 用于操作用户表
*
* @author 码上猿梦 http://www.cnblogs.com/daimajun/
*/
public interface UserDAO {
/**
* 根据名字查
* @param name
* @return
*/
public User findUserByName(String name);
/**
* 增加用户,用于注册
* @param user
* @return
*/
public int addUser(User user); /**
* 根据用户Id,获取用户信息
* @param userId
* @return
*/
public User findUserById(String userId); /**
* 修改密码
* @param user
* @return
*/
public int modifyPwd(User user);
}

对应的 UserMapper.xml 文件:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN" "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd"> <mapper namespace="com.msym.cloudnote.dao.UserDAO">
<!-- 修改密码 -->
<update id="modifyPwd" parameterType="com.msym.cloudnote.entity.User">
update cn_user
set
cn_user_password = #{ password }
where
cn_user_id = #{ id }
</update>
<!-- 根据Id查询用户信息 -->
<select id="findUserById" parameterType="string"
resultType="com.msym.cloudnote.entity.User">
select
cn_user_id as id,
cn_user_name as name,
cn_user_password as password,
cn_user_token as token,
cn_user_nick as nick
from
cn_user
where
cn_user_id = #{ userId }
</select>
<!-- 根据用户名查询用户信息 -->
<select id="findUserByName" parameterType="string"
resultType="com.msym.cloudnote.entity.User">
select
cn_user_id as id,
cn_user_name as name,
cn_user_password as password,
cn_user_token as token,
cn_user_nick as nick
from
cn_user
where
cn_user_name = #{ name }
</select> <!-- 用户注册 -->
<insert id="addUser" parameterType="com.msym.cloudnote.entity.User">
insert into cn_user(
cn_user_id,
cn_user_name,
cn_user_password,
cn_user_token,
cn_user_nick
) values(
#{ id },
#{ name },
#{ password },
#{ token },
#{ nick }
)
</insert> </mapper>

我的 MyBatis 实现的 Dao 层的更多相关文章

  1. MyBatis逆向工程生成dao层增删改查方法解释使用(转载)

    int countByExample(BUserExample example); //根据条件查询数量 /** * 示例 * public int countByExample() { * BUse ...

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

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

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

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

  4. 02.MyBatis在DAO层开发使用的Mapper动态代理方式

    在实际开发中,Mybatis作用于DAO层,那么Service层该如何调用Mybatis Mybatis鼓励使用Mapper动态代理的方式 Mapper接口开发方法只需要程序员编写Mapper接口(相 ...

  5. DAO 层实现

    一.实验介绍 1.1 实验内容 本节课程主要利用 MyBatis 框架实现 DAO 层. 1.2 实验知识点 MyBatis 框架 MySQL 1.3 实验环境 JDK1.8 Eclipse Java ...

  6. mybatis实战教程(mybatis in action)之十:mybatis SqlSessionSupport 的使用,构件DAO 层的应用

    前面的系列mybatis 文章,已经基本讲到了mybatis的操作,但都是基于mapper隐射操作的,在mybatis 3中这个mapper 接口貌似充当了以前在ibatis 2中的 DAO 层的作用 ...

  7. MyBatis dao层 方法传参

    MyBatis dao层 方法传参有三种方法. 1. 以下标的方法获取参数. <update id="insertSuccessKilled">       INSER ...

  8. MyBatis的Dao层注入SqlSession

    有点坑爹,以前没用过Mybatis,最近才用,而且一直用Mybatis推荐的接口映射的方式,但是今天有人告诉我接口方式用得少,大多还是采用从配置文件里面读sql的方式,当然接口也是类似的,都是利用ma ...

  9. [MyBatis]DAO层只写接口,不用写实现类

    团队开发一个项目,由老大架了一个框架,遇到了DAO层不用写接口了,我也是用了2次才记住这个事的,因为自己一直都是习惯于写DAO层的实现类,所以,习惯性的还是写了个实现类.于是遇到错误了. 找不到那个方 ...

随机推荐

  1. PetaLinux安装及使用

    Description/说明 PetaLinux版本:2016.4 操作系统版本:Ubuntu 16.04(如使用Ubuntu,墙裂建议使用16.04,其他版本官方手册并没有标明支持,可能会出现莫名其 ...

  2. 将python自动转换为.exe文件

    使用py2exe包进行转换.py2exe怎么装的可以网上另查.时间久了,记不太清了...... 这个程序可以把自己进行转换.但是没法运行....其实只要是需要修改自身的程序打包后都没法运行. # -* ...

  3. Mac配置MySql

    MySql在Mac下的情况如下: 首先,我们进入MySql的官网下载MySql(直接点击即可),打开之后便是这样. 我们点击红色方框标记的内容,之后我等待下载完成. 下载完成之后,我们需要点点,注意一 ...

  4. 计算机专业C语言编程学习重点:指针化难为易

    C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构.C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现 ...

  5. 2017-2018-1 20155232 《信息安全系统设计基础》第四周学习总结以及课上myod练习补充博客

    2017-2018-1 20155232 <信息安全系统设计基础>第四周学习总结以及课上myod练习补充博客 课上myod练习 1 参考教材第十章内容 2 用Linux IO相关系统调用编 ...

  6. 20155301 Makefile和MyOD和共享库

    20155301 Makefile和MyOD和共享库 Makefile 作用:make命令执行时,需要一个 Makefile 文件,以告诉make命令需要怎么样的去编译和链接程序. 我们要写一个Mak ...

  7. 20155328 《Java程序设计》实验三 敏捷开发与XP实践 实验报告

    一.编码标准 编程标准包含:具有说明性的名字.清晰的表达式.直截了当的控制流.可读的代码和注释,以及在追求这些内容时一致地使用某些规则和惯用法的重要性. 下面是没有最基本的缩进的一个程序: publi ...

  8. 【转载】从零实现3D图像引擎:(2)画2D直线不简单

    原文:从零实现3D图像引擎:(2)画2D直线不简单 1. 数学分析 1) 画直线的问题 本来我以为画直线会很容易,随便拿个直线公式,遍历X求Y画出来不就完了么,但事实并非如此.以2D直线为例,因为3D ...

  9. Nginx入门篇(一)之Nginx介绍

    1.简介 Nginx ("engine x") 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 服务器. Nginx 是由 Igor Sysoe ...

  10. angularJS ng-repeat中的directive 动态加载template

    有个需求,想实现一个html组件,传入不同的typeId,渲染出不同的表单元素. <div ng-repeat="field in vm.data"> <magi ...