我的 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层的实现类,所以,习惯性的还是写了个实现类.于是遇到错误了. 找不到那个方 ...
随机推荐
- 搜索引擎的选择与在chrome上的设置
1 优缺点分析 百度:广告多,但是电脑端可以用Adblock Plus屏蔽:搜索内容有很多百度自家内容,如百家号.百度知道.百度文库.百度贴吧等,在搜索教程的时候很实用,但是不适合偏专业性搜索,很多 ...
- shiro实战整合
引入依赖(包括缓存等): <!-- SECURITY begin --> <dependency> <groupId>org.apache.shiro</gr ...
- 推荐一个学习Flex chart的好网站
推荐一个学习Flex chart的好网站 2013-03-04 14:16:56| 分类: Flex | 标签: |字号大中小 订阅 推荐一个学习Flex chart的好网站 最近在做一个 ...
- 百度地图api 常用 例子
功能一:获取map地图窗口的可视区域: var map = new BMap.Map("allmap"); // 创建Map实例 map.centerAndZ ...
- WPF RoutedEvent and HitTest - 简书
原文:WPF RoutedEvent and HitTest - 简书 学习的时候切忌心浮气躁,慢慢的过每一个知识点,不要漏掉任何细节.不然当遇到细节问题的时候,会恼,会闹,会悔不该当初--花一下午调 ...
- 【转载】关于RenderTarget的注意事项
原文:关于RenderTarget的注意事项 1. 设置一个RenderTarget会导致viewport变成跟RenderTarget一样大 2. 反锯齿类型必须跟DepthStencilBuffe ...
- Nginx入门篇(二)之Nginx部署与配置文件解析
一.Nginx编译安装 ()查看系统环境 [root@localhost tools]# cat /etc/redhat-release CentOS Linux release (Core) [ro ...
- kyligence enterprise3.2.x版本使用mysql作为数据源构建报错
1.报错信息如下: exe cmd:null/bin/sqoop import -Dorg.apache.sqoop.splitter.allow_text_splitter=true -Dfs.de ...
- 海思NB-IOT的SDK函数使用说明
1. 查询当前AT指令是否正在处理中 while(get_at_cmd_in_progress() == false); 2. 信号量发送函数 (, osNoWait); 3. 信号量接收函数 if( ...
- Scala中==,eq与equals的区别
根据官方API的定义: final def ==(arg0: Any): Boolean The expression x == that is equivalent to if (x eq null ...
