数据库设计
message表

message_inbox表

junit单元测试
package com.alphajuns.junit;
import com.alphajuns.ssm.service.MessageService;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.HashMap;
import java.util.Map;
public class MessageTest extends SuperJunitTest {
@Autowired
private MessageService messageService;
@Test
public void saveMessageTest() {
// 封装发送消息
// { sender:"AlphaJunS", topic: "ceshi", body:"message body" , url:"http://www.baidu.com" ,receivers:"zhangsan,lisi" }
Map<String, String> mailMap = new HashMap<String, String>();
mailMap.put("sender", "AlphaJunS");
mailMap.put("topic", "通知");
mailMap.put("body", "message body");
mailMap.put("url", "http://www.baidu.com");
mailMap.put("receivers", "zhangsan,lisi");
messageService.createMessage(mailMap);
}
}
MessageService.java
package com.alphajuns.ssm.service;
import java.util.List;
import java.util.Map;
public interface MessageService {
public List<Map<String,?>> invoke(String methodName, Map<String,?> param) throws ReflectiveOperationException;
public void deleteMessageByReceiver(Map<String,?> param);
public void createMessage(Map<String,?> param);
void createMessageByUserList(Map<String, ?> param);
}
MessageServiceImpl.java(MyBatisBatchHelper工具类可以从我之前的帖子中找一下)
package com.alphajuns.ssm.service.impl;
import com.alphajuns.ssm.mybatis.MessageMapper;
import com.alphajuns.ssm.service.MessageService;
import com.alphajuns.ssm.util.MyBatisBatchHelper;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service
public class MessageServiceImpl implements MessageService {
private static Logger logger = Logger.getLogger(MessageServiceImpl.class);
@Autowired
private MessageMapper messageMapper;
@Autowired
private SqlSessionFactory sqlSessionFactoryBiz;
@SuppressWarnings("unchecked")
public List<Map<String,?>> invoke(String methodName, Map<String,?> param) throws ReflectiveOperationException {
List<Map<String,?>> returnList = null;
Class clazz = messageMapper.getClass();
try {
Method m = clazz.getDeclaredMethod(methodName, Map.class);
Object returnObj = m.invoke(messageMapper, param);
if(returnObj instanceof List<?>){
returnList = (List<Map<String, ?>>) returnObj;
//调用post方法来继续处理某些负责情况
Class serviceClazz = this.getClass();
Method[] methods = serviceClazz.getDeclaredMethods();
boolean hasPostMethod = false;
for(Method method : methods){
logger.debug(serviceClazz.getCanonicalName()+"method:"+method);
if(method.getName().contains(methodName+"Post")){
hasPostMethod = true;
Object newReturnObj = method.invoke(this, param,returnList);
if(newReturnObj instanceof List<?>){
returnList = (List<Map<String, ?>>) newReturnObj;
}
}
}
if(!hasPostMethod){
logger.warn("You could add ["+methodName+"Post] to class "+serviceClazz.getCanonicalName());
}
}
} catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
throw e;
}
return returnList;
}
/**
* deleteMessageByReceiver
* @param param(receiver, msgId)
* @return
*/
@Override
public void deleteMessageByReceiver(Map<String, ?> param) {
messageMapper.deleteMessageByReceiver(param);
int count = messageMapper.countMessageUserByMsgId(param);
if (count == 0) {
messageMapper.deleteMessageByMsgId(param);
}
}
/**
* createMessage
* @param param { sender:"xiazj", topic: "ceshi", body:"sdfsdf" , url:"http://www.baidu.com" ,receivers:"gengjw,Devin" }
*
* @return
*/
@Override
public void createMessage(Map<String, ?> param) {
messageMapper.insertMessage(param);
int msgId = (Integer) param.get("id");
String receivers = (String) param.get("receivers");
String[] receiverArr = receivers.split(",");
Map<String, Object> tmpParam = new HashMap<String, Object>();
tmpParam.put("msgId", msgId);
for (String receiver : receiverArr) {
tmpParam.put("receiver", receiver);
messageMapper.insertMessageInbox(tmpParam);
}
}
@SuppressWarnings("unchecked")
@Override
public void createMessageByUserList(Map<String, ?> param) {
SqlSession sqlSession = MyBatisBatchHelper.openSession(sqlSessionFactoryBiz);
MessageMapper batchMessageMapper = sqlSession.getMapper(MessageMapper.class);
try{
batchMessageMapper.insertMessage(param);
int msgId = (Integer) param.get("id");
List<String> receiverList = (List<String>) param.get("receiverList");
Map<String, Object> tmpParam = new HashMap<String, Object>();
tmpParam.put("msgId", msgId);
if(receiverList!=null){
for (String receiver : receiverList) {
tmpParam.put("receiver", receiver);
batchMessageMapper.insertMessageInbox(tmpParam);
}
}
}catch(Exception e){
MyBatisBatchHelper.rollback(sqlSession);
}
MyBatisBatchHelper.commit(sqlSession);
MyBatisBatchHelper.close(sqlSession);
}
}
MessageMapper.java
package com.alphajuns.ssm.mybatis;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
public interface MessageMapper {
/**
* deleteMessageByReceiver
* @param param
* @return
*/
public abstract void deleteMessageByReceiver(@Param("paramMap") Map<String,?> param);
/**
* countMessageUserByMsgId
* @param param
* @return
*/
public abstract int countMessageUserByMsgId(@Param("paramMap") Map<String,?> param);
/**
* deleteMessageByMsgId
* @param param
* @return
*/
public abstract void deleteMessageByMsgId(@Param("paramMap") Map<String,?> param);
/**
* insertMessage
* @param param
* @return
*/
public abstract void insertMessage(Map<String,?> param);
/**
* insertMessageInbox
* @param param
* @return
*/
public abstract void insertMessageInbox(@Param("paramMap") Map<String,?> param);
/**
* queryUnreadMessageNum
* @param param
* @return
*/
public abstract List<Map<String,?>> queryUnreadMessageNum(@Param("paramMap") Map<String,?> param);
/**
* updateMessageStatus
* @param param
* @return
*/
public abstract void updateMessageStatus(@Param("paramMap") Map<String,?> param);
/**
* queryMessageDetail
* @param param
* @return
*/
public abstract List<Map<String,?>> queryMessageDetail(@Param("paramMap") Map<String,?> param);
/**
* queryMessageList
* @param param
* @return
*/
public abstract List<Map<String,?>> queryMessageList(@Param("paramMap") Map<String,?> param);
/**查询类似的消息
* querySameContentMsg
* @param param
* @return
*/
public abstract List<Map<String,?>> querySameContentMsg(@Param("paramMap") Map<String,?> param);
}
MessageMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.alphajuns.ssm.mybatis.MessageMapper" >
<!-- 删除用户消息 -->
<delete id="deleteMessageByReceiver" parameterType="map">
delete from message_inbox
where receiver = #{paramMap.receiver,jdbcType=VARCHAR}
and msg_id = #{paramMap.msgId, jdbcType=INTEGER}
</delete>
<!-- 查询消息用户数 -->
<select id="countMessageUserByMsgId" resultType="java.lang.Integer" parameterType="map">
SELECT count(1)
FROM message_inbox
WHERE msg_id = #{paramMap.msgId, jdbcType=INTEGER}
</select>
<!-- 删除消息 -->
<delete id="deleteMessageByMsgId" parameterType="map">
delete from message
where msg_id = #{paramMap.msgId, jdbcType=INTEGER}
</delete>
<!-- 创建消息 -->
<insert id="insertMessage" parameterType="map" >
<selectKey resultType="java.lang.Integer" order="AFTER" keyProperty="id">
SELECT LAST_INSERT_ID()
</selectKey>
insert into message (msg_id, sender, topic, body, url, msg_date)
values (#{id, jdbcType=INTEGER}, #{sender, jdbcType=VARCHAR}, #{topic, jdbcType=VARCHAR},
#{body, jdbcType=VARCHAR},#{url, jdbcType=VARCHAR}, now())
</insert>
<!-- 新建消息收件人关系-->
<insert id="insertMessageInbox" parameterType="map" >
insert into message_inbox (msg_id,receiver,flag)
values (#{paramMap.msgId, jdbcType=INTEGER}, #{paramMap.receiver, jdbcType=VARCHAR}, '0')
</insert>
<!-- 查询未读消息数 -->
<select id="queryUnreadMessageNum" resultType="map" parameterType="map">
SELECT count(1) as count
FROM MESSAGE_INBOX
WHERE receiver = #{paramMap.receiver, jdbcType=VARCHAR}
AND flag = '0'
</select>
<!-- 更新消息状态 -->
<update id="updateMessageStatus" parameterType="map" >
update message_inbox
set flag = #{paramMap.flag, jdbcType=VARCHAR}
where receiver = #{paramMap.receiver, jdbcType=VARCHAR}
and msg_id = #{paramMap.msgId, jdbcType=INTEGER}
</update>
<!-- 查询消息-->
<select id="queryMessageDetail" resultType="map" parameterType="map">
SELECT T1.FLAG, T2.MSG_ID, T2.TOPIC, T2.BODY, T2.MSG_DATE, T2.URL, NVL(T6.FULL_NAME,T2.SENDER) AS SENDER, TO_CHAR(WMSYS.WM_CONCAT (t5.FULL_NAME)) AS RECEIVERS
FROM (SELECT * FROM TM_MESSAGE_INBOX
WHERE MSG_ID = #{paramMap.msgId, jdbcType=INTEGER} AND RECEIVER = #{paramMap.receiver,jdbcType=VARCHAR}
) T1
LEFT JOIN TM_MESSAGE T2 ON T1.MSG_ID = T2.MSG_ID
LEFT JOIN TM_USER T6 ON T2.SENDER = T6.USER_ACCOUNT
LEFT JOIN ( SELECT T4.FULL_NAME, T3.MSG_ID
FROM (SELECT RECEIVER, MSG_ID FROM TM_MESSAGE_INBOX
WHERE MSG_ID = #{paramMap.msgId, jdbcType=INTEGER}
) T3
LEFT JOIN TM_USER t4 ON T3.RECEIVER = T4.USER_ACCOUNT ) T5 ON T1.MSG_ID = T5.MSG_ID
GROUP BY T1.flag, T2.MSG_ID, T2.TOPIC, T2.BODY, T2.MSG_DATE, T2.URL, NVL(T6.FULL_NAME,T2.SENDER)
</select>
<!-- 查询消息列表 -->
<select id="queryMessageList" resultType="map" parameterType="map">
SELECT T1.MSG_ID, T1.FLAG, T2.SENDER, T2.TOPIC, T2.MSG_DATE, NVL(T3.FULL_NAME, T2.SENDER) as SENDER_NAME
FROM (select MSG_ID, FLAG from TM_MESSAGE_INBOX where RECEIVER = #{paramMap.receiver, jdbcType=VARCHAR}) T1
LEFT JOIN TM_MESSAGE T2 ON T1.MSG_ID = T2.MSG_ID
LEFT JOIN TM_USER T3 ON T2.SENDER = T3.USER_ACCOUNT
</select>
<!-- 查询是否有相同的内容-->
<select id="querySameContentMsg" resultType="map" parameterType="map">
SELECT count(1) as count
FROM TM_MESSAGE
WHERE TOPIC like '%' || '${paramMap.topicTemplate}' || '%'
and BODY like '%' || '${paramMap.bodyContent}' || '%'
<if test="paramMap.limitTime!=null">
and (sysdate>Cast(MSG_DATE As Date))<![CDATA[<]]>3
</if>
</select>
</mapper>
对于mapper的xml中部分statement需要根据自己的实际情况进行改动,根据用户查询用户所拥有的信息,需要改成自己项目中响应的用户表信息
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/17854.html