超容易掌握并使用的Mybatis之通用Mapper(五)

Mybatis(五)

一.MyBatis-通用Mapper

1. 简述及环境搭建

通用Mapper为了简化MyBatis通用的增删改查

1、确定数据库已经创建

2、导入jar包和核心配置文件

3、创建package包,导入MyBatisUtils工具

4、定义JavaBean

Person类:(若没有@Id,通用Mapper中,所有涉及主键操作全报废)

          (若没有@Table,默认对应Person表)

@Table(name="user")
public class Person implements Serializable {
    @Id
    private Integer uid;
    private String username;
    private Date birthday;
    private String sex;
    private String address;

    //get/set/有参/无参/toString

}

5、定义Dao继承Mapper,注册Dao

import tk.mybatis.mapper.common.Mapper;

public interface PersonDao extends Mapper<Person> {
}

  • 案例1:通过主键做查询

测试类:

/**
 * 通用Mapper:根据主键查询某个用户信息
 * uid=6
 */
@Test
public void run1(){
    //1、获取Dao对象
    PersonDao dao = MyBatisUtils.getMapper(PersonDao.class);
    //2、调用Dao对象
    Person person = dao.selectByPrimaryKey(6);
    System.out.println(person);
    //3、关闭会话
    MyBatisUtils.close();
}

小结:

默认通过JavaBean名称,寻找表名。(解决:@Table(name=”表名”))

  • 案例2:查询所有

  • 测试类:

/**
 * 通用Mapper:查询所有
 */
@Test
public void run2(){
    //1、获取Dao对象
    PersonDao dao = MyBatisUtils.getMapper(PersonDao.class);
    //2、调用Dao对象
    List<Person> plist = dao.selectAll();
    for (Person person : plist) {
        System.out.println(person);
    }
    //3、关闭会话
    MyBatisUtils.close();
}

  • 案例3:分页查询

查询所有数据,展示第二页,一页展示4条

测试类:

/**
 * 通用Mapper:查询所有数据,展示第二页,一页展示4条
 */
@Test
public void run3(){
    //1、获取Dao对象
    PersonDao dao = MyBatisUtils.getMapper(PersonDao.class);
    //2、先设置分页
    PageHelper.startPage(2,4);
    //3、再进行查询
    List<Person> plist = dao.selectAll();
    //4、最后进行封装
    PageInfo<Person> pi = new PageInfo<>(plist);
    for (Person person : pi.getList()) {
        System.out.println(person);
    }
    //5、关闭会话
    MyBatisUtils.close();
}

二. MyBatis-分号问题

从Mybatis的分页开始,Mybatis会自动为程序员的sql语句追加语句信息。

如果拼接了;, ;会拼接到语句中间,会造成报错。

建议从分页开始,语句后面不要加;

三.Mysql-原生分页语句

Mysql自带分页语句:   拼接在查询语句的末尾

limit 参数1,参数2;

参数1:查询的起始索引

参数2:一页查询多少条数据

程序员会设置PageHelper.startPage(当前页,一页展示多少条记录);

起始索引Mybatis会进行计算:

起始索引 = (当前页-1)*一页展示多少条记录

分页:

物理分页:在MySQL数据库中使用limit进行分页。

(Mybatis的分页,属于物理分页)

慢,但是占用内存低

逻辑分页:把数据全部查询到内存中,在内存中进行分页  (redis)

快,但是占用内存高

  • 案例4:添加

/**
 * 案例4:添加一条数据
 */
@Test
public void run4(){
    //1、获取Dao对象
    UserDao dao = MyBatisUtils.getMapper(UserDao.class);
    //2、调用Dao方法
    User user = new User(null, "煌sir", new Date(), "男", "阿波罗");
    int row = dao.insert(user);
    System.out.println(row);
    MyBatisUtils.commitAndClose();
}

  • 案例5:根据ID修改

/**
 * 案例5:修改一条数据
 * 根据UID 修改数据
 */
@Test
public void run5(){
    //1、获取Dao对象
    UserDao dao = MyBatisUtils.getMapper(UserDao.class);
    //2、调用Dao方法
    User user = new User(11, "小煌",null, null, null);
    //updateByPrimaryKey  根据主键ID,修改这条数据的所有内容,包括赋值为null
    //int row = dao.updateByPrimaryKey(user);
    // updateByPrimaryKeySelective根据主键ID,修改这条数据,如果某个字段赋值为null,忽略该字段不修改
    int row = dao.updateByPrimaryKeySelective(user);
    System.out.println(row);
    MyBatisUtils.commitAndClose();
}

  • 案例6:根据ID删除

/**
 * 案例6:删除一条数据
 * 根据UID 删除数据
 */
@Test
public void run6(){
    //1、获取Dao对象
    UserDao dao = MyBatisUtils.getMapper(UserDao.class);
    //2、调用Dao方法
    int row = dao.deleteByPrimaryKey(8);
    System.out.println(row);
    MyBatisUtils.commitAndClose();
}

  • ​​​​​​​案例7:多条件查询(模糊、等于、区间)

需求:用户名包含“小” 并且 性别为“男” 并且 出生日期在“2018-01-01”~“2018-04-01”

/**
 * 案例7:用户名包含“小” 并且 性别为“男”
 *      并且 出生日期在“2018-01-01”~“2018-04-01”
 */
@Test
public void run7(){
    //1、获取Dao对象
    UserDao dao = MyBatisUtils.getMapper(UserDao.class);
    //2、调用Dao方法
    //2.1、创建条件对象
    Example example = new Example(User.class);
    Example.Criteria c = example.createCriteria();
    //2.2、拼接条件  第一个条件一定用and
    c.andLike("username","%小%");
    c.andEqualTo("sex","男");
    c.andBetween("birthday","2018-01-01","2018-04-01");
    //2.3、条件查询
    List<User> ulist = dao.selectByExample(example);
    System.out.println(ulist);
    //3、关闭会话
    MyBatisUtils.close();
}

  • ​​​​​​​​​​​​​​案例8:多条件查询(in和非空)

需求:查询用户ID为1或3或5的数据,并且要求地址不能为空

/**
 * 案例8:需求:查询用户ID为1或3或5的数据,并且要求地址不能为空
 */
@Test
public void run8(){
    //1、获取Dao对象
    UserDao dao = MyBatisUtils.getMapper(UserDao.class);
    //2、调用Dao方法
    //2.1、创建条件对象
    Example example = new Example(User.class);
    Example.Criteria c = example.createCriteria();
    //2.2、拼接条件
    //uid in (1,3,5)
    List<Integer> list = new ArrayList<>();
    Collections.addAll(list,1,3,5);
    c.andIn("uid",list);
    c.andIsNotNull("address");
    //2.3、条件查询
    List<User> ulist = dao.selectByExample(example);
    System.out.println(ulist);
    //3、关闭会话
    MyBatisUtils.close();
}

  • ​​​​​​​案例9:多条件查询(or)

需求:查询用户名为“管理员” 或者 性别为“女”的所有数据

/**
 * 案例9:需求:查询用户名为“管理员” 或者 性别为“女”的所有数据
 */
@Test
public void run9(){
    //1、获取Dao对象
    UserDao dao = MyBatisUtils.getMapper(UserDao.class);
    //2、调用Dao方法
    //2.1、创建条件对象
    Example example = new Example(User.class);
    Example.Criteria c = example.createCriteria();
    //2.2、拼接条件
    c.andEqualTo("username","管理员");
    c.orEqualTo("sex","女");
    //2.3、条件查询
    List<User> ulist = dao.selectByExample(example);
    System.out.println(ulist);
    //3、关闭会话
    MyBatisUtils.close();
}

  • ​​​​​​​​​​​​​​案例10:查询排序

继续上一个案例,对查询结果进行排序

/**
 * 案例10:排序
 */
@Test
public void run10(){
    //1、获取Dao对象
    UserDao dao = MyBatisUtils.getMapper(UserDao.class);
    //2、调用Dao方法
    //2.1、创建条件对象
    Example example = new Example(User.class);
    Example.Criteria c = example.createCriteria();
    //2.2、拼接条件
    c.andEqualTo("username","管理员");
    c.orEqualTo("sex","女");
    //排序  根据 uid 降序排序
    example.setOrderByClause(" uid desc ");
    //2.3、条件查询
    List<User> ulist = dao.selectByExample(example);
    System.out.println(ulist);
    //3、关闭会话
    MyBatisUtils.close();
}

  • ​​​​​​​案例11:多条件查询+排序+分页查询

需求:

进行条件+分页查询。   查询第一页,一页展示2条记录

条件: 性别为”男” 或 姓名包含”小” 或 生日在”2018-01-01” ~ “2018-05-01”

对生日进行降序排序

/**
 * 案例11:
 进行条件+分页查询。   查询第一页,一页展示2条记录
 条件: 性别为”男” 或 姓名包含”小” 或 生日在”2018-01-01” ~ “2018-05-01”
 对生日进行降序排序
 */
@Test
public void run11(){
    //1、获取Dao对象
    UserDao dao = MyBatisUtils.getMapper(UserDao.class);
    //2、调用Dao方法
    //2.1、使用分页助手,开启分页
    PageHelper.startPage(1,2);
    //2.2、创建条件对象
    Example example = new Example(User.class);
    Example.Criteria c = example.createCriteria();
    //2.3、拼接条件
    c.andEqualTo("sex","男");
    c.orLike("username","%小%");
    c.orBetween("birthday","2018-01-01","2018-05-01");
    //2.4、排序
    example.setOrderByClause(" birthday desc ");
    //2.5、条件查询
    List<User> ulist = dao.selectByExample(example);
    //2.6、封装分页数据
    PageInfo<User> pi = new PageInfo<>(ulist);
    for (User user : pi.getList()) {
        System.out.println(user);
    }
    //3、关闭会话
    MyBatisUtils.close();
}

  • ​​​​​​​案例12:批量删除

删除uid为12或13或14或15的数据

/**
 * 条件删除:删除uid=12,13,14,15
 */
@Test
public void run12(){
    //1、获取Dao对象
    UserDao dao = MyBatisUtils.getMapper(UserDao.class);
    //2、调用Dao方法
    //2.1、创建条件对象
    Example example = new Example(User.class);
    Example.Criteria c = example.createCriteria();
    //2.2、拼接条件
    List<Integer> ids = new ArrayList<>();
    Collections.addAll(ids,12,13,14,15);
    c.andIn("uid",ids);
    //2.3、条件删除
    int row = dao.deleteByExample(example);
    System.out.println(row);
    //3、提交事务并关闭会话
    MyBatisUtils.commitAndClose();
}

​​​​​​​总结

  • 查询方法

方法名

描述

T selectOne(T t)

根据实体中的属性进行查询,只能有一个返回值,有多个结果是抛出异常,查询条件使用等号

List<T> select(T t)

根据实体中的属性值进行查询,查询条件使用等号

List<T> selectAll()

查询全部结果

int selectCount(T t)

根据实体中的属性查询总数,查询条件,使用等号

T selectByPrimaryKey(Object key)

根据主键字段进行查询 

boolean existsWhithPrimaryKey(Object key)

根据主键字段查询记录是否存在

List<T> selectByExample(Object example)

根据Example条件进行查询

T selectOneByExample(Object example)

根据Example条件进行查询,只能有一个返回值

int selectCountByExample(Object example)

根据Example条件进行查询记录数

  • 插入方法

方法名

描述

int insert(T t)

保存一个实体,设置为null的属性会作为null保存,不使用该字段默认值

int intsertSelective(T t)

保存一个实体,设置为null的属性不会直接保存null,而是先尝试使用数据库默认值保存   

  • 更新方法

方法名

描述

int updateByPrimaryKey(T t)

根据主键更新实体全部字段,若属性设置为null,则该字段的值更新为null

int updateByPrimaryKeySelective(T t)

根据主键更新实体,若属性设置为null,则忽略该属性

  • 删除方法

方法名

描述

int delete(T t)

根据实体属性作为条件进行删除,查询条件使用等号

int deletePrimaryKey(Object key)

根据主键字段进行删除

int deleteByExample(Object example)

根据Example条件删除数据

此篇到此为止

未完待续!!!请留意关注噢!! 

​​​​​​​

请给努力中的自己点个赞哦!

每天进步一点点`~~~~~

猜你喜欢

转载自www.cnblogs.com/1994jinnan/p/12757699.html
今日推荐