七、分页实现
分页(Paging):即有很多数据,我们就需要分页来分割数据,可提高整体运行性能,增强用户使用体验需求等。
不使用分页将遇到的问题:
- 客户端问题:数据太多影响用户的体验感且也不方便操作查找,甚至出现加载太慢的问题。
- 服务器问题:数据太多会造成内存溢出,且对服务器的性能也不友好。
1️⃣limit分页
🍀语法
-- 语法:select * from xxx limit startIndex,pageSize select * from user limit 3;
mybatis的sql语句如果有多个参数,需要用map封装。
🍀Mapper接口
List<User> selectLimit(Map<String,Integer> map);
🍀xxxMapper.xml
<select id="selectLimit" parameterType="map" resultMap="UserMap"> select * from mybatis.user limit #{startIndex},#{pageSize} </select>
🍀测试
Test.java:
public class UserDaoTest { @Test public void limitTest(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); Map<String, Integer> map = new HashMap<String, Integer>(); map.put("startIndex",0); map.put("pageSize",2); List<User> list=mapper.selectLimit(map); for (User u: list) { System.out.println(u); } sqlSession.close(); } }
2️⃣RowBounds分页
这种方法官方不推荐。
🍀Mapper接口
List<User> selectRowBounds();
🍀xxxMapper.xml
<select id="selectRowBounds" resultMap="UserMap"> select * from mybatis.user </select>
🍀测试
@Test public void selectRowBounds(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); RowBounds rowBounds = new RowBounds(0,2); List<User> list = sqlSession.selectList("com.wang.dao.UserMapper.selectRowBounds" ,null,rowBounds); for (User user : list) { System.out.println(user); } sqlSession.close(); }
八、注解式开发
注解的本质是使用反射,底层是代理模式(见设计模式)。
使用注解来映射简单语句会使代码显得更加简洁,但对于稍微复杂一点的语句,Java 注解不仅力不从心,还会让你本就复杂的 SQL语句更加混乱不堪。
因此,如果你需要做一些很复杂的操作,最好用 XML 来映射语句。
1️⃣注解式查找
🍀Mapper接口
@Select("select * from mybatis.user") List<User> selectAll();
注册绑定
mybatis-config.xml:
<mappers> <mapper class="com.wang.dao.UserMapper"/> </mappers>
🍀测试
@Test public void selectAll(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); //底层主要应用反射 UserMapper mapper = sqlSession.getMapper(UserMapper.class); List<User> list=mapper.selectAll(); for (User user : list) { System.out.println(user); } sqlSession.close(); }
2️⃣注解式CRUD
🍀设置自动提交
MybatisUtils.java:
public static SqlSession getSqlSession(){ return sqlSessionFactory.openSession(true); }
🍀Mapper接口
//多个参数情况下,有两种解决方式,一个map封装,另一种是注解Param @Select("select * from mybatis.user where id=#{id}") User selectUserById(@Param("id") int id); @Select("select * from mybatis.user") List<User> selectAll(); @Insert("insert into mybatis.user() values(#{id},#{name},#{password}) ") boolean insertUser(User u); @Update("update user set name=#{name},pwd=#{password} where id = #{id}") boolean updateUser(User u); @Delete("delete from mybatis.user where id=#{id}") boolean deleteUser(@Param("id") int id);
🍀测试
@Test public void selectAll(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); //底层主要应用反射 UserMapper mapper = sqlSession.getMapper(UserMapper.class); // List<User> list=mapper.selectAll(); // for (User user : list) { // System.out.println(user); // } /** User u=mapper.selectUserById(1); System.out.println(u); */ // boolean isInserted=mapper.insertUser(new User(4,"图拉真","dgsdgs")); // if (mapper.updateUser(new User(6,"寒江雪",null))) if (mapper.deleteUser(6)) for (User user : mapper.selectAll()) { System.out.println(user); } sqlSession.close(); }
3️⃣@Param注解
这个注解是为SQL语句中参数赋值而服务的。@Param的作用就是给参数命名,比如在mapper里面某方法A(int id),当添加注解后A(@Param(“userId”) int id),也就是说外部想要取出传入的id值,只需要取它的参数名userId就可以了。将参数值传如SQL语句中,通过#{userId}进行取值给SQL的参数赋值。
基本类型的参数和String类型,需要加上这个注解
引用类型不需要加
如果只有一个基本类型的参数,可以省略
我们在sql中引用的就是@Param(“xxx”)中设定的属性名
实例一:@Param注解基本类型的参数
🍀Mapper接口
public User selectUser(@Param("userName") String name,@Param("password") String pwd);
🍀xxxMapper.xml
<select id="selectUser" resultMap="User"> select * from user where user_name = #{userName} and user_password=#{password} </select>
其中where user_name = #{userName} and user_password = #{password}中的userName和password都是从注解@Param()里面取出来的,取出来的值就是方法中形式参数 String name 和 String pwd的值。
实例二:@Param注解JavaBean对象
SQL语句通过@Param注解中的别名把对象中的属性取出来然后复制
public List<User> getAllUser(@Param("user") User u);
🍀xxxMapper.xml
<select id="getAllUser" parameterType="com.vo.User" resultMap="userMapper"> select from user t where 1=1 and t.user_name = #{user.userName} and t.user_age = #{user.userAge} </select>
注意点:
当使用了@Param注解来声明参数的时候,SQL语句取值使用#{},${}取值都可以。
当不使用@Param注解声明参数的时候,必须使用的是#{}来取参数。使用${}方式取值会报错。
不使用@Param注解时,参数只能有一个,并且是Javabean。在SQL语句里可以引用JavaBean的属性,而且只能引用JavaBean的属性。
九、Lombok插件使用
Lombok是一个可以通过简单的注解形式来帮助我们简化消除一些必须有但显得很臃肿的Java代码的工具,通过使用对应的注解,可以在编译源码的时候生成对应的方法。
1️⃣Lombok安装
🍀(1)IDEA左上角File->Settings->Plugins
🍀(2)搜索Lombok,下载安装
🍀(3)导入maven
pom.xml:
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.10</version> </dependency>
2️⃣使用Lombok
Lombok的支持:
@Getter and @Setter @FieldNameConstants @ToString @EqualsAndHashCode @AllArgsConstructor, @RequiredArgsConstructor and @NoArgsConstructor @Log, @Log4j, @Log4j2, @Slf4j, @XSlf4j, @CommonsLog, @JBossLog, @Flogger, @CustomLog @Data @Builder @SuperBuilder @Singular @Delegate @Value @Accessors @Wither @With @SneakyThrows @val @var experimental @var @UtilityClass Lombok config system Code inspections Refactoring actions (lombok and delombok)
常用支持:
@Data支持: 无参构造,getter&setter,toString,hashCode,equals
@AllArgsConstructor: 有参构造
@NoArgsConstructor: 无参构造
使用方法:
在具体的实体类上加相应的注解。