mybatis--面向接口编程
如果使用hiberante作为dao层,常用的方式是:定义一个dao层接口包(com.dao.service)然后在定义一个dao层接口实现包(com.dao.service.impl),这样定义结构清晰,方便维护和开发工作。如果使用mybatis作为dao层,就可以省略到dao实现包,直接将sql实现在xml配置文件中编写,这样可以直接通过接口访问映射文件。本文介绍模型层的这两种设计模式。
一、设计模式一:由接口访问映射文件
如采取此种设计模式,需要:
一、在spring-mybatis的配置文件中配置MapperScannerConfiguer:这是将sqlSessionFactory注入到指定包中的java类中。
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.shyy.web.service"/>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>
二、映射文件的命名空间设置为指定接口,如:com.shyy.web.service.TreeMapper是访问该映射文件的接口名称。
<mapper namespace="com.shyy.web.service.TreeMapper" >
三、接口中的方法必须和映射文件一致。如:
映射文件中的某sql:
<select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.String" >
select
<include refid="Base_Column_List" />
from t_tree
where tid = #{tid,jdbcType=VARCHAR}
</select>
接口中对应的方法名:
Student selectByPrimaryKey(Integer sid);
需要访问映射文件的sql,只需在当前类注入相应的接口:

需注意的是,由于该接口没有实现类,所以在如idea上会报这样的提示,说不能注入,因为接口是不能实例化的,在eclipse上不会报,但实际上没有影响。
设计模式2:由接口的实现类访问映射文件
示例接口:
package com.shyy.web.service;
import com.shyy.web.entity.Student;
public interface StudentMapper {
int deleteByPrimaryKey(Integer sid);
int insert(Student record);
int insertSelective(Student record);
Student selectByPrimaryKey(Integer sid);
int updateByPrimaryKeySelective(Student record);
int updateByPrimaryKey(Student record);
}
其实现类:
package com.shyy.web.service.impl; import com.shyy.web.entity.Student;
import com.shyy.web.service.StudentMapper;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository; @Repository("studentMapperImpl")
public class StudentMapperImpl implements StudentMapper {
@Autowired
protected SqlSessionTemplate session; public StudentMapperImpl() {
} //获取接口名
private String clazz = this.getClass().getInterfaces()[0].getName(); public int deleteByPrimaryKey(Integer sid) {
return session.delete(clazz+".deleteByPrimaryKey",sid);
} public int insert(Student record) {
return session.insert(clazz+".insert",record);
} public int insertSelective(Student record) {
return session.insert(clazz+".insertSelective",record);
} public Student selectByPrimaryKey(Integer sid) {
return session.selectOne(clazz+".selectByPrimaryKey",sid);
} public int updateByPrimaryKeySelective(Student record) {
return session.update(clazz+".updateByPrimaryKeySelective",record);
} public int updateByPrimaryKey(Student record) {
return session.update(clazz+".updateByPrimaryKey",record);
}
}
这样的设计模式需要在实现类中注入SqlSessionTemplate ,所以spring-mybatis的配置文件应该加上:
<!-- 获取SqlSessionTemplate -->
<bean class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg ref="sqlSessionFactory"></constructor-arg>
</bean>
需要由此接口的实现类访问映射文件,则在注入时接口的引用名要与@Repository("studentMapperImpl")中的名字一致:
@Autowired
private StudentMapper studentMapperImpl;
这样就相当于实例化了接口StudentMapper 的实现类StudentMapperImpl 。
mybatis--面向接口编程的更多相关文章
- mybatis面向接口的编程
一.实现面向接口编程 具体操作方法如下: 第一:编写一个接口(IUser.java) 接口暂时为空接口,接口文件包路径:com.gusi.demo.idao.IUser 第二:修改映射文件(User. ...
- javascript设计模式学习之十七——程序设计原则与面向接口编程
一.编程设计原则 1)单一职责原则(SRP): 这里的职责是指“引起变化的原因”:单一职责原则体现为:一个对象(方法)只做一件事. 事实上,未必要在任何时候都一成不变地遵守原则,实际开发中,因为种种原 ...
- Java中的面向接口编程
面向接口编程是很多软件架构设计理论都倡导的编程方式,学习Java自然少不了这一部分,下面是我在学习过程中整理出来的关于如何在Java中实现面向接口编程的知识.分享出来,有不对之处还请大家指正. 接口体 ...
- Java面向接口编程,低耦合高内聚的设计哲学
接口体现的是一种规范和实现分离的设计哲学,充分利用接口可以极大的降低程序中各个模块之间的耦合,提高系统的可维护性以及可扩展性. 因此,很多的软件架构设计理念都倡导"面向接口编程"而 ...
- java接口,接口的特性,接口实现多态,面向接口编程
package cn.zy.cellphone; /**接口是一种引用数据类型.使用interface声明接口,形式 * 形式:public interface 接口名称{} * 接口不能拥有构造方法 ...
- java面向接口编程
在oop中有一种设计原则是面向接口编程,面向接口编程有非常多优点,详细百度一大片.我来谈一下详细的使用中的一些不成熟的见解.! 首先面向接口编程能够消除类之间的依赖关系,使得业务仅仅依赖接口. 这样有 ...
- go 学习笔记之万万没想到宠物店竟然催生出面向接口编程?
到底是要猫还是要狗 在上篇文章中,我们编撰了一则简短的小故事用于讲解了什么是面向对象的继承特性以及 Go 语言是如何实现这种继承语义的,这一节我们将继续探讨新的场景,希望能顺便讲解面向对象的接口概念. ...
- Python 中的面向接口编程
前言 "面向接口编程"写 Java 的朋友耳朵已经可以听出干茧了吧,当然这个思想在 Java 中非常重要,甚至几乎所有的编程语言都需要,毕竟程序具有良好的扩展性.维护性谁都不能拒绝 ...
- Mybatis面向接口式编程
Mybatis面向接口编程 1.xml文件书写格式 <?xml version="1.0" encoding="UTF-8" ?> <!DOC ...
- 【GoLang】golang 面向对象编程 & 面向接口编程
005.面向对象&接口编程 1 面向函数编程 1.1 将数据作为参数传递到函数入参 1.2 对象与函数是分离的 2 面向对象编程 2.1 使用者看起来函数作为对象的属性而非参数 2.2 函数属 ...
随机推荐
- css3 过渡记
CSS3 过渡 CSS3的transition允许CSS的属性值在一定的时间区间内平滑地过渡.这种效果可以在鼠标单击,获得焦点,被点击或对元素任何改变中触发,并平滑地以动画效果改变CSS的属性值. t ...
- CI加载流程小结
无聊,决定水一把. CI(CodeIgniter)是我最早接触的一个框架,到现在也只是用了其中一点零碎的方法.一直想对其流程做个小结,却总是因各种各样的“理由”挨着.看见别人图表齐上阵,没那耐心,就从 ...
- No Dialect mapping for JDBC type: -1
MySQL数据库中有张表的字段是text,查询出来后对应的java类型是String,Dialect设置为org.hibernate.dialect.MySQLDialect 运行的时候报错:No D ...
- 谈谈JavaScript事件
众所周知,web前端包含三个基本技术:html.css和javascript.三者融合,才让网页变得精彩纷呈!如今,web上的操作越来越趋于复杂,JavaScript事件在网页中也遍地开花,有时候也是 ...
- jQuery之手势密码
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- 使用ptrace向已运行进程中注入.so并执行相关函数
这个总结的很好,从前一个项目也用到这中技术 转自:http://blog.csdn.net/myarrow/article/details/9630377 1. 简介 使用ptrace向已运行进程中注 ...
- Swift使用闭包表达式
Swift中的闭包表达式很灵活,其标准语法格式如下:{ (参数列表) ->返回值类型 in 语句组}其中,参数列表与函数中的参数列表形式一样,返回值类型类似于函数中的返回值类型,但不同的是 ...
- 手机APP与原生APP设计的区别
交互上可以按照原生App的设计方式,效果将越来越接近,主要区别在于: 1.设计中要考虑到浏览器地址栏和工具栏的占有空间,和其对App的操作存在一定的影响. 2.暂时不适合调用系统底层接口,更适合web ...
- 洛谷 P1890 gcd区间
P1890 gcd区间 题目提供者 洛谷OnlineJudge 标签 数论(数学相关) 难度 普及/提高- 题目描述 给定一行n个正整数a[1]..a[n]. m次询问,每次询问给定一个区间[L,R] ...
- 119. Pascal's Triangle II
Given an index k, return the kth row of the Pascal's triangle. For example, given k = 3,Return [1,3, ...