Mybatis的分页和注解
Mybatis分页
分页:减少数据的处理量
1.使用limit分页(sql层面)
select * from user limit startPage,pageSize; #设置分页的规格
select * from user limit n; #[0,n]调记录
1.接口
2.Mapper.xml
<select id="getUserByLimit" parameterType="map" resultType="User">
select * from user limit #{startPage},#{pageSize}
</select>
3.测试
@Test
public void getUserByLimit(){
HashMap<String, Integer> map = new HashMap<>();
map.put("startPage",0);
map.put("pageSize",2);
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> user = mapper.getUserByLimit(map);
sqlSession.commit();
for (User user1 : user) {
System.out.println(user1.getId() + " "+ user1.getName());
}
sqlSession.close();
}
2.使用RowBounds分页(java层面)
1.接口
2.Mapper.xml
<select id="getUserByRowBounds" resultType="User">
select *from user;
</select>
3.测试
@Test
void getUserByRowBounds(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
RowBounds rowBounds = new RowBounds(1, 2);
List<User> userList = sqlSession.selectList("com.Gw.dao.UserMapper.getUserByRowBounds",null,rowBounds);
for (User user : userList) {
System.out.println(user.getId()+" "+user.getName() + " " +user.getPassword());
}
sqlSession.close();
}
使用注解开发
1.面向接口编程
各个对象内部是如何实现自己的,对系统设计人员来讲就不那么重要了;而各个对象之间的协作关系则成为系统设计的关键。
1.关于接口的理解。
接口从更深层次的理解,应是定义(规范,约束)与实现(名实分离的原则)的分离。
接口的本身反映了系统设计人员对系统的抽象理解。
2.任何接口都是在一定的环境中产生的。因此环境的定义及环境的变化对接口的影响是不容忽视的,脱离原先的环境,所有的接口将失去原有的意义。
底层本质应用反射,底层使用动态代理,将xml中的方法实现注解中,因此只适用于简单的sql语句
1.注解在接口上实现
public interface UserMapper {
@Select("select * from user")
List<User> showTable();
}
2.在配置文件中注册该接口
<mappers>
<mapper class="com.Gw.dao.UserMapper"/>
</mappers>
3.测试代码
@Test
void test(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> userList = mapper.showTable();
for (User user : userList) {
System.out.println(user.getId()+" "+user.getName()+" " +user.getPassword());
}
sqlSession.close();
}
2.CRUD
可以在工具类创建时实现自动提交事务,将SqlSession设置为true
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession(true);
}
编写接口及其对应的注解(注意接口必须在配置中注册)
@Select("select * from user where id = #{id}")
List<User> showTable(@Param("id") int id);
@Insert("insert into user(id,name,pwd) values (#{id},#{name},#{pwd})")
int addUser(@Param("id") int id, @Param("name") String name, @Param("pwd") String pwd);
@Update("update user set name=#{newName} where id=5")
int updateName(@Param("newName") String newName);
@Delete("delete from user where id = #{id}")
int deleteUserById(int id);
测试使用
@Test
void test(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
mapper.addUser(5,"tets","123456");
mapper.updateName("张三");
mapper.deleteUserById(5);
sqlSession.close();
}
3.@Param()注解
- 基本类型的参数或者String类型需加上
- 引用类型不需要加
- 如果只有一个基本类型可以省略
- 在sql用引用的就是@Param()中的值
Lombok
1.安装插件
2.导入jar包
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
<scope>provided</scope>
</dependency>
3.在实体类上加注解
@Getter and @Setter
@ToString
@EqualsAndHashCode
@AllArgsConstructor, @RequiredArgsConstructor and @NoArgsConstructor
@Log, @Log4j, @Log4j2, @Slf4j, @XSlf4j, @CommonsLog, @JBossLog, @Flogger, @CustomLog
@Data
@Builder
@Singular
@Delegate
@Value
@Accessors
@Wither
@SneakyThrows
@Data:无参构造、get和set方法、toString、hashCode、equals
@AllArgsConstructor、@NoArgsConstructor:有参无参构造
package com.Gw.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private int id;
private String name;
private String password;
}
使用效果: