通用Mapper
1.SpringBoot整合通用Mapper
-
依赖
<!--通用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>
-
实体类
数据表如下:
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;//排序 }
-
定义Mapper接口
定义接口继承Mapper接口,接口的泛型为表所对应的实体类。注意Mapper的包
package com.fengke.mapper; import com.fengke.pojo.Brand; import tk.mybatis.mapper.common.Mapper; public interface BrandMapper extends Mapper<Brand> { }
-
启动类
在启动类上加上@MapperScan(basePackages = {“mapper所在的包”}) 来指定mapper所在的包
@SpringBootApplication @MapperScan(basePackages = {"com.fengke.mapper"}) public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class,args); } }
-
配置
配置数据库信息
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
-
测试
自动注入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映射文件路径