雖然項目經歷覺得這樣做不妥,但還是覺得有必要記錄一下。
主要思路就是:
數據表名格式在自己規定好的,如:sys_log_2018,2018是獲取當前年份;
添加數據時會判斷數據庫是否存在這張表,如果存在,則會添加數據,如果不存在,則會根據年份重新創建一個新的物理表;
創建表的代碼如下
/** * 創建表 * @param tableName */ public void createTmpTable(@Param(value="tableName")String tableName);
創建表的sql如下:
<update id="createTmpTable" parameterType="string"> CREATE TABLE ${tableName}( id VARCHAR2(64) not null, log_type VARCHAR2(64), title NVARCHAR2(500), create_by VARCHAR2(64), create_date TIMESTAMP(6), remote_addr VARCHAR2(255), user_agent VARCHAR2(255), request_uri VARCHAR2(255), method VARCHAR2(5), params CLOB, exception CLOB, operate_type VARCHAR2(64), content CLOB, PRIMARY KEY (id) ) </update>
查詢表名:
public List<String> findAllTableNames();
<select id="findAllTableNames" resultType="String"> <![CDATA[ select table_name from user_tables ]]> </select>
public static void saveLog(HttpServletRequest request, Log log){ LogService logService = (LogService) ContextLoader.getCurrentWebApplicationContext() .getBean("logService");
//查詢所有表名 List<String> list = logService.findAllTableNames(); String tableName = "sys_log_" + DateUtils.getYear(); if (!list.contains(tableName.toUpperCase())) { logService.createTmpTable(tableName); } User user = UserUtils.getUser(); if (user != null && user.getId() != null){ log.setCreateBy(user); log.setRemoteAddr(com.thinkgem.jeesite.common.utils.StringUtils.getRemoteAddr(request)); log.setUserAgent(request.getHeader("user-agent")); log.setRequestUri(request.getRequestURI()); log.setParams(request.getParameterMap()); log.setMethod(request.getMethod()); log.setCreateDate(user.getLoginDate()); log.preInsert(); log.setTableName(tableName); logDao.insert(log); } }