mybatis-basedao的实现
package com.yangwei.shop.dao;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.session.SqlSession;
import com.yangwei.shop.entity.Pager;
import com.yangwei.shop.entity.SystemContext;
import com.yangwei.shop.util.MyBatisUtil;
// 其中 Pager SystemContext 是自定义的分页类,前面mybatis有讲解 http://www.cnblogs.com/yangw/p/3315398.html
/**
* BaseDao 使用泛型
* 命令 :约定优于配置
*/
public class BaseDao<T> {
public void add(T obj){
SqlSession session=null;
try {
session = MyBatisUtil.createSession();
//约定 namespace值是该实体类的全路径,并且所有的添加都是add
session.insert(obj.getClass().getName()+".add", obj);
session.commit();
} catch (Exception e) {
e.printStackTrace();
session.rollback();
}finally{
MyBatisUtil.closeSession(session);
}
}
public void update(T obj){
SqlSession session=null;
try {
session = MyBatisUtil.createSession();
//约定 namespace值是该实体类的全路径,并且所有的更新都是update
session.update(obj.getClass().getName()+".update", obj);
session.commit();
} catch (Exception e) {
e.printStackTrace();
session.rollback();
}finally{
MyBatisUtil.closeSession(session);
}
}
public void delete(Class<T> clazz,int id){
SqlSession session=null;
try {
session = MyBatisUtil.createSession();
//约定 namespace值是该实体类的全路径,并且所有的删除都是delete
session.delete(clazz.getName()+".delete", id);
session.commit();
} catch (Exception e) {
e.printStackTrace();
session.rollback();
}finally{
MyBatisUtil.closeSession(session);
}
}
/**
* 根据Id查找
*/
public T load(Class<T> clazz,int id){
return this.load(clazz.getName()+"load", id);
}
/**
* 根据指定的多个条件获取一条记录(最通用)
*/
public T load(String sqlId,Map<String,Object> params){
SqlSession session=null;
T obj=null;
try {
session = MyBatisUtil.createSession();
//约定 namespace值是该实体类的全路径,并且所有的根据Id加载都是load
obj=session.selectOne(sqlId, params);
}finally{
MyBatisUtil.closeSession(session);
}
return obj;
}
/**
* 根据指定的一个条件获取一条记录
*/
public T load(String sqlId,Object param){
SqlSession session=null;
T obj=null;
try {
session = MyBatisUtil.createSession();
//约定 namespace值是该实体类的全路径,并且所有的根据Id加载都是load
obj=session.selectOne(sqlId, param);
}finally{
MyBatisUtil.closeSession(session);
}
return obj;
}
/**
* 有分页的查询 (默认是find)
*/
public Pager<T> find(Class<T> clazz,Map<String,Object> params){
return this.find(clazz.getName()+".find", params);
}
/**
* 有分页的查询 (自行指定sqlId)
*/
public Pager<T> find(String sqlId,Map<String,Object> params){
int pageOffset=SystemContext.getPageOffset();
int pageSize=SystemContext.getPageSize();
String order=SystemContext.getOrder();
String sort=SystemContext.getSort();
Pager<T> pages=new Pager<T>();
SqlSession session=null;
try {
session = MyBatisUtil.createSession();
if(params==null) params=new HashMap<String,Object>();
params.put("pageOffset", pageOffset);
params.put("pageSize", pageSize);
params.put("order", order);
params.put("sort", sort);
//约定 namespace值是该实体类的全路径,并且所有的分页查询都是find
List<T> lists=session.selectList(sqlId, params);
pages.setDatas(lists);
pages.setPageOffset(pageOffset);
pages.setPageSize(pageSize);
//获取当前条件下的所有记录数
//查询记录的命名是 XXX,那么约定记录条数命名是 XXX_count
int count=session.selectOne(sqlId+"_count", params);
pages.setTotalRecord(count);
} finally{
MyBatisUtil.closeSession(session);
}
return pages;
}
/**
* 不带分页的查询 (默认是list)
*/
public List<T> list(Class<T> clazz,Map<String,Object> params){
return this.list(clazz.getName()+".list", params);
}
/**
* 不带分页的查询 ,自行指定sqlId
* 排序依然带着
*/
public List<T> list(String sqlId,Map<String,Object> params){
String order=SystemContext.getOrder();
String sort=SystemContext.getSort();
List<T> list=null;
SqlSession session=null;
try {
session = MyBatisUtil.createSession();
if(params==null) params=new HashMap<String,Object>();
params.put("order", order);
params.put("sort", sort);
//约定 namespace值是该实体类的全路径,并且所有的分页查询都是find
list=session.selectList(sqlId, params);
} finally{
MyBatisUtil.closeSession(session);
}
return list;
}
}
部分mapper.xml
<mapper namespace="com.yangwei.shop.entity.Address">
<insert id="add" parameterType="Address">
insert into t_address (name,phone,postcode,user_id) value
(#{name},#{phone},#{postcode},#{user.id})
</insert>
<update id="update" parameterType="Address">
update t_address set
name=#{name},phone=#{phone},postcode=#{postcode} where id=#{id}
</update>
<delete id="delete" parameterType="int">
delete from t_address where id=#{id}
</delete>
<select id="load" parameterType="int" resultType="Address">
select * from t_address where id=#{id}
</select>
<select id="find" parameterType="map" resultType="Address">
select * from t_address
<where>
<if test="name!=null">
name like #{name}
</if>
</where>
<if test="sort!=null">
order by ${sort}
<if test="order!=null">
${order}
</if>
</if>
limit #{pageOffset},#{pageSize}
</select>
<select id="find_count" parameterType="map" resultType="int">
select count(*) from t_address
<where>
<if test="name!=null">
name like #{name}
</if>
</where>
limit #{pageOffset},#{pageSize}
</select>
<select id="list" parameterType="map" resultType="Address">
select * from t_address
<where>
<if test="name!=null">
name like #{name}
</if>
</where>
<if test="sort!=null">
order by ${sort}
<if test="order!=null">
${order}
</if>
</if>
</select>
<!-- 下面是一些特殊的情况,即不是我们能提前约定的-->
<select id="list_by_name" >
</select>
<select id="list_by_name_count" >
</select>
再看看我们的dao变得如此之简洁
package com.yangwei.shop.dao;
import java.util.HashMap;
import java.util.Map;
import com.yangwei.shop.entity.Address;
import com.yangwei.shop.entity.Pager;
public class AddressDao extends BaseDao<Address> implements IAddressDao {
@Override
public void addAddress(Address address, int userId) {
//1,略 根据userId去t_user表加载User信息
//2,将User设置到address中
//3,调用父类方法 添加
super.add(address);
}
@Override
public void updateAddress(Address address) {
super.update(address);
}
@Override
public void deleteAddress(int id) {
super.delete(Address.class, id);
}
@Override
public Address loadAddress(int id) {
return super.load(Address.class, id);
}
@Override
public Pager<Address> findAddress(String name) {
Map<String, Object> params=new HashMap<String, Object>();
if(name!=null && !"".equals(name)){
params.put("name", "%"+name+"%");
}
return super.find(Address.class, params);
}
}
mybatis-basedao的实现的更多相关文章
- 开发基础框架:mybatis-3.2.8 +hibernate4.0+spring3.0+struts2.3
一:项目下载地址(点击 Source code(zip)) https://github.com/fzxblgong/frame_2014-12-15/releases 版本:v1.2大小:20M 二 ...
- 基于mybatis的BaseDao及BaseService深度结合(转)
原文地址:http://zhaoshijie.iteye.com/blog/2003209 关键字:Mybatis通用DAO设计封装(mybatis) 说明: mybatis默认分页机制为逻辑分页,所 ...
- 基于 Spring + Atomikos + Mybatis的多数据源配置(含有BaseDao,BaseService)
1.spring配置文件 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=" ...
- Spring和Mybatis整合,配置文件
整合时除了未整合前spring.mybatis的必须包外还需要加入两个包 spring-jdbc-4.2.5.RELEASE.jar mybatis-spring-1.2.5.jar spring-j ...
- 每日一记-mybatis碰到的疑惑:String类型可以传入多个参数吗
碰到一个觉得很疑惑的问题,Mybatis的parameterType为String类型的时候,能够接收多个参数的吗? 背景 初学Mybatis的时候,看的教程和书籍上都是在说基本的数据类型如:int. ...
- 第一个spring、springmvc、mybatis、freemarker项目小知识(一)
1.持久层开发(Mybatis) 1.1 添加,非空字段必须给值,不是非空加判断,有值添加无值不添 1.2 删除,注意外键关系的级联删除.(事务传播行为) 1.3 更新,每个字段单独 ...
- MyBatis Generator作为maven插件自动生成增删改查代码及配置文件例子
什么是MyBatis Generator MyBatis Generator (MBG) 是一个Mybatis的代码生成器,可以自动生成一些简单的CRUD(插入,查询,更新,删除)操作代码,model ...
- mybatis 多个dao重名,根据namespace解析
在mybatis通过执行sql语句的方式是,用getSqlSession().xxx(param,..)方法来调用, 其中第一个参数就是dao mapper.xml文件的命名空间.id package ...
- Spring+Maven+Dubbo+MyBatis+Linner+Handlebars—Web开发环境搭建
本文主要分三部分,分别是:后台核心业务逻辑.桥梁辅助控制和前台显示页面. 本Web开发环境综合了多种工具,包括Maven包管理与编译工具.Dubbo分布式服务框架.MyBatis数据持久化工具.Lin ...
- springMVC + Spring + MyBatis 整合
整理下SSM(基于注解)的整合 1. web.xml 配置文件 <?xml version="1.0" encoding="UTF-8"?> < ...
随机推荐
- SQL 模糊查询
在进行数据库查询时,有完整查询和模糊查询之分.一般模糊查询语句如下: SELECT 字段 FROM 表 WHERE 某字段 Like 条件 其中关于条件,SQL提供了四种匹配模式:1,%:表示任意0个 ...
- Andrew Ng机器学习课程笔记--week9(下)(推荐系统&协同过滤)
本周内容较多,故分为上下两篇文章. 本文为下篇. 一.内容概要 1. Anomaly Detection Density Estimation Problem Motivation Gaussian ...
- Linux常见命令(五)——rmdir
前 言 JRedu 今天我们来介绍第五个命令:rmdir . 命令英文原意:remove empty directories 命令用途: rmdir:删除空目录,非空的目录不能删除 本章内容将详 ...
- Quartz总结
前言 最近项目中有使用到Quartz,得空便总结总结,顺便记录一下这种设计模式,毕竟"好记性不如烂笔头". 搭建 pom文件: <dependency> <gro ...
- 【MD5解密】免费帮大家解MD5
除睡觉时间外最慢2小时内回复!结合各种国内外免费收费引擎和高效彩虹表,需要解的在评论下方评论即可
- python专题-函数式编程
函数式编程是使用一系列函数去解决问题,按照一般编程思维,面对问题时我们的思考方式是"怎么干",而函数函数式编程的思考方式是我要"干什么". 至于函数式编程的特点 ...
- 使用Jmeter进行http接口测试 ---------成都杀手
前言: 本文主要针对http接口进行测试,使用Jmeter工具实现. Jmter工具设计之初是用于做性能测试的,它在实现对各种接口的调用方面已经做的比较成熟,因此,本次直接使用Jmeter工具来完成对 ...
- 最近完成的AndroidStudio项目实现思路及应用技术
主要内容: Android Studio的介绍 AS中个Gradle及Groovy介绍 AS中的依赖管理 Maven以及Nexus私库管理依赖 Gradle对变种代码的管理以及多渠道打包 eclips ...
- Cython的用法以及填坑姿势
因为项目需要,需要优化已有的Python代码.目前Python代码的执行过程是将Python代码转变成一行行指令,然后解释器解释指令的执行,调用到C代码层.如果去掉指令解释这个阶段,直接进入C代码层, ...
- 去掉vue地址栏中分隔#问题
你需要开启HTML5 History 模式vue-router 默认 hash 模式 -- 使用 URL 的 hash 来模拟一个完整的 URL,于是当 URL 改变时,页面不会重新加载.如果不想要很 ...