Mybatis02

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

1.怎么获取到Sqlsession?

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

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

@Before
    public void setUp() throws Exception {
        //获取sqlsession
        sqlSession = MybatisSqlSessionFactory.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);

        UserServiceImpl userServiceImpl =
                new UserServiceImpl();

        userServiceImpl.setUserMapper(mapper);


        userService = userServiceImpl;
        user = new User();
    }

    @After
    public void tearDown() throws Exception {
        //sqlsession提交
        sqlSession.commit();
        //关闭sqlsession
        MybatisSqlSessionFactory.closeSqlSession();
    }

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

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

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

输出结果:

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.导入分页的插件

 <dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>5.1.2</version>
</dependency>

                 3. 将pagehelper插件配置到mybatis中

                        <!-- 配置分页插件PageHelper, 4.0.0以后的版本支持自动识别使用的数据库 -->
                        在mybatis配置文件中的environment标签之前配置plugins
                       <plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>

     

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

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

    }

        输出结果:

                

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

                5. 获取分页信息(二种方式)
      
                     5.1 使用插件后,查询实际返回的是Page<E>,而非List<E>,Page继承了ArrayList,同时还包含分页相关的信息
                  Page<Book> page = (Page<Book>)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());

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

        PageInfo pageInfo = new PageInfo(users);
        System.out.println("页码:" + pageInfo.getPageNum());
        System.out.println("页大小:" + pageInfo.getPageSize());
        System.out.println("总记录:" + pageInfo.getTotal());

    }

 输出结果:

                6.了解怎么实现的分页 

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

                        PageBean.java   

package com.zking.pagination.entity;

import java.io.Serializable;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

public class PageBean implements Serializable {

	private static final long serialVersionUID = 2422581023658455731L;

	//页码
	private int page=1;
	//每页显示记录数
	private int rows=10;
	//总记录数
	private int total=0;
	//是否分页
	private boolean isPagination=true;
	//上一次的请求路径
	private String url;
	//获取所有的请求参数
	private Map<String,String[]> map;
	
	public PageBean() {
		super();
	}
	
	//设置请求参数
	public void setRequest(HttpServletRequest req) {
		String page=req.getParameter("page");
		String rows=req.getParameter("rows");
		String pagination=req.getParameter("pagination");
		this.setPage(page);
		this.setRows(rows);
		this.setPagination(pagination);
		this.url=req.getContextPath()+req.getServletPath();
		this.map=req.getParameterMap();
	}
	public String getUrl() {
		return url;
	}

	public void setUrl(String url) {
		this.url = url;
	}

	public Map<String, String[]> getMap() {
		return map;
	}

	public void setMap(Map<String, String[]> map) {
		this.map = map;
	}

	public int getPage() {
		return page;
	}

	public void setPage(int page) {
		this.page = page;
	}
	
	public void setPage(String page) {
		if(null!=page&&!"".equals(page.trim()))
			this.page = Integer.parseInt(page);
	}

	public int getRows() {
		return rows;
	}

	public void setRows(int rows) {
		this.rows = rows;
	}
	
	public void setRows(String rows) {
		if(null!=rows&&!"".equals(rows.trim()))
			this.rows = Integer.parseInt(rows);
	}

	public int getTotal() {
		return total;
	}

	public void setTotal(int total) {
		this.total = total;
	}
	
	public void setTotal(String total) {
		this.total = Integer.parseInt(total);
	}

	public boolean isPagination() {
		return isPagination;
	}
	
	public void setPagination(boolean isPagination) {
		this.isPagination = isPagination;
	}
	
	public void setPagination(String isPagination) {
		if(null!=isPagination&&!"".equals(isPagination.trim()))
			this.isPagination = Boolean.parseBoolean(isPagination);
	}
	
	/**
	 * 获取分页起始标记位置
	 * @return
	 */
	public int getStartIndex() {
		//(当前页码-1)*显示记录数
		return (this.getPage()-1)*this.rows;
	}
	
	/**
	 * 末页
	 * @return
	 */
	public int getMaxPage() {
		int totalpage=this.total/this.rows;
		if(this.total%this.rows!=0)
			totalpage++;
		return totalpage;
	}
	
	/**
	 * 下一页
	 * @return
	 */
	public int getNextPage() {
		int nextPage=this.page+1;
		if(this.page>=this.getMaxPage())
			nextPage=this.getMaxPage();
		return nextPage;
	}
	
	/**
	 * 上一页
	 * @return
	 */
	public int getPreivousPage() {
		int previousPage=this.page-1;
		if(previousPage<1)
			previousPage=1;
		return previousPage;
	}

	@Override
	public String toString() {
		return "PageBean [page=" + page + ", rows=" + rows + ", total=" + total + ", isPagination=" + isPagination
				+ "]";
	}
}

 PageBeanAspect.java(切面类)

package com.zking.ssm.util;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * aop环绕通知,在*Biz.list*()方法前后执行,与mybatis的PageHelper插件一起完成PageBean的初始化
 *
 * @author Administrator
 */
@Component //表示这个类由spring管理
@Aspect //切面
public class PageBeanAspect {
    //环绕通知 切入点(value) 接口名字以Service结尾 方法名以list开头
    @Around(value = "execution(* *..*Service.list*(..))")
    public Object invoke(ProceedingJoinPoint joinPoint) throws Throwable {//joinPOint连接点
        // 取出PageBean
        Object[] args = joinPoint.getArgs();
        PageBean pageBean = null;
        //遍历方法参数
        for (Object obj : args) {
            判断数据类型
            if (obj instanceof PageBean) {
                //强转数据类型
                pageBean = (PageBean) obj;
                break;
            }
        }

        // 如果分页,指定分页参数
        if (null != pageBean && pageBean.isPagination()) {
            //查询方法分页
            PageHelper.startPage(pageBean.getPage(), pageBean.getRows());
        }

        Object returnValue = joinPoint.proceed(args);

        // 如果分页,获得总记录数
        if (null != pageBean && pageBean.isPagination() && null != returnValue &&
                returnValue instanceof List) {
            List list = (List) returnValue;
            PageInfo pageInfo = new PageInfo(list);
            Long total = pageInfo.getTotal();
            pageBean.setTotal(total.intValue());
        }

        return returnValue;
    }
}

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


版权声明:本文为weixin_66939060原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。