• Mybatis02


    接上期来讲,我们实现了maven的运行,这期我们继续来接下看。

    1.怎么获取到Sqlsession?

    我们在我们测试用的test/java中可以测(记得选择JUnit4的版本)

    选中要使用的方法setUP()、tearDown(),如下这样写

    1. @Before
    2. public void setUp() throws Exception {
    3. //获取sqlsession
    4. sqlSession = MybatisSqlSessionFactory.getSqlSession();
    5. UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    6. UserServiceImpl userServiceImpl =
    7. new UserServiceImpl();
    8. userServiceImpl.setUserMapper(mapper);
    9. userService = userServiceImpl;
    10. user = new User();
    11. }
    12. @After
    13. public void tearDown() throws Exception {
    14. //sqlsession提交
    15. sqlSession.commit();
    16. //关闭sqlsession
    17. MybatisSqlSessionFactory.closeSqlSession();
    18. }

    获取到我们的sqlsession后我们就对其DAO层的方法进行操作

    例如我们实现一个查询所有的方法,我们运行测试类中的查询所有方法(需要自己写,自动生成不包括)

    1. @Test
    2. public void listUser() {
    3. //需要用到的实体类 如需模糊查询可设置uname属性
    4. UserVo userVo = new UserVo();
    5. //调用service中的listUser(模糊查询方法)
    6. List users = userService.listUser(userVo);
    7. //遍历输出
    8. for (User user1 : users) {
    9. System.out.println(user1);
    10. }
    11. }

    输出结果:

    2.resultMap与resultType的区别

     

    3.怎么实现动态sql分页

            3.1 动态sql(可变的sql语句) 例如

            

    #{uname} 在编译后会给uname添加上双引号例如: "小明" 注:为了防止sql注入尽量用# 不用$(el表达式)

    MyBatis中#和$的区别
    1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。
       如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by '111', 
           如果传入的值是id,则解析成的sql为order by "id".

    2. $将传入的数据直接显示生成在sql中。
       如:order by $user_id$,如果传入的值是111,那么解析成sql时的值为order by user_id,
           如果传入的值是id,则解析成的sql为order by id.
     
    3. #方式能够很大程度防止sql注入。
     
    4. $方式无法防止Sql注入。
     
    5. $方式一般用于传入数据库对象,例如传入表名. 
     
    6. 一般能用#的就别用$. 

    这种可变的sql语句就是动态sql

            3.2动态sql属性(即sql标签上的属性)

                      3.2.1 if

                      3.2.2 trim 用于取出sql语句中多余的关键字,逗号,或者拼接
                       prefix     拼接前缀
                       suffix     拼接后缀
                       prefixOverrides     去掉sql语句前面的关键字或者字符,比如and
                       suffixOverrides     去掉sql语句后面的关键字或者字符
                      3.2.3 foreach  BookVo 
                       item  集合中每一个元素进行迭代时的别名
                       index表示迭代过程中,每次迭代到的位置
                       open表示语句以什么开始
                       separator每次进行迭代之间以什么符号作为分隔符
                       close以什么结束
                       1.4 其它

                            choose/set/where(自行查资料)

            3.3 分页查询

                    1.为什么要重写mybatis的分页

                            Mybatis的分页功能很弱,它是基于内存的分页(查出所有记录再按偏移量offset和边界limit取结果),在大数据量的情况下这样的分页基本上是没有用的
       

                    2.导入分页的插件

    1. <dependency>
    2. <groupId>com.github.pagehelpergroupId>
    3. <artifactId>pagehelperartifactId>
    4. <version>5.1.2version>
    5. dependency>

                     3. 将pagehelper插件配置到mybatis中

                            
                            在mybatis配置文件中的environment标签之前配置plugins
                           

         

                    4.在你需要进行分页的Mybatis方法前调用PageHelper.startPage静态方法即可,紧跟在这个方法后的第一个Mybatis查询方法会被进行分页 

    1. @Test
    2. public void listUser() {
    3. UserVo userVo = new UserVo();
    4. PageHelper.startPage(1,2);
    5. List<User> users = userService.listUser(userVo);
    6. for (User user1 : users) {
    7. System.out.println(user1);
    8. }
    9. }

            输出结果:

                    

     这样我们的分页效果就已经实现了,那我们怎么拿到我们的分页信息呢

                    5. 获取分页信息(二种方式)
          
                         5.1 使用插件后,查询实际返回的是Page,而非List,Page继承了ArrayList,同时还包含分页相关的信息
                      Page page = (Page)list;
                      System.out.println("页码:" + page.getPageNum());
                      System.out.println("页大小:" + page.getPageSize());
                      System.out.println("总记录:" + page.getTotal());
                         5.2 使用PageInfo
                      PageInfo pageInfo = new PageInfo(list);
                      System.out.println("页码:" + pageInfo.getPageNum());
                      System.out.println("页大小:" + pageInfo.getPageSize());
                      System.out.println("总记录:" + pageInfo.getTotal());

    1. @Test
    2. public void listUser() {
    3. UserVo userVo = new UserVo();
    4. PageHelper.startPage(1,2);
    5. List<User> users = userService.listUser(userVo);
    6. for (User user1 : users) {
    7. System.out.println(user1);
    8. }
    9. PageInfo pageInfo = new PageInfo(users);
    10. System.out.println("页码:" + pageInfo.getPageNum());
    11. System.out.println("页大小:" + pageInfo.getPageSize());
    12. System.out.println("总记录:" + pageInfo.getTotal());
    13. }

     输出结果:

                    6.了解怎么实现的分页 

                            我们copy两个帮助类(PageBean.java/PageBeanAspect.java)放入util

                            PageBean.java   

    1. package com.zking.pagination.entity;
    2. import java.io.Serializable;
    3. import java.util.Map;
    4. import javax.servlet.http.HttpServletRequest;
    5. public class PageBean implements Serializable {
    6. private static final long serialVersionUID = 2422581023658455731L;
    7. //页码
    8. private int page=1;
    9. //每页显示记录数
    10. private int rows=10;
    11. //总记录数
    12. private int total=0;
    13. //是否分页
    14. private boolean isPagination=true;
    15. //上一次的请求路径
    16. private String url;
    17. //获取所有的请求参数
    18. private Map map;
    19. public PageBean() {
    20. super();
    21. }
    22. //设置请求参数
    23. public void setRequest(HttpServletRequest req) {
    24. String page=req.getParameter("page");
    25. String rows=req.getParameter("rows");
    26. String pagination=req.getParameter("pagination");
    27. this.setPage(page);
    28. this.setRows(rows);
    29. this.setPagination(pagination);
    30. this.url=req.getContextPath()+req.getServletPath();
    31. this.map=req.getParameterMap();
    32. }
    33. public String getUrl() {
    34. return url;
    35. }
    36. public void setUrl(String url) {
    37. this.url = url;
    38. }
    39. public Map getMap() {
    40. return map;
    41. }
    42. public void setMap(Map map) {
    43. this.map = map;
    44. }
    45. public int getPage() {
    46. return page;
    47. }
    48. public void setPage(int page) {
    49. this.page = page;
    50. }
    51. public void setPage(String page) {
    52. if(null!=page&&!"".equals(page.trim()))
    53. this.page = Integer.parseInt(page);
    54. }
    55. public int getRows() {
    56. return rows;
    57. }
    58. public void setRows(int rows) {
    59. this.rows = rows;
    60. }
    61. public void setRows(String rows) {
    62. if(null!=rows&&!"".equals(rows.trim()))
    63. this.rows = Integer.parseInt(rows);
    64. }
    65. public int getTotal() {
    66. return total;
    67. }
    68. public void setTotal(int total) {
    69. this.total = total;
    70. }
    71. public void setTotal(String total) {
    72. this.total = Integer.parseInt(total);
    73. }
    74. public boolean isPagination() {
    75. return isPagination;
    76. }
    77. public void setPagination(boolean isPagination) {
    78. this.isPagination = isPagination;
    79. }
    80. public void setPagination(String isPagination) {
    81. if(null!=isPagination&&!"".equals(isPagination.trim()))
    82. this.isPagination = Boolean.parseBoolean(isPagination);
    83. }
    84. /**
    85. * 获取分页起始标记位置
    86. * @return
    87. */
    88. public int getStartIndex() {
    89. //(当前页码-1)*显示记录数
    90. return (this.getPage()-1)*this.rows;
    91. }
    92. /**
    93. * 末页
    94. * @return
    95. */
    96. public int getMaxPage() {
    97. int totalpage=this.total/this.rows;
    98. if(this.total%this.rows!=0)
    99. totalpage++;
    100. return totalpage;
    101. }
    102. /**
    103. * 下一页
    104. * @return
    105. */
    106. public int getNextPage() {
    107. int nextPage=this.page+1;
    108. if(this.page>=this.getMaxPage())
    109. nextPage=this.getMaxPage();
    110. return nextPage;
    111. }
    112. /**
    113. * 上一页
    114. * @return
    115. */
    116. public int getPreivousPage() {
    117. int previousPage=this.page-1;
    118. if(previousPage<1)
    119. previousPage=1;
    120. return previousPage;
    121. }
    122. @Override
    123. public String toString() {
    124. return "PageBean [page=" + page + ", rows=" + rows + ", total=" + total + ", isPagination=" + isPagination
    125. + "]";
    126. }
    127. }

     PageBeanAspect.java(切面类)

    1. package com.zking.ssm.util;
    2. import com.github.pagehelper.PageHelper;
    3. import com.github.pagehelper.PageInfo;
    4. import org.aspectj.lang.ProceedingJoinPoint;
    5. import org.aspectj.lang.annotation.Around;
    6. import org.aspectj.lang.annotation.Aspect;
    7. import org.springframework.stereotype.Component;
    8. import java.util.List;
    9. /**
    10. * aop环绕通知,在*Biz.list*()方法前后执行,与mybatis的PageHelper插件一起完成PageBean的初始化
    11. *
    12. * @author Administrator
    13. */
    14. @Component //表示这个类由spring管理
    15. @Aspect //切面
    16. public class PageBeanAspect {
    17. //环绕通知 切入点(value) 接口名字以Service结尾 方法名以list开头
    18. @Around(value = "execution(* *..*Service.list*(..))")
    19. public Object invoke(ProceedingJoinPoint joinPoint) throws Throwable {//joinPOint连接点
    20. // 取出PageBean
    21. Object[] args = joinPoint.getArgs();
    22. PageBean pageBean = null;
    23. //遍历方法参数
    24. for (Object obj : args) {
    25. 判断数据类型
    26. if (obj instanceof PageBean) {
    27. //强转数据类型
    28. pageBean = (PageBean) obj;
    29. break;
    30. }
    31. }
    32. // 如果分页,指定分页参数
    33. if (null != pageBean && pageBean.isPagination()) {
    34. //查询方法分页
    35. PageHelper.startPage(pageBean.getPage(), pageBean.getRows());
    36. }
    37. Object returnValue = joinPoint.proceed(args);
    38. // 如果分页,获得总记录数
    39. if (null != pageBean && pageBean.isPagination() && null != returnValue &&
    40. returnValue instanceof List) {
    41. List list = (List) returnValue;
    42. PageInfo pageInfo = new PageInfo(list);
    43. Long total = pageInfo.getTotal();
    44. pageBean.setTotal(total.intValue());
    45. }
    46. return returnValue;
    47. }
    48. }

       实现结果暂时看不到效果,可等集成后在看效果

  • 相关阅读:
    【办公类-16-05-01】“大班游戏活动室排班表——班主任版21周”(python 排班表系列)
    300.最长递增子序列 | 354.俄罗斯套娃信封问题
    数据库复习带答案
    pytest测试框架
    Spring的后处理器
    区块链服务网络BSN季度版本迭代说明【2023年Q3】
    我31岁,做美工一月8K,后面我该咋办?
    【职场篇】五年游戏开发老兵,我为什么劝你学UE?
    java计算机毕业设计ssm教师贴心宝的设计与实现
    流水线:如何做到应用分钟级上线交付?
  • 原文地址:https://blog.csdn.net/weixin_66939060/article/details/126802170