zoukankan      html  css  js  c++  java
  • 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 。

  • 相关阅读:
    .NET5都来了,你还不知道怎么部署到linux?最全部署方案,总有一款适合你
    一款基于.NET Core的认证授权解决方案-葫芦藤1.0开源啦
    开源项目葫芦藤:IdentityServer4的实现及其运用
    MySQL大表优化方案
    Sec-Fetch-*请求头,了解下?
    前端开发快速入门
    从零开始打造专属钉钉机器人
    打造钉钉事件分发平台之钉钉审批等事件处理
    React中的高阶组件
    浏览器本地存储方案
  • 原文地址:https://www.cnblogs.com/wql025/p/5040398.html
Copyright © 2011-2022 走看看