首页 > 学院 > 开发设计 > 正文

事务管理、AOP总结以及MyBatis高级应用

2019-11-10 18:36:43
字体:
来源:转载
供稿:网友

一、事务(交易)管理 (1)容器类==集合框架==集合 (2)Web容器==Web服务器==Servlet容器==Servet引擎 (3)传播 REQUIRED:如果有事务,则参与到当前事务,如果没有则自动开始新事务,总之,必须有事务。默认最常用规则!!! PRopagation=Propagation.REQUIRED REQUIRES_NEW:必须有新事务,没有事务开启新事务,已经有事务时候,也开启新的独立事务。 propagation=Propagation.REQUIRES_NEW NEVER:方法永远不参与事务 propagation=Propagation.NEVER NOT_SUPPORTED:不支持事务, 如果在事务中调用,把当前事务临时挂起,执行以后再继续处理事务。 propagation=Propagation.NOT_SUPPORTED NESTED:嵌套,当前方法不能单独使用,必须嵌套到其他事务中使用。 propagation=Propagation.NESTED MANDATORY:不支持事务, 不能再事务中调用,如果调用就出现异常 propagation=Propagation.MANDATORY 二、AOP总结 反射->动态代理->AOP->声明式事务管理 动态代理: (1)JDK 动态代理: java.lang.reflect.Proxy 使用是有前提的,必须有接口!! (2)CGlib动态代理:基于类的动态代理 注:Spring的AOP动态代理会自动利用 JDK Proxy和CGlib,如果有接口就优先使用JDK Proxy,其他情况下使用CGlib 三、MBatis高级应用 分页查询 分页查询,其目的在于在查询结果较多,需要分批向浏览器传输数据。在查询结果多时候经常采用。 实现分页查询: (1)数据持久层支持分页查询功能,主要是才有分页查询SQL实现,可以根据数据行范围,返回一部分查询结果。 (2)业务层将页号换算为分页查询参数,提交给数据层。 (3)表现层控制器与HTML页面配合显示出适当的页面效果。 案例:分页查询笔记本列表 数据层 NotebookDao.java :

/** * 分页查询,必须传递参数: * userId: 用户的ID * start: 查询起始行号 * rows: 一次查询的最多行数 * @param params 封装参数的Map * @return List<Map> */List<Map<String, Object>> findNotebooksByPage( Map<String, Object> params);

添加SQL NotebookMapper.java:

<select id="findNotebooksByPage" parameterType="map" resultType="map"> select cn_notebook_id as id, cn_notebook_name as name from cn_notebook where cn_user_id=#{userId} <if test="start != null"> limit #{start}, #{rows} </if></select>

添加业务层方法 NotebookService.java:

List<Map<String, Object>> listNotebooks(String userId, int pageNum, int pageSize) throws UserNotFoundException;

实现业务层方法 NotebookServiceImpl.java

@Transactional(readOnly=true)public List<Map<String, Object>> listNotebooks( String userId, int pageNum, int pageSize) throws UserNotFoundException { if(userId==null||userId.trim().isEmpty()){ throw new UserNotFoundException("ID空"); } User user = userDao.findUserById(userId); if(user==null){ throw new UserNotFoundException("木有人"); } //计算出起始行号 int start = pageNum*pageSize; Map<String, Object> params= new HashMap<String, Object>(); params.put("userId", userId); params.put("start", start); params.put("rows", pageSize); return notebookDao.findNotebooksByPage(params);}

添加控制器方法 NotebookController.java:

@RequestMapping("notebooks.do")@ResponseBodypublic JsonResult<List<Map<String, Object>>> notebooks(String userId, int page){ int size=6; List<Map<String, Object>> list= notebookService.listNotebooks( userId, page, size); return new JsonResult<List<Map<String,Object>>>(list);}

重构 loadNotebooksAction 方法:

function loadNotebooksAction(){ //获取 page 数据 //$(this)是li.more, 显示li时候,已经在LI //上绑定了页号数据,这里是获取页号数据 //如果不存在这个数居说明是第一次显示 //则显示第0页的内容 var page=$(this).data('page'); if(! page){ page = 0; } //console.log('loadNotebooksAction()'); //var url='notebook/list.do'; var url='notebook/notebooks.do'; //var data={userId:getCookie('userId')}; var data={userId:getCookie('userId'), page:page}; //console.log(data); //console.log(url); $.getJSON(url, data, function(result){ if(result.state==SUCCESS){ var list=result.data; console.log(list); model.updateNotebooks(list, page); } });}

重构 updateNotebooks 方法:

model.updateNotebooks=function(list, page){ var template='<li class="online notebook">'+ '<a>'+ '<i class="fa fa-book " title="online" rel="tooltip-bottom"></i>'+ '[notebook.name]</a></li>'; //检查如果是第一次获得笔记本列表,就直接 //保存到 模型中,如果是追加显示就将两个 //数组合并为一个笔记本列表 if(! this.notebooks ){ this.notebooks=list; }else{ //concat 方法用于合并两个数组 this.notebooks= this.notebooks.concat(list); } //console.log(this); var ul=$('#notebooks').empty(); for(var i=0;i<this.notebooks.length;i++){ var notebook=this.notebooks[i]; // id name var li=template.replace( '[notebook.name]', notebook.name); //在DOM对象上绑定数据 index li = $(li).data('index',i); ul.append(li); } var li = $('<li class="online more">'+ '<a>More...</a></li>'); //绑定下一页的页号 li.data('page', page+1); ul.append(li);};

重构事件监听js edit_init.js:

...//绑定点击笔记本列表的事件//showNotesAction函数定义在edit_note.js中$('#notebooks').on( 'click','li.notebook', showNotesAction);//绑定 More 连接监听 $('#notebooks').on( 'click','li.more', loadNotebooksAction);...

四、关于全文检索: (1)数据量非常大:搜索引擎技术,进行全文检索,如:org.apache.lucene (2)小数据量:可以使用 like 模糊查询,like是没有索引支持的顺序查询,性能很差。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表