002知识小结(异常、工厂、路径)+Log4J+parameterType属性+新增和事务讲解+mabatis实现mysql分页

一.知识小结

在数据访问层处理异常和在控制器中处理异常,service中只抛出异常。

实例化工厂对象时使用的是构建者设计模式,名称标志Builder,构建者设计模式意义是简化对象实例化过程。

大部分注解都有默认属性,如果注解中只给默认属性复制,可以省略属性名,否则在注解的(属性名=属性值)格式;如果一个属性是数组类型格式 属性名={值,值} ,如果该数组只有一个值,可以省略大括号;如果类是不是基本数据类型或String而是一个类类型语法 属性名=@类型;注解中@表示引用注解声明。

只要路径中以/开头的都叫做全路径,从项目根目录(WebContent)出发找到其他资源的过程。只要不以/开头都是相对路径,相对路径是从当前资源出发找到其他资源的过程。如果请求转发 / 表示WebContent目录。如果是重定向,静态资源引用,必须<img src=""/> <a href="">  <script src=""/> css引用时 其中 /都表示的是tomcat的webapps文件夹根目录,服务器根目录。

二.Log4J

由apache退出的开源免费日志处理的类库。为什么需要日志,在项目中编写System.out.println();输出到控制台,当项目发布到tomcat后,没有控制台(在命令行界面就能看见),不容易观察一些输出结果。log4j作用,不仅能把内容输出到控制台,还能把内容输出到文件中,便于观察结果。

使用步骤:①导入logs4j-xxx.jar包②在src下新建log4j.properties(路径和名称都不允许改变)

log4j输出级别:fatal(致命错误,解决不了)>error(错误)>warm(警告)>info(普通信息)>debug(调试信息),在log4j.prooperties的第一行控制输出级别, log4j在第一行可以控制输出目的地。

log4j.rootCategory=ERROR, CONSOLE ,LOGFILE //输出信息级别和输出目的地:错误信息,日志级别,控制台,文件中

log4j.logger.a.b=DEBUG 
//只有a.b包下或者a.b.c是DEBUG级别的,其它的全是ERROR级别的
//也可以写成log4j.logger.com.ld.mapper=DEBUG


log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender //控制输出的类
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout //使用表达式输出
log4j.appender.CONSOLE.layout.ConversionPattern=%C %p  %m %n //具体的表达式格式:包名+类名,显示输出信息,换行符

log4j.appender.LOGFILE=org.apache.log4j.FileAppender //往文件输出的类
log4j.appender.LOGFILE.File=E:/my.log //控制输出的地址
log4j.appender.LOGFILE.Append=true //true为追加,false为清空再写
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%C %m %L %n //%L行号,%d{YYYY-MM-dd HH:mm:ss}时间
Logger logger = Logger.getLogger(Test.class);
logger.info("普通信息");

mybatis是可以用log4j的,在mybatis中需要遵循dtd规范,将鼠标放在根节点上便可以看见根节点可以写哪些东西,?代表0个或者1个,*号代表任意个,顺序也不能乱。在mybatis中开启日志功能,必须有log4j.jar,然后在src下有log4j.properties文件。log4j中可以输出指定内容的日志①命名级别(包级别),<mapper>namespace属性中除了最后一个类名②类级别,namespace属性值③方法级别,namespace属性值+标签id属性值。

三.parameterType属性

在XXXMapper.xml中<select><delete>等 标签的parameterType可以控制参数类型。SqlSession的selectList()和selectOne()的第二个参数和selectMap()的第三个参数都表示方法的参数。在Mapper.xml中可以通过#{}获取参数,使用索引从0开始,#{0}表示第一个参数,也可以使用#{param1}获取第一个参数,如果只有一个 参数,mybatis对#{}里面的内容没有要求只要写内容即可,如果参数是对象#{属性名},如果参数是map写成#{key},如果要使用多个参数,可以使用对象或map。关于#{}和${}的区别,#{}获取参数的内容支持索引获取,param1获取指定位置参数,并且SQL使用?占位符,占位符不支持加减乘除运算,所以做分页时可以先算好再传进去,${}字符串拼接不使用?,默认找${内容}内容的get/set方法,如果写数字,就是一个数字。

四.新增和事务讲解

功能,从应用程序角度出发,软件具有哪些功能。业务,完成功能时的逻辑,对应Service中的一个方法。事务,从数据库角度出发,完成业务时需要执行的SQL集合,统称一个事务。这三个其实干的是同一个事情。在mybatis中默认都是不自动提交事务,session.commit()提交事务,openSession(true);自动提交,相当于在底层setAutoCommit(true);,事务回滚,如果一个事务中某个SQL执行事务,希望回归事务的原点,保证数据库数据的完整性。

mybatis底层是对JDBC的封装,JDBC中executeUpdate()执行新增,删除,修改的SQL返回值int,表示受影响的行数;mybatis中<insert><delete><update>标签没有resultType属性,认为返回值都是int。

在openSession()时Mybatis会创建SqlSession时同时创建一个Transaction(事务对象),同时autoCommit都为false。如果出现异常,应该session.rollback()回滚事务。

五.mabatis实现mysql分页

<mapper namespace="com.bjsxt.mapper.PeopleMapper">
	<select id="selByPage" resultType="people" parameterType="map">
		select * from people limit #{pageStart},#{pageSize}
	</select>
	<select id="selCount" resultType="long">
		select count(*) from people
	</select>
</mapper>
public class PageInfo {
	//每页显示个数
	private int pageSize;
	//当前第几页
	private int pageNumber;
	//总页数
	private long total;
	//当前页显示的数据
	private List<?> list;
	
	
	public int getPageSize() {
		return pageSize;
	}
	public void setPageSize(int pageSize) {
		this.pageSize = pageSize;
	}
	public int getPageNumber() {
		return pageNumber;
	}
	public void setPageNumber(int pageNumber) {
		this.pageNumber = pageNumber;
	}
	public long getTotal() {
		return total;
	}
	public void setTotal(long total) {
		this.total = total;
	}
	public List<?> getList() {
		return list;
	}
	public void setList(List<?> list) {
		this.list = list;
	}
	
}
public class PeopleServiceImpl implements PeopleService {

	@Override
	public PageInfo showPage(int pageSize, int pageNumber) throws IOException {
		InputStream is = Resources.getResourceAsStream("mybatis.xml");
		SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
		SqlSession session = factory.openSession();
		
		PageInfo pi = new PageInfo();
		pi.setPageNumber(pageNumber);
		pi.setPageSize(pageSize);
		Map<String,Object> map =new HashMap<>();
		map.put("pageStart",pageSize*(pageNumber-1));
		map.put("pageSize", pageSize);
		pi.setList(session.selectList("com.bjsxt.mapper.PeopleMapper.selByPage",map));
		
		//总条数
		long count = session.selectOne("com.bjsxt.mapper.PeopleMapper.selCount");
		
		pi.setTotal(count%pageSize==0?count/pageSize:count/pageSize+1);
		return pi;
	}

}
@WebServlet("/page")
public class ShowPageServlet extends HttpServlet{
	private PeopleService peopleService = new PeopleServiceImpl();
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//第一次访问的验证,如果没有传递参数,设置默认值
		String pageSizeStr = req.getParameter("pageSize");
		int pageSize = 2;
		if(pageSizeStr!=null&&!pageSizeStr.equals("")){
			pageSize = Integer.parseInt(pageSizeStr);
		}
		String pageNumberStr = req.getParameter("pageNumber");
		int pageNumber = 1;
		if(pageNumberStr!=null&&!pageNumberStr.equals("")){
			pageNumber = Integer.parseInt(pageNumberStr);
		}
		PageInfo pi = peopleService.showPage(pageSize, pageNumber);
		req.setAttribute("PageInfo", pi);
		req.getRequestDispatcher("index.jsp").forward(req, resp);
	}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	<table border="1">
		<tr>
			<th>编号</th>
			<th>姓名</th>
			<th>年龄</th>
		</tr>
		<c:forEach items="${PageInfo.list }" var="pi">
			<tr>
				<td>${pi.id }</td>
				<td>${pi.name }</td>
				<td>${pi.age }</td>
			</tr>
		</c:forEach>
	</table>
	<a href="page?pageNumber=${PageInfo.pageNumber-1 }&pageSize=${PageInfo.pageSize}" <c:if test="${PageInfo.pageNumber<=1 }">  οnclick="javascript:return false;" </c:if> >上一页</a>
	<a href="page?pageNumber=${PageInfo.pageNumber+1 }&pageSize=${PageInfo.pageSize}" <c:if test="${PageInfo.pageNumber>=PageInfo.total }">  οnclick="javascript:return false;" </c:if> >下一页</a>
</body>
</html>
发布了23 篇原创文章 · 获赞 7 · 访问量 1793

猜你喜欢

转载自blog.csdn.net/weixin_44145972/article/details/102469120