我的 MyBatis 实现的 Dao 层
学了 Mybatis 之后,发现用 Mybatis 写 Dao层实在是简便多了,主要是在表的映射这块简单了很多。下面是我实现的使用 Mybatis 实现的简单的操作用户表的 Dao 层。
使用 Mybatis 实现 DAO 层,一共有两种方式:
- 原始的 DAO 层的实现
- 使用 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 层的更多相关文章
- MyBatis逆向工程生成dao层增删改查方法解释使用(转载)
int countByExample(BUserExample example); //根据条件查询数量 /** * 示例 * public int countByExample() { * BUse ...
- MyBatis开发Dao层的两种方式(原始Dao层开发)
本文将介绍使用框架mybatis开发原始Dao层来对一个对数据库进行增删改查的案例. Mapper动态代理开发Dao层请阅读我的下一篇博客:MyBatis开发Dao层的两种方式(Mapper动态代理方 ...
- MyBatis开发Dao层的两种方式(Mapper动态代理方式)
MyBatis开发原始Dao层请阅读我的上一篇博客:MyBatis开发Dao层的两种方式(原始Dao层开发) 接上一篇博客继续介绍MyBatis开发Dao层的第二种方式:Mapper动态代理方式 Ma ...
- 02.MyBatis在DAO层开发使用的Mapper动态代理方式
在实际开发中,Mybatis作用于DAO层,那么Service层该如何调用Mybatis Mybatis鼓励使用Mapper动态代理的方式 Mapper接口开发方法只需要程序员编写Mapper接口(相 ...
- DAO 层实现
一.实验介绍 1.1 实验内容 本节课程主要利用 MyBatis 框架实现 DAO 层. 1.2 实验知识点 MyBatis 框架 MySQL 1.3 实验环境 JDK1.8 Eclipse Java ...
- mybatis实战教程(mybatis in action)之十:mybatis SqlSessionSupport 的使用,构件DAO 层的应用
前面的系列mybatis 文章,已经基本讲到了mybatis的操作,但都是基于mapper隐射操作的,在mybatis 3中这个mapper 接口貌似充当了以前在ibatis 2中的 DAO 层的作用 ...
- MyBatis dao层 方法传参
MyBatis dao层 方法传参有三种方法. 1. 以下标的方法获取参数. <update id="insertSuccessKilled"> INSER ...
- MyBatis的Dao层注入SqlSession
有点坑爹,以前没用过Mybatis,最近才用,而且一直用Mybatis推荐的接口映射的方式,但是今天有人告诉我接口方式用得少,大多还是采用从配置文件里面读sql的方式,当然接口也是类似的,都是利用ma ...
- [MyBatis]DAO层只写接口,不用写实现类
团队开发一个项目,由老大架了一个框架,遇到了DAO层不用写接口了,我也是用了2次才记住这个事的,因为自己一直都是习惯于写DAO层的实现类,所以,习惯性的还是写了个实现类.于是遇到错误了. 找不到那个方 ...
随机推荐
- 20155226 2016-2017-2 《Java程序设计》第4周学习总结
20155226 2016-2017-2 <Java程序设计>第4周学习总结 教材学习内容总结 继承(extends): 1.作用:提高代码复用性 让类与类产生了关系,有了这个关系才有了多 ...
- 2017-2018-1 20155232 《信息安全系统设计基础》第四周学习总结以及课上myod练习补充博客
2017-2018-1 20155232 <信息安全系统设计基础>第四周学习总结以及课上myod练习补充博客 课上myod练习 1 参考教材第十章内容 2 用Linux IO相关系统调用编 ...
- 20155232 2016-2017-3 《Java程序设计》第10周学习总结
20155232 2016-2017-3 <Java程序设计>第10周学习总结 教材学习内容总结 计算机网络 路由器和交换机组成了核心的计算机网络,计算机只是这个网络上的节点以及控制等,通 ...
- 20155323 2016-2017-2 《Java程序设计》第3周学习总结
20155323 2016-2017-2 <Java程序设计>第3周学习总结 教材学习内容总结 第四章 对象:对象具有状态和行为,对象是类的实例. 类:一个类可以被定义为描述行为的模板. ...
- day 11 名片管理系统
1 思路 #名片1 名片2 {"name":"alex","age":18,"QQ":12123} {"nam ...
- 【LG3723】[AHOI2017/HNOI2017]礼物
[LG3723][AHOI2017/HNOI2017]礼物 题面 洛谷 题解 首先我们将\(c\)看作一个可以为负的整数,那么我们就可以省去讨论在哪个手环加\(c\)的繁琐步骤了 设我们当前已经选好了 ...
- dp合集 广场铺砖问题&&硬木地板
dp合集 广场铺砖问题&&硬木地板 很经典了吧... 前排:思想来自yali朱全民dalao的ppt百度文库免费下载 后排:STO朱全民OTZ 广场铺砖问题 有一个 W 行 H 列的广 ...
- angular之$watch() $watchGroup()和$watchCollection()
$watch $watch主要是用来监听一个对象,在对象发生变化时触发某个事件. 用法: $scope.$watch(watchFn,watchAction, deepWatch) 接下来讲一下这几个 ...
- Siki_Unity_2-4_UGUI_Unity5.1 UI 案例学习
Unity 2-4 UGUI Unity5.1 UI 案例学习 任务1-1:UGUI简介 什么是GUI: 游戏的开始菜单 RPG游戏的菜单栏.侧边栏和功能栏(比如背包系统.任务列表等) 设计用来控制移 ...
- 【sed】常用命令
替换 替换某一整行 sed '1c hello' test #将第一行替换为hello str1替换为str2 sed 's/^str1.*/str2/' filename #以str1开头 sed ...