Mybatis02

5 篇文章 0 订阅

接上期来讲,我们实现了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;
    }
}

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
org.apache.ibatis.binding.BindingException是MyBatis框架中的一个异常,它表示绑定语句无效或未找到。在你提供的引用中,出现了两个不同的错误信息,分别是com.mybatis.mapper.OrdersMapper.finarray和com.cloud.lowcode.mapper.UserMapper.queryByParam。 这些错误信息表明在MyBatis的映射文件中找不到对应的绑定语句。绑定语句是指在映射文件中定义的SQL语句,用于执行数据库操作。 要解决这个问题,你可以按照以下步骤进行操作: 1. 确保映射文件中存在对应的绑定语句。检查com.project_mybatis02.mapper.Mkk映射文件中是否定义了名为list的绑定语句。 2. 检查绑定语句的命名是否正确。确保绑定语句的名称与映射文件中定义的名称完全一致,包括大小写。 3. 检查映射文件的路径是否正确。确认映射文件的路径与MyBatis配置文件中的路径一致。 4. 检查映射文件是否正确加载。确保映射文件已经正确加载到MyBatis的配置中。 5. 检查映射文件中的命名空间是否正确。确认映射文件中的命名空间与Mapper接口的包路径一致。 6. 检查Mapper接口的方法名是否与绑定语句的id一致。确保Mapper接口中的方法名与映射文件中绑定语句的id一致。 7. 检查Mapper接口的包路径是否正确。确认Mapper接口的包路径与映射文件中的命名空间一致。 8. 检查MyBatis的配置文件是否正确加载了映射文件。确认MyBatis的配置文件中已经正确加载了映射文件。 9. 检查数据库连接是否正常。确保数据库连接配置正确,并且数据库中存在对应的表和字段。 10. 如果以上步骤都没有解决问题,可以尝试重新编译和部署项目,确保所有的文件都已经正确部署。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值