previous:MyBatis_2_MyBatis下载并搭建框架 next:MyBatis_4_一对多关系配置
---4-1 SQL动态拼接--------------------------------------------------------------
1.parameterType可直接填写java.long包的类型,不需要包名
2. OGNL(与EL一样是一种语言)功能强大的表达式语言(直接支持JAVA对象的代码)。struts2也使用
"" 转为""
&&转为&&或者“and”
DAO
/**
* 根据查询条件查询消息列表
*/
public List<Message> queryMessageList(String command,String description) {
DBAccess dbAccess = new DBAccess();
List<Message> messageList = new ArrayList<Message>();
SqlSession sqlSession = null;
try {
Message message = new Message();
message.setCommand(command);
message.setDescription(description);
sqlSession = dbAccess.getSqlSession();
// 通过sqlSession执行SQL语句
messageList = sqlSession.selectList("Message.queryMessageList", message);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if(sqlSession != null) {
sqlSession.close();
}
}
return messageList;
}
1)#{变量名}//此处不是OGNL,是mybatis处理替换成“?”
2)where 1=1不需要
3)parameterType只接受一个parameter。
4)'%' #{description} '%'。注意#{description}前后空格必须。
调试使用log4j辅助。
parameterType="com.imooc.bean.Message" resultMap="MessageResult">
select ID,COMMAND,DESCRIPTION,CONTENT from MESSAGE
<where>
<if test="command != null and !"".equals(command.trim())">
and COMMAND=#{command}
</if>
<if test="description != null and !"".equals(description.trim())">
and DESCRIPTION like '%' #{description} '%'
</if>
</where>
</select>
<select id="queryMessageList" parameterType="com.imooc.bean.Message" resultMap="MessageResult">
select ID,COMMAND,DESCRIPTION,CONTENT from MESSAGE
<where>
<if test="command != null and !"".equals(command.trim())">
and COMMAND=#{command}
</if>
<if test="description != null and !"".equals(description.trim())">
and DESCRIPTION like '%' #{description} '%'
</if>
</where>
</select>
===LOG4J===========================
Log4j:日志输出 。Jar包和配置文件(log4j.properties放入src根目录下,(指定其他路径时,需要配置))
MyBatistsjar包的logging.LogFactory.class源码,定义了各种LOG的接口,其中包含Log4j,所以配置好Log4j 之后就可以打印LOG了
properties文件 key=value
//级别
logger log;
//级别由低到高
log.debug("adf");
log.info(message);
log.warn(message);
log.error(message);
//大于等于DEBUG级别的都输出
log4j.rootLogger=DEBUG,Console//整个工程的级别//Console,输出位置是控制台。DEBUG级别的原因:参照jar包的logging.jdbc下的类的源码,比如ConnectionLogger.class的源码里,是用debug()出力的,所以不能高于这个级别,否则不会打印Log。
log4j.appender.Console=org.apache.log4j.ConsoleAppender//配置此类才会输出到控制台(log4j.rootLogger=DEBUG,A
log4j.appender.A)
log4j.appender.Console.layout=org.apache.log4j.PatternLayout//布局
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n//布局自定义
(%d [%t] %-5p [%c] - %m%n,%开头的有特殊含义,[]空格-等都是原样输出。%d产生时间 %t所处线程名称,%-5p:%p输出的级别,-5表示输出的字符至少占5位,不足用空格补齐,“-”表示补齐的空格在右边,没有“-”的话,空格就在左边。%c输出日志时的类全名+包名 %n换行%m输出时附加的信息)
log4j.logger.org.apache=INFO//org.apache为包名,为org.apache包下配置为INFO级别
导入的包的源码加入方法(如mybatis的源码):
properties->Java Build Path->Libraries->mybatis包-Source attachment ...-edit-下载的源码的根目录层mybatis-3-mybatis-3.4.4-OK
===LOG4J==============================
---4-4 单条删除--------------------------------------------------------------
Message.xml
<delete id="deleteOne" parameterType="int">
delete from MESSAGE where ID = #{_parameter}
</delete>dao
/**
* 单条删除
*/
public void deleteOne(int id) {
DBAccess dbAccess = new DBAccess();
SqlSession sqlSession = null;
try {
sqlSession = dbAccess.getSqlSession();
// 通过sqlSession执行SQL语句
sqlSession.delete("Message.deleteOne", id);
sqlSession.commit();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if(sqlSession != null) {
sqlSession.close();
}
}
}
sevice
package com.imooc.service;
import java.util.ArrayList;
import java.util.List;
import com.imooc.dao.MessageDao;
/**
* 维护相关的业务功能
*/
public class MaintainService {
/**
* 单条删除
*/
public void deleteOne(String id) {
if(id != null && !"".equals(id.trim())) {
MessageDao messageDao = new MessageDao();
messageDao.deleteOne(Integer.valueOf(id));
}
}
/**
* 批量删除
*/
public void deleteBatch(String[] ids) {
MessageDao messageDao = new MessageDao();
List<Integer> idList = new ArrayList<Integer>();
for(String id : ids) {
idList.add(Integer.valueOf(id));
}
messageDao.deleteBatch(idList);
}
}
Servlet
/**
* 单条删除控制层
*/
@SuppressWarnings("serial")
public class DeleteOneServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// 设置编码
req.setCharacterEncoding("UTF-8");
// 接受页面的值
String id = req.getParameter("id");
MaintainService maintainService = new MaintainService();
maintainService.deleteOne(id);
// 向页面跳转
req.getRequestDispatcher("/List.action").forward(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
this.doGet(req, resp);
}
}
web.xml配置新增的servlet
<servlet>
<servlet-name>ListServlet</servlet-name>
<servlet-class>com.imooc.servlet.ListServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ListServlet</servlet-name>
<url-pattern>/List.action</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>DeleteOneServlet</servlet-name>
<servlet-class>com.imooc.servlet.DeleteOneServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DeleteOneServlet</servlet-name>
<url-pattern>/DeleteOneServlet.action</url-pattern>
</servlet-mapping>
jsp:
get方式提交
<a href="${basePath}DeleteOneServlet.action?id=${message.id}">删除</a>
<table class="tab2" width="100%">
<tbody>
<tr>
<th><input type="checkbox" id="all" onclick="#"/></th>
<th>序号</th>
<th>指令名称</th>
<th>描述</th>
<th>操作</th>
</tr>
<c:forEach items="${messageList}" var="message" varStatus="status">
<tr <c:if test="${status.index % 2 != 0}">style='background-color:#ECF6EE;'</c:if>>
<td><input type="checkbox" name="id" value="${message.id}"/></td>
<td>${status.index + 1}</td>
<td>${message.command}</td>
<td>${message.description}</td>
<td>
<a href="#">修改</a>
<a href="${basePath}DeleteOneServlet.action?id=${message.id}">删除</a>
</td>
</tr>
</c:forEach>
</tbody>
</table>
---4-5 批量删除--------------------------------------------------------------
Message.xml
<delete id="deleteBatch" parameterType="java.util.List">
delete from MESSAGE where ID in(
<foreach collection="list" item="item" separator=",">
#{item}
</foreach>
)
</delete>
DAO:
/**
* 批量删除
*/
public void deleteBatch(List<Integer> ids) {
DBAccess dbAccess = new DBAccess();
SqlSession sqlSession = null;
try {
sqlSession = dbAccess.getSqlSession();
// 通过sqlSession执行SQL语句
sqlSession.delete("Message.deleteBatch", ids);
sqlSession.commit();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if(sqlSession != null) {
sqlSession.close();
}
}
}
service:
/**
* 批量删除
*/
public void deleteBatch(String[] ids) {
MessageDao messageDao = new MessageDao();
List<Integer> idList = new ArrayList<Integer>();
for(String id : ids) {
idList.add(Integer.valueOf(id));
}
messageDao.deleteBatch(idList);
}
}
Servlet:
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// 设置编码
req.setCharacterEncoding("UTF-8");
// 接受页面的值
String[] ids = req.getParameterValues("id");
MaintainService maintainService = new MaintainService();
maintainService.deleteBatch(ids);
// 向页面跳转
req.getRequestDispatcher("/List.action").forward(req, resp);
}
JSP:
<script src="<%= basePath %>resources/js/common/jquery-1.8.0.min.js"></script>
<script src="<%= basePath %>resources/js/back/list.js"></script>//通过JS,进行POST提交
<p class="g_title fix">内容列表 <a class="btn03" href="#">新 增</a> <a class="btn03" href="javascript:deleteBatch('<%=basePath%>');">删 除</a></p>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta http-equiv="X-UA-Compatible"content="IE=9; IE=8; IE=7; IE=EDGE" />
<title>内容列表页面</title>
<link href="<%= basePath %>resources/css/all.css" rel="stylesheet" type="text/css" />
<script src="<%= basePath %>resources/js/common/jquery-1.8.0.min.js"></script>
<script src="<%= basePath %>resources/js/back/list.js"></script>
</head>
<body style="background: #e1e9eb;">
<form action="<%= basePath %>List.action" id="mainForm" method="post">
<input type="hidden" name="currentPage" id="currentPage" value="${page.currentPage}"/>
<div class="right">
<div class="current">当前位置:<a href="javascript:void(0)" style="color:#6E6E6E;">内容管理</a> > 内容列表</div>
<div class="rightCont">
<p class="g_title fix">内容列表 <a class="btn03" href="#">新 增</a> <a class="btn03" href="javascript:deleteBatch('<%=basePath%>');">删 除</a></p>
<table class="tab1">
<tbody>
<tr>
<td width="90" align="right">指令名称:</td>
<td>
<input name="command" type="text" class="allInput" value="${command}"/>
</td>
<td width="90" align="right">描述:</td>
<td>
<input name="description" type="text" class="allInput" value="${description}"/>
</td>
<td width="85" align="right"><input type="submit" class="tabSub" value="查 询" /></td>
</tr>
</tbody>
</table>
<div class="zixun fix">
<table class="tab2" width="100%">
<tbody>
<tr>
<th><input type="checkbox" id="all" onclick="#"/></th>
<th>序号</th>
<th>指令名称</th>
<th>描述</th>
<th>操作</th>
</tr>
<c:forEach items="${messageList}" var="message" varStatus="status">
<tr <c:if test="${status.index % 2 != 0}">style='background-color:#ECF6EE;'</c:if>>
<td><input type="checkbox" name="id" value="${message.id}"/></td>
<td>${status.index + 1}</td>
<td>${message.command}</td>
<td>${message.description}</td>
<td>
<a href="#">修改</a>
<a href="${basePath}DeleteOneServlet.action?id=${message.id}">删除</a>
</td>
</tr>
</c:forEach>
</tbody>
</table>
<div class='page fix'>
共 <b>${page.totalNumber}</b> 条
<c:if test="${page.currentPage != 1}">
<a href="javascript:changeCurrentPage('1')" class='first'>首页</a>
<a href="javascript:changeCurrentPage('${page.currentPage-1}')" class='pre'>上一页</a>
</c:if>
当前第<span>${page.currentPage}/${page.totalPage}</span>页
<c:if test="${page.currentPage != page.totalPage}">
<a href="javascript:changeCurrentPage('${page.currentPage+1}')" class='next'>下一页</a>
<a href="javascript:changeCurrentPage('${page.totalPage}')" class='last'>末页</a>
</c:if>
跳至 <input id="currentPageText" type='text' value='${page.currentPage}' class='allInput w28' /> 页
<a href="javascript:changeCurrentPage($('#currentPageText').val())" class='go'>GO</a>
</div>
</div>
</div>
</div>
</form>
</body>
</html>
JS:通过submit()方法提交表单(post)
/**
* 调用后台批量删除方法
*/
function deleteBatch(basePath) {//设定action
$("#mainForm").attr("action",basePath + "DeleteBatchServlet.action");
$("#mainForm").submit();
}
---4-1 SQL动态拼接--------------------------------------------------------------
---4-1 SQL动态拼接--------------------------------------------------------------