通用Mapper

通用Mapper

1.SpringBoot整合通用Mapper

  1. 依赖

    <!--通用mapper起步依赖-->
            <dependency>
                <groupId>tk.mybatis</groupId>
                <artifactId>mapper-spring-boot-starter</artifactId>
                <version>2.0.4</version>
            </dependency>
            <!--MySQL数据库驱动-->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
            </dependency>
            <!--mybatis分页插件-->
            <dependency>
                <groupId>com.github.pagehelper</groupId>
                <artifactId>pagehelper-spring-boot-starter</artifactId>
                <version>1.2.3</version>
            </dependency>
    
  2. 实体类

    数据表如下:

    CREATE TABLE tb_brand (
      id int(11) NOT NULL AUTO_INCREMENT COMMENT '品牌id',
      name varchar(100) NOT NULL COMMENT '品牌名称',
      image varchar(1000) DEFAULT '' COMMENT '品牌图片地址',
      letter char(1) DEFAULT '' COMMENT '品牌的首字母',
      seq int(11) DEFAULT NULL COMMENT '排序',
      PRIMARY KEY (id) USING BTREE
    ) ENGINE=InnoDB AUTO_INCREMENT=325416 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='品牌表'
    

    对应的实体类如下:

    使用@Table(name=“表名”)来指定实体类对应的表

    使用 @Id来标识主键对应的属性

    使用@Column(name = “列名”)来解决实体类中属性名和数据库列名不对应的问题。如果相同可以不加@Column注解

    package com.fengke.pojo;
    
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    import javax.persistence.Id;
    import javax.persistence.Table;
    import java.io.Serializable;
    
    @Table(name="tb_brand")
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class Brand implements Serializable {
        @Id
        private Integer id;//品牌id
        @Column(name = "name")
        private String name;//品牌名称
        @Column(name = "image")
        private String image;//品牌图片地址
        private String letter;//品牌的首字母
        private Integer seq;//排序
    }
    
  3. 定义Mapper接口

    定义接口继承Mapper接口,接口的泛型为表所对应的实体类。注意Mapper的包

    package com.fengke.mapper;
    
    import com.fengke.pojo.Brand;
    import tk.mybatis.mapper.common.Mapper;
    
    public interface BrandMapper extends Mapper<Brand> {
    }
    
    
  4. 启动类

    在启动类上加上@MapperScan(basePackages = {“mapper所在的包”}) 来指定mapper所在的包

    @SpringBootApplication
    @MapperScan(basePackages = {"com.fengke.mapper"})
    public class DemoApplication {
        public static void main(String[] args) {
            SpringApplication.run(DemoApplication.class,args);
        }
    }
    
  5. 配置

    配置数据库信息

    spring:
      datasource:
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://192.168.210.128:3306/fengke_goods?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
        username: root
        password: root
    
  6. 测试

    自动注入mapper使用即可

    @RunWith(SpringRunner.class)
    @SpringBootTest(classes = DemoApplication.class)
    public class DemoTest {
    
        @Autowired
        private BrandMapper brandMapper;
    
        @Test
        public void testSelectAll(){
            List<Brand> brands = brandMapper.selectAll();
            System.out.println(brands);
        }
    }
    
    

2.单表

2.1查询所有

    @Autowired
    private BrandMapper brandMapper;

    @Test
    public void testSelectAll(){
        List<Brand> brands = brandMapper.selectAll();
        System.out.println(brands);
    }

2.2根据主键查询

    @Test
    public void testSelectById(){
        Brand brand = brandMapper.selectByPrimaryKey(2032);
        System.out.println(brand);
    }

2.3插入数据

insert和insertSelective方法的区别具体看注释。一般我们用insertSelective比较多

    @Test
    public void testInsert(){
        Brand brand = new Brand();
        brand.setName("戴森");
        /**
         * 相当于: insert into tb_brand (id,name,image,letter,seq) value (null,"戴森",null,null,null);
         */
        int insert = brandMapper.insert(brand);
        System.out.println(insert);
    }
    @Test
    public void testInsertSelective(){
        Brand brand = new Brand();
        brand.setName("戴森2");
        /**
         * 相当于: insert into tb_brand (name) value ("戴森");
         */
        int insert = brandMapper.insertSelective(brand);
        System.out.println(insert);

    }

2.4根据主键更新数据

具体区别看注释,我们一般用updateByPrimaryKeySelective

    @Test
    public void testUpdateByPrimaryKeySelective(){
        Brand brand = new Brand();
        brand.setId(325419);
        brand.setName("戴森3");
        /**
         * 相当于只修改了我们设置的字段
         * UPDATE tb_brand SET NAME = '戴森3' WHERE id = 325419
         */
        brandMapper.updateByPrimaryKeySelective(brand);
    }
    @Test
    public void testUpdateByPrimaryKey(){
        Brand brand = new Brand();
        brand.setId(325419);
        brand.setName("戴森3");
        /**
         * 相当于
            UPDATE tb_brand SET NAME = '戴森3',image = NULL,letter=NULL,seq=NULL WHERE id = 325419
         */
        brandMapper.updateByPrimaryKey(brand);
    }

2.5删除

    @Test
	//根据主键删除
    public void testDeleteByPrimaryKey(){
        int i = brandMapper.deleteByPrimaryKey(325418);
        System.out.println(i);
    }

    @Test
	//根据条件删除
    public void testDelete(){
        Brand brand = new Brand();
        brand.setId(325417);
        int i = brandMapper.delete(brand);
        System.out.println(i);
    }

2.6条件查询

/**
     * 条件查询
     */
    @Test
    public void testSelectByExample(){
        Brand brand = new Brand();
        brand.setName("迷你");
        brand.setLetter("M");
        Example example = new Example(Brand.class);
        Example.Criteria criteria = example.createCriteria();
        if (brand != null) {
            if(!StringUtils.isEmpty(brand.getName())){
                criteria.andLike("name","%"+brand.getName()+"%");
            }
            if(!StringUtils.isEmpty(brand.getLetter())){
                criteria.andEqualTo("letter",brand.getLetter());
            }
        }
        //SELECT id,name,image,letter,seq FROM tb_brand WHERE ( name like ? and letter = ? )  
        //Parameters: %迷你%(String), M(String)
        List<Brand> brands = brandMapper.selectByExample(example);
        System.out.println(brands);
    }

    //条件查询
    @Test
    public void selectExample(){
//        User u = new User();
//        u.setUserName("heima");
//        u.setName("锋科");
        Example example = new Example(User.class);
        //使用criteria去设置条件
        Example.Criteria criteria = example.createCriteria();
        //   and   user_name like ‘cj%’
        criteria.andLike("userName","ma%");
        // id in (1,2,3,4)
        criteria.andGreaterThan("age",28);
      
        //SELECT id,user_name,password,name,age,sex,birthday,created,updated,note FROM tb_user WHERE ( user_name like ? and age > ? )
        List<User> list = userMapper.selectByExample(example);
        System.out.println(list);
    }

2.7分页查询

    @Test
    /**
     * 分页查询
     */
    public void testSelectForPage(){
        PageHelper.startPage(1,10);
        Page<Brand> page = (Page<Brand>) brandMapper.selectAll();
        List<Brand> result = page.getResult();
        for (Brand brand : result) {
            System.out.println(brand);
        }
    }

2.8查询符合条件的个数

selectCount方法,根据条件查询符合条件的数据行数。

int count = categoryBrandMapper.selectCount(categoryBrand);

2.9插入数据时获取自增id

在pojo的id属性上加上@GeneratedValue(strategy= GenerationType.IDENTITY)
或者使用@KeySql(useGeneratedKeys = true)


public class User {
    @Id
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    private Integer id;
}

2.10忽略实体类中的自动

在字段上增加@Transient

3.多表/自定义sql

3.1在接口中增加方法


public interface UserMapper extends Mapper<User> {

    User selectMy();
}

3.2 在接口方法上使用注解定义sql /创建xml文件

注解方式(不推荐)

    @Select("select * from user where id = 7")
    User selectMy();

xml方式 注意:在配置文件中配置映射文件的位置

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.fengke.mapper.UserMapper">
    <select id="selectMy" resultType="com.fengke.pojo.User">
        select * from user where id = 7
    </select>
</mapper>
mybatis:
  mapper-locations: classpath:mapper/*Mapper.xml # mapper映射文件路径
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值