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的实现的更多相关文章

  1. 开发基础框架: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 二 ...

  2. 基于mybatis的BaseDao及BaseService深度结合(转)

    原文地址:http://zhaoshijie.iteye.com/blog/2003209 关键字:Mybatis通用DAO设计封装(mybatis) 说明: mybatis默认分页机制为逻辑分页,所 ...

  3. 基于 Spring + Atomikos + Mybatis的多数据源配置(含有BaseDao,BaseService)

    1.spring配置文件 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=" ...

  4. Spring和Mybatis整合,配置文件

    整合时除了未整合前spring.mybatis的必须包外还需要加入两个包 spring-jdbc-4.2.5.RELEASE.jar mybatis-spring-1.2.5.jar spring-j ...

  5. 每日一记-mybatis碰到的疑惑:String类型可以传入多个参数吗

    碰到一个觉得很疑惑的问题,Mybatis的parameterType为String类型的时候,能够接收多个参数的吗? 背景 初学Mybatis的时候,看的教程和书籍上都是在说基本的数据类型如:int. ...

  6. 第一个spring、springmvc、mybatis、freemarker项目小知识(一)

    1.持久层开发(Mybatis)    1.1 添加,非空字段必须给值,不是非空加判断,有值添加无值不添    1.2 删除,注意外键关系的级联删除.(事务传播行为)    1.3 更新,每个字段单独 ...

  7. MyBatis Generator作为maven插件自动生成增删改查代码及配置文件例子

    什么是MyBatis Generator MyBatis Generator (MBG) 是一个Mybatis的代码生成器,可以自动生成一些简单的CRUD(插入,查询,更新,删除)操作代码,model ...

  8. mybatis 多个dao重名,根据namespace解析

    在mybatis通过执行sql语句的方式是,用getSqlSession().xxx(param,..)方法来调用, 其中第一个参数就是dao mapper.xml文件的命名空间.id package ...

  9. Spring+Maven+Dubbo+MyBatis+Linner+Handlebars—Web开发环境搭建

    本文主要分三部分,分别是:后台核心业务逻辑.桥梁辅助控制和前台显示页面. 本Web开发环境综合了多种工具,包括Maven包管理与编译工具.Dubbo分布式服务框架.MyBatis数据持久化工具.Lin ...

  10. springMVC + Spring + MyBatis 整合

    整理下SSM(基于注解)的整合 1. web.xml 配置文件 <?xml version="1.0" encoding="UTF-8"?> < ...

随机推荐

  1. Python网络爬虫与信息提取(一)

    学习 北京理工大学 嵩天 课程笔记 课程体系结构: 1.Requests框架:自动爬取HTML页面与自动网络请求提交 2.robots.txt:网络爬虫排除标准 3.BeautifulSoup框架:解 ...

  2. 火币网现货API[Python3版]

    火币 期货 现货 API [Python3版] 一.Util.py,基础类,包括参数配置.签名,HTTP 请求方法,发送信息到API #coding=utf-8 import hashlib impo ...

  3. Ubuntu 安装和使用 Supervisor(进程管理)

    服务器版本 Ubuntu 16.04 LTS. Supervisor 是一个用 Python 写的进程管理工具,可以很方便的对进程进行启动.停止.重启等操作. 安装命令: $ apt-get inst ...

  4. SkipList跳表基本原理

    为什么选择跳表 目前经常使用的平衡数据结构有:B树,红黑树,AVL树,Splay Tree, Treep等. 想象一下,给你一张草稿纸,一只笔,一个编辑器,你能立即实现一颗红黑树,或者AVL树 出来吗 ...

  5. 【前端】Github Pages 与域名关联简明教程

    Github Pages 与域名关联简明教程 1. 向你的 Github Pages 仓库添加一个CNAME(一定要*大写*)文件 其中只能包含一个顶级域名,像这样: example.com 如果你是 ...

  6. Java基础---网络编程

    第一讲     概述 1.网络模型:OSI参考模型和TCP/IP参考模型 图示: 一般来说开发处于传输层和网际层,应用层为:FTP和HTTP协议等,传输层为:UDP和TCP等,网际层为:IP. 通常用 ...

  7. NOSQL EYE开源

    简介 NOSQL数据库监控工具,目前实现了对Redis.MongoDB的监控功能. 功能列表 演示地址 http://106.14.181.95:7004  登录用户名.密码:admin/admin ...

  8. Net分布式系统之七:日志采集系统(1)

    日志对大型应用系统或者平台尤其重要,系统日志采集.分析是系统运维.维护及用户分析的基础. 一.系统日志分类 一般系统日志可分为三大类: 1.用户行为日志:通过采集系统用户使用系统过程中,一系列的操作日 ...

  9. 慎用kill -9,kill -15的作用

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt334 Perl语言专家Randal Schwartz在一篇短文里这样写: n ...

  10. 【小白成长撸】--Fibonacci

    /*程序的版权和版本声明部分: *Copyright(c) 2016,电子科技大学本科生 *All rights reserved. *文件名:Fibonacci *程序作用:计算菲薄拉稀数列 *作者 ...