通用Mapper
1、通用Mapper的使用
1.0、实体类
@Table(name = "tb_user")
public class User { @Id
@GeneratedValue(generator = "JDBC")
private Long id;
// 用户名
private String userName;
// 密码
private String password;
// 姓名
private String name;
// 年龄
private Integer age;
// 性别,1男性,2女性
private Integer sex;
// 出生日期
private Date birthday;
// 创建时间
private Date created;
// 更新时间
private Date updated;
//set、get方法.... }
泛型(实体类)<T>的类型必须符合要求
1、表名默认使用类名,驼峰转下划线(只对大写字母进行处理),如UserInfo默认对应的表名为user_info。 2、表名可以使用@Table(name = "tableName")进行指定,对不符合第一条默认规则的可以通过这种方式指定表名. 3、字段默认和@Column一样,都会作为表字段,表字段默认为Java对象的Field名字驼峰转下划线形式. 4、可以使用@Column(name = "fieldName")指定不符合第3条规则的字段名 5、使用@Transient注解可以忽略字段,添加该注解的字段不会作为表字段使用. 6、建议一定是有一个@Id注解作为主键的字段,可以有多个@Id注解的字段作为联合主键. 获取自增主键: //不限于@Id注解的字段,但是一个实体类中只能存在一个(继承关系中也只能存在一个)
@GeneratedValue(generator = "JDBC")
private Integer id;
这会令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法来取出由数据库内部生成的主键(比如:像 MySQL 和 SQL Server 这样的关系数据库管理系统的自动递增字段)。
1.1、导入依赖
<!-- 通用mapper -->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>2.0.2</version>
</dependency>
1.2、开启包扫描
注意导入的包,一定要和导入的的依赖有关的包
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import tk.mybatis.spring.annotation.MapperScan; @SpringBootApplication
@MapperScan("com.myx.demo.mapper")
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class);
}
}
1.3、UserMapper接口继承通用Mapper
package com.myx.demo.mapper;
import com.myx.demo.pojo.User;
import tk.mybatis.mapper.common.Mapper; public interface UserMapper extends Mapper<User>{ }
1.4、SpringBoot默认的文件名Application.yml配置
server:
port: 8080 logging:
level:
com.myx.demo:
debug
spring:
datasource: #spring数据源的配置
url: jdbc:mysql://localhost:3306/day11mybatis
username: root
password: 123
1.5、通用Mapper的测试类
@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
public class NewUserMapperTest { @Autowired
private UserMapper userMapper; }
1.5.1 id 的专用查询方法
@Test
public void testSelectId() {
userMapper.selectByPrimaryKey(1L);//id专用查询方法
System.out.println( userMapper.selectByPrimaryKey(1L));
}
1.5.2 属性查询
@Test
public void testSelectName() {
User user = new User();
user.setName("张三");//哪个属性有值where条件就根据哪个属性生成,id除外
List<User> select = userMapper.select(user);
System.out.println(select);
}
1.5.3 属性值唯一查询
@Test
public void testSelectOne() {
User user = new User();
user.setUserName("zhangsan");//查询值有多个会报错 System.out.println(userMapper.selectOne(user)); }
1.5.4 统计个数
@Test
public void testSelectCount() {
System.out.println(userMapper.selectCount(null));//没有查询条件就全查
}
1.5.5 插入
@Test
public void testInsert() {
User user = new User();
user.setUserName("孙悟空");
user.setName("sunwukong");
user.setAge(500);
user.setId(50L);
user.setPassword("234");
int insert = userMapper.insert(user);
System.out.println(insert);
}
1.5.6 selective插入
/*
* insertSelective方法:有值才操作,没有值不理会,比上insert方法效率高
* */
@Test
public void testInsertSelective() {
User user = new User();
user.setUserName("猪八戒");
user.setName("sunwukong");
user.setAge(500);
user.setId(51L);
user.setPassword("234");
user.setCreated(new Date());
int insert = userMapper.insertSelective(user);
System.out.println(insert);
}
1.5.7 删除
@Test
public void testDelete() {
User user = new User();
user.setUserName("孙悟空");
int delete = userMapper.delete(user);
System.out.println(delete);
}
1.5.8 根据id删除,主键的特有方法
@Test public void testDeleteByPrimaryKey() { userMapper.deleteByPrimaryKey(51L); }
1.5.9 修改
/*
* 指定的属性改变为指定的值,其余的为null
* */
@Test
public void testUpdateByPrimaryKey() {
User user = new User();
user.setId(36L);
user.setUserName("李白");
user.setName("libai"); userMapper.updateByPrimaryKey(user);
}
1.5.10 selecttive修改
/*
* 只改变指定的属性,其余属性不变
* */
@Test
public void testUpdatePriimarySelective() {
User user = new User();
user.setId(33L);
user.setUserName("王昭君");
user.setName("wangzhaojun");
user.setUpdated(new Date());
userMapper.updateByPrimaryKeySelective(user);
}
2 通用Mapper分页
2.1 分页的依赖
<!--分页的依赖-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.3</version>
</dependency>
2.2 分页方法的测试
@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class) public class MapperPageQueryTest {
@Autowired
private UserMapper userMapper; @Test
public void testPageQuery() {
//开启分页
PageHelper.startPage(3,5);
//不包含总的页数,总的元素个数
List<User> select = userMapper.select(null);
System.out.println(select);
} @Test
public void testPageInfoQuery() {
//开启分页
PageHelper.startPage(3,5);
//用page类型或者pageInfo类型目的就是获取总页数以及总条数
Page<User> userPage = (Page<User>) userMapper.select(null);
//分页返回的结果
//PageInfo<User> pageInfo = new PageInfo<>(select);
System.out.println(userPage);
}
}
3 通用Mapper组合查询和排序
3.1 添加普通条件
/*
* example要表达的含义为???
* 组合的查询条件
* */
@Test
public void testSelectByExample(){
//条件的组合工具
Example example = new Example(User.class);
//条件,一个criteria中可以组合无数个条件,但是这些条件都是and关系
Example.Criteria criteria = example.createCriteria();
criteria.andEqualTo("sex","1");
criteria.andBetween("age",20,30);
List<User> users = userMapper.selectByExample(example);
System.out.println("users = " + users); }
3.2 添加or条件的组合查询
@Test
public void testSelectByExampleOr(){
//条件的组合工具
Example example = new Example(User.class);
//条件,一个criteria中可以组合无数个条件,但是这些条件都是and关系
Example.Criteria criteria = example.createCriteria();
criteria.andEqualTo("sex","1");
Example.Criteria criteria1 = example.createCriteria();
criteria1.andLike("name","%李%");
//直接使用example的or方法使得第二个条件和原来的条件组合or关系
example.or(criteria1);
System.out.println(userMapper.selectByExample(example)); }
3.3 排序
@Test
public void testSelectByExampleOrder(){
//条件的组合工具
Example example = new Example(User.class);
//条件,一个criteria中可以组合无数个条件,但是这些条件都是and关系
Example.Criteria criteria = example.createCriteria();
criteria.andEqualTo("sex","1");
Example.Criteria criteria1 = example.createCriteria();
criteria1.andLike("name","%李%");
//直接使用example的or方法使得第二个条件和原来的条件组合or关系
example.or(criteria1);
//排序
example.setOrderByClause("id DESC");
System.out.println(userMapper.selectByExample(example)); }