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);
    	} 
    }
  • 相关阅读:
    LeetCode120 Triangle
    LeetCode119 Pascal's Triangle II
    LeetCode118 Pascal's Triangle
    LeetCode115 Distinct Subsequences
    LeetCode114 Flatten Binary Tree to Linked List
    LeetCode113 Path Sum II
    LeetCode112 Path Sum
    LeetCode111 Minimum Depth of Binary Tree
    Windows下搭建PHP开发环境-WEB服务器
    如何发布可用于azure的镜像文件
  • 原文地址:https://www.cnblogs.com/mzywucai/p/11053360.html
Copyright © 2011-2022 走看看