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条件删除数据 |
此篇到此为止
未完待续!!!请留意关注噢!!
请给努力中的自己点个赞哦!
每天进步一点点`~~~~~