zoukankan      html  css  js  c++  java
  • SSM:Mybatis中引入通用mapper

    如果你是SSM项目引入通用mapper记得要引入hibernate中的一个hibernate-jpa-2.1-api-1.0.0.Final.jar包(注意必须要Mybatis整合Spring噢,其实tk.mybatis是替换了原有的mybatis-spring连接包中的内容):

    如果你是maven项目的话,就比较方便了,使用以下的依赖:

    这时才能在POJO上使用注解来映射字段和表名,以及一些特殊的使用:

    开始演示

    pojo中的注解映射表:

    package com.domain;
    
    import javax.persistence.Column;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    import javax.persistence.Table;
    
    /**
     * @author mzy
      * 定义orders表对应的实体类
     */
    /*
    说明:
    
    表名默认使用类名,驼峰转下划线(只对大写字母进行处理),如UserInfo默认对应的表名为user_info。
    表名可以使用@Table(name = "tableName")进行指定,对不符合第一条默认规则的可以通过这种方式指定表名.
    字段默认和@Column一样,都会作为表字段,表字段默认为Java对象的Field名字驼峰转下划线形式.
    可以使用@Column(name = "fieldName")指定不符合第3条规则的字段名
    使用@Transient注解可以忽略字段,添加该注解的字段不会作为表字段使用.
    建议一定是有一个@Id注解作为主键的字段,可以有多个@Id注解的字段作为联合主键.
    如果是MySQL的自增字段,加上@GeneratedValue(generator = "JDBC")即可。如果是其他数据库,可以参考官网文档。
     */
    @Table(name = "t_order")
    public class Order {
        /**
         * 
        CREATE TABLE orders(
            order_id INT PRIMARY KEY AUTO_INCREMENT,
            order_no VARCHAR(20), 
            order_price FLOAT
        );
         */
        
        //Order实体类中属性名和orders表中的字段名是不一样的
    	@GeneratedValue(generator = "JDBC") // 自增的主键映射
    	@Id
    	@Column(name = "order_id")
    	private int id;                //id===>order_id
        @Column(name = "order_no")
    	private String orderNo;        //orderNo===>order_no
        @Column(name = "order_price")
        private float price;        //price===>order_price
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public String getOrderNo() {
            return orderNo;
        }
    
        public void setOrderNo(String orderNo) {
            this.orderNo = orderNo;
        }
    
        public float getPrice() {
            return price;
        }
    
        public void setPrice(float price) {
            this.price = price;
        }
    
        @Override
        public String toString() {
            return "Order [id=" + id + ", orderNo=" + orderNo + ", price=" + price+ "]";
        }
    }

    此刻如果只涉及普通的单表查询就不需要创建xml文件映射了,那个*mapper.xml文件实在麻烦,但是Mybatis 3.4.0才开始出现诸注解配置mapper,但是注解配置mapper还是比较麻烦,比较长乱,所以此刻引入通用mapper我们就只在扩大粒度的时候才会加xml文件,并且*mapper.xml中sql会少很多。

    这时的Mapper就只用继承通用Mapper<T>,但是注意要传入泛型:

    package com.mapper;
    
    import org.springframework.stereotype.Repository;
    
    import com.domain.Order;
    
    import tk.mybatis.mapper.common.Mapper;
    
    /*
    DAO的写法
    在传统的Mybatis写法中,DAO接口需要与Mapper文件关联,即需要编写SQL来实现DAO接口中的方法。
    而在通用Mapper中,DAO只需要继承一个通用接口,即可拥有丰富的方法:
    	继承通用的Mapper,必须指定泛型
     */
    @Repository
    public interface OrderMapper extends Mapper<Order>{
    	/*
    	 一旦继承了Mapper,继承的Mapper就拥有了Mapper所有的通用方法:
    
    	Select
    	方法:List<T> select(T record);
    	说明:根据实体中的属性值进行查询,查询条件使用等号
    	
    	方法:T selectByPrimaryKey(Object key);
    	说明:根据主键字段进行查询,方法参数必须包含完整的主键属性,查询条件使用等号
    	
    	方法:List<T> selectAll();
    	说明:查询全部结果,select(null)方法能达到同样的效果
    	
    	方法:T selectOne(T record);
    	说明:根据实体中的属性进行查询,只能有一个返回值,有多个结果是抛出异常,查询条件使用等号
    	
    	方法:int selectCount(T record);
    	说明:根据实体中的属性查询总数,查询条件使用等号
    	
    	Insert
    	方法:int insert(T record);
    	说明:保存一个实体,null的属性也会保存,不会使用数据库默认值
    	
    	方法:int insertSelective(T record);
    	说明:保存一个实体,null的属性不会保存,会使用数据库默认值
    	
    	Update
    	方法:int updateByPrimaryKey(T record);
    	说明:根据主键更新实体全部字段,null值会被更新
    	
    	方法:int updateByPrimaryKeySelective(T record);
    	说明:根据主键更新属性不为null的值
    	
    	Delete
    	方法:int delete(T record);
    	说明:根据实体属性作为条件进行删除,查询条件使用等号
    	
    	方法:int deleteByPrimaryKey(Object key);
    	说明:根据主键字段进行删除,方法参数必须包含完整的主键属性
    	
    	Example方法
    	方法:List<T> selectByExample(Object example);
    	说明:根据Example条件进行查询
    	重点:这个查询支持通过Example类指定查询列,通过selectProperties方法指定查询列
    	
    	方法:int selectCountByExample(Object example);
    	说明:根据Example条件进行查询总数
    	
    	方法:int updateByExample(@Param("record") T record, @Param("example") Object example);
    	说明:根据Example条件更新实体record包含的全部属性,null值会被更新
    	
    	方法:int updateByExampleSelective(@Param("record") T record, @Param("example") Object example);
    	说明:根据Example条件更新实体record包含的不是null的属性值
    	
    	方法:int deleteByExample(Object example);
    	说明:根据Example条件删除数据
    	 */
    }
    

    测试:

    package com.test;
    
    import java.util.List;
    
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    
    import com.domain.Order;
    import com.mapper.OrderMapper;
    
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration("classpath:applicationContext.xml")
    public class TestBySpring {
    	
    	@Autowired
    	OrderMapper Mapper;
    	
    	@Test
    	public void testCommonMapper() {
    		List<Order> list = Mapper.selectAll();
    		System.err.println(list);
    	} 
    }
  • 相关阅读:
    !clrstack未显示任何方法名
    !dumpheap参数和SOS帮助系统的一些一般信息
    WinDbg Script---显示RCW对象引用的COM对象
    为什么不能将2个调试器附加到1个进程
    什么是互操作调试(Interop-Debugging)?
    为什么托管调试与本机调试不同?
    在WinDBG中管理源代码窗口
    如何从转储文件确定 /LARGEADDRESSAWARE
    Dump文件数据存储格式(九)
    Windbg命令系列---!cpuid(CPU信息)
  • 原文地址:https://www.cnblogs.com/mzywucai/p/11053360.html
Copyright © 2011-2022 走看看