mybatis、jstl、log4j搭建自动回复机器人(含知识要点与步骤)

转载请注明出处:
牵手生活--头条新闻:笔记是整理思路方式,分享是一个美德,牵手是我的生活方式
牵手生活--:笔记是整理思路方式,分享是一个美德,牵手是我的生活方式

项目效果

机器人聊天url

http://localhost:8080/InitTalkServlet.action
mybatis、jstl、log4j搭建自动回复机器人(含知识要点与步骤)_第1张图片
机器人聊天

自动回复指令维护url

http://localhost:8080/List.action
mybatis、jstl、log4j搭建自动回复机器人(含知识要点与步骤)_第2张图片
自动回复指令维护

app实现流程

  • javaBean 创建于数据库中表对应的实体
  • dao:实现表对应的增删改查,如MessageDAO是和message表相关的数据库操作
  • service:负责调用对应的dao,并实现与数据库无关的业务逻辑操作。如MessageService调用MessageDAO实现增删改查,并负责一些数据类型转换。
  • servlet:主要是通过调用对应的service,提供http方法方法,并处理web访问的格式(如UTF-8)与参数接收。
  • DbHelper:提供访问数据库辅助。如单例模式DBJdbcHelper提供jdbc方式访问mysql数据库连接对象Connection;DBMybatisHelper(还没改为单例模式)提供mybatis访问数据库的会话SqlSession
mybatis、jstl、log4j搭建自动回复机器人(含知识要点与步骤)_第3张图片
app实现流程

用idea创建一个maven 的web项目MicroMessageMybatis

注:如果对idea创建Manven webapp不熟悉,可参见Spring MVC -Hello World(环境搭建)

mybatis、jstl、log4j搭建自动回复机器人(含知识要点与步骤)_第4张图片
app 目录结构1
mybatis、jstl、log4j搭建自动回复机器人(含知识要点与步骤)_第5张图片
image.png

下面介绍涉及知识

  • Maven
  • mybatis(数据库访问框架)
  • jdbc
  • EL表达式(不介绍)
  • JSTL表达式
  • javaBean
  • Servlet
  • js(不介绍)
  • jquery(不介绍)

下面介绍涉及的工作步骤

  • pom.xml
  • 创建mybatis的辅助类DBMybatisHelper.java
  • 创建jdbc的辅助类DBJdbcHelper.java
  • 配置mybatis配置文件入口.xml文件与不同的mapper对应的.xml
  • 配置日志系统log4j的log4j.properties配置文件
  • 搭建单元测试框架(这里仅用于调试mybatis获取数据功能)
  • 创建不同的javaBean(基本与数据库表一致,涉及到父子表,采用List<子表javaBean>方式定义属性:如 private List contentList;//一条指令对应的自动回复内容列表
  • 创建与javaBean对应的DAO:处理数据库的相关操作
  • 创建service : 调用DAO跟数据库交互,还有一些业务逻辑需要处理,一般用service一般与servlet对应,被servlet调用
  • 创建不同的servlet:
  • 在web.xml中注册servlet,并配置http访问路径
  • 创建单元测试用例

配置pom.xml 用Maven方式导入到

  • mysql(访问mysql数据库)
  • servlet
  • slf4j(日志系统,用于测试mybatis)
  • mybatis(数据库访问框架)
  • junit单元测试
  • JSTL(这里没有采用Maven的方式配置,而是导入对应的jar包)
mybatis、jstl、log4j搭建自动回复机器人(含知识要点与步骤)_第6张图片
JSTL表达式的jar包

  
    
      junit
      junit
      4.11
      test
    

    
    
      mysql
      mysql-connector-java
      6.0.6
    
    
    

    
    
    
      javax.servlet
      javax.servlet-api
      4.0.0-b01
      provided
    

    
    
      org.slf4j
      slf4j-log4j12
      ${slf4j.version}
    


      
      
          org.mybatis
          mybatis
          3.2.8
      
    
      org.apache.logging.log4j
      log4j-api
      2.8.2
    

    
    
      log4j
      log4j
      1.2.16
    
    
      org.slf4j
      jcl-over-slf4j
      1.5.6
    


  

Mybatis中OGNL表达式

mybatis、jstl、log4j搭建自动回复机器人(含知识要点与步骤)_第7张图片
Mybatis中OGNL表达式1
mybatis、jstl、log4j搭建自动回复机器人(含知识要点与步骤)_第8张图片
Mybatis中OGNL表达式2

Mybatis配置文件

  • mybatis配置文件入口Configuration.xml(可以是其他文件名称哦)
  • mybatis范围数据库的sql语句与参数配置文件Command.xml;CommandContent.xml;Message.xml
    mybatis的配置文件参考mybatis源码中的例子:


    mybatis、jstl、log4j搭建自动回复机器人(含知识要点与步骤)_第9张图片
    mybatis配置例子路径

mybatis-3-mybatis-3.4.6\src\test\java\org\apache\ibatis\submitted\complex_property

  • Configuration.xml:用于配置数据库连接
  • User.xml:用于配置对user表的增、删、改、查

注意点:如果xml中有&符合,需要用&转义如


需要改为


Mybatis配置文件--Configuration.xml






  
    
      
        
      
      
        
        
        
        

      
    
  

  
  
    
    
    
  

  

Mybatis配置文件--Message.xml

Message.xml







  
      
    
    
    
      
    
  

  
  
  

    
    
        DELETE FROM message WHERE ID = #{_parameterType}
    

    
    
        DELETE FROM message WHERE ID in (
        
            #{item}
        
        )
    





Mybatis配置文件--父子表Command.xml、CommandContent.xml

Command.xml






  
  
      
      
    
    
    
    
  
    


  

CommandContent.xml




  
    
    
    
  

Mybatis配置文件的读取DBMybatisHelper.sql

public class DBMybatisHelper {
    /**
     * 根据配置文件返回一个mybatis的sqlsession
     * @return
     * @throws IOException
     */
    public SqlSession getSqlSession() throws IOException {
        //通过配置文件获取数据库连接信息,从src的目录开始
        //Reader reader= Resources.getResourceAsReader("com/younghare/micromessage/config/Configuration.xml");
        Reader reader= Resources.getResourceAsReader("Configuration.xml");
        //通过配置信息构建一个SqlSessionFactory
        SqlSessionFactory sqlSessionFactory =new SqlSessionFactoryBuilder().build(reader);
        //通过sqlSessionFactory打开一个数据库会话
        SqlSession sqlSession = sqlSessionFactory.openSession();
        return sqlSession;
    };
}

配置日志系统log4j配置(用于通过日志观察mybatis的sql语句、传递参数)

可以匹配值输出到控制台,也可以log输出到文件

mybatis、jstl、log4j搭建自动回复机器人(含知识要点与步骤)_第10张图片
控制台观察日志

log4j.properties

#配置输出到控制台,如果要输出到文件,需要修改这类
log4j.appender.Cons=org.apache.log4j.ConsoleAppender
# 按自己的想法输出
log4j.appender.Cons.layout=org.apache.log4j.PatternLayout
# 自定义输出日志的格式%d:产生日志的时间;%t:产生日志线程的线程名称;%5p:输出日志的级别(5位字符);%c:表示所处类的全名包括包名;%m:日志内容 %n:表示换行
log4j.appender.Cons.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n


# Root logger set to DEBUG、Console using the A2 appender defined above.
#设置log4j输出日志的级别、位置DEBUG、Console
log4j.rootLogger=DEBUG, Cons 
log4j.additivity=false

#key=value的形式进行配置
# 位某个包下配置不同的级别
log4j.logger.com.younghare.micromessage=debug, Cons
log4j.logger.org.springframework=debug, Cons
log4j.additivity.com=false
# 这个包下的输出的是NNFO日志级别
log4j.logger.org.apache=INFO

jdbc 访问mysql辅助类DBJdbcHelper.java

package com.younghare.micromessage.db;

import java.sql.Connection;
import java.sql.DriverManager;

public class DBJdbcHelper {
    private static final String driver = "com.mysql.jdbc.Driver"; //数据库驱动
    //连接数据库的URL地址
    //private static final String url="jdbc:mysql://localhost:3306/phpmyadmin?useUnicode=true&characterEncoding=UTF-8";
    private static final String url="jdbc:mysql://47.96.6.27:3306/auth?useUnicode=true&characterEncoding=UTF-8";
    private static final String username="root";//数据库的用户名
    private static final String password="emailczg";//数据库的密码

    private static Connection conn=null;

    //静态代码块负责加载驱动
    static
    {
        try
        {
            Class.forName(driver);
        }
        catch(Exception ex)
        {
            ex.printStackTrace();
        }
    }

    //单例模式返回数据库连接对象
    public static Connection getConnection() throws Exception
    {
        if(conn==null)
        {
            conn = DriverManager.getConnection(url, username, password);
            return conn;
        }
        return conn;
    }

    public static void main(String[] args) {

        try
        {
            Connection conn = DBJdbcHelper.getConnection();
            if(conn!=null)
            {
                System.out.println("数据库连接正常!");
            }
            else
            {
                System.out.println("数据库连接异常!");
            }
        }
        catch(Exception ex)
        {
            ex.printStackTrace();
        }

    }
}

javaBean的创建(仅提供Message.java其他不列出来)

Message.java

/**
 * 与指令消息表对应的实体类
 */
public class Message {
    private String id;  //主键
    private String command;  //指令名称
    private String description; //描述
    private String content;   //内容

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getCommand() {
        return command;
    }

    public void setCommand(String command) {
        this.command = command;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }
}

DAO的创建(仅提供MessageDAO.java其他不列出来)

MessageDAO.java

public class MessageDAO {
    static Logger logger = LoggerFactory.getLogger(MessageDAO.class);; //LogDemo为相关的类

    /**
     * 查询消息列表
     * @param command 指令
     * @param description 描述 --模糊匹配
     * @return  返回消息列表
     */
    public List queryMessageListByMysql(String command,String description) {
        List messageList = new ArrayList<>();
        try {

            Connection conn =DBJdbcHelper.getConnection();

            //conn = DriverManager.getConnection(url, username, password);
            String sqlQuery = "SELECT ID,COMMAND,DESCRIPTION,CONTENT FROM message where 1=1";
            StringBuilder sql = new StringBuilder(sqlQuery);
            List paramList = new ArrayList();
            if (command != null && !"".equals(command.trim())){
                sql.append(" and COMMAND = ?");
                paramList.add(command);
            }
            if (description != null && !"".equals(description.trim())){
                sql.append(" and DESCRIPTION like '%?%'");//模糊匹配
                paramList.add(description);
            }
            System.out.println("sqlMybatisMapping:"+sql.toString());


            PreparedStatement statement = conn.prepareStatement(sql.toString());
            for(int i=0;i queryMessageList(String command,String description) {
        List messageList = new ArrayList<>();
        DBMybatisHelper dbMybatisHelper = new DBMybatisHelper();
        SqlSession sqlSession = null;
        try {
            sqlSession = dbMybatisHelper.getSqlSession();
            Message message = new Message();
            message.setCommand(command);
            message.setDescription(description);
            //通过sqlSession执行SQL语句---Message:mapper namespace="Message";queryMessageList是在Message.xml配置的id
            //messageList = sqlSession.selectList("Message.queryMessageList");//
            messageList = sqlSession.selectList("Message.queryMessageList",message);//

        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if (sqlSession != null){
                sqlSession.close();
            }

        }

        return  messageList;

    }

    /**
     * 删除message中的一条记录
     * @param id
     */
    public  void deleteOne(int id){
        DBMybatisHelper dbMybatisHelper = new DBMybatisHelper();
        SqlSession sqlSession = null;
        try {
            sqlSession = dbMybatisHelper.getSqlSession();
            /*Message.deleteOne是:Message.xml配置的id*/
            sqlSession.delete("Message.deleteOne",id);//
            sqlSession.commit();//增删改都需要commit

        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if (sqlSession != null){
                sqlSession.close();
            }

        }

    }

    /**
     * 删除批量message中的记录
     * @param ids
     */
    public  void deleteBatch(List ids){
        DBMybatisHelper dbMybatisHelper = new DBMybatisHelper();
        SqlSession sqlSession = null;
        try {
            sqlSession = dbMybatisHelper.getSqlSession();
            /*Message.deleteOne是:Message.xml配置的id*/
            sqlSession.delete("Message.deleteBatch",ids);//
            sqlSession.commit();//增删改都需要commit

        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if (sqlSession != null){
                sqlSession.close();
            }

        }

    }



}

service的创建(仅提供MessageService.java其他不列出来)

MessageService.java

/**
 * 与ListServlet对应
 * 跟数据库交互之前,还有一些业务逻辑需要处理,一般用service一般与servlet对应,被servlet调用
 */
public class MessageService {

    /**
     * 查询message的记录集合
     * @param command
     * @param description
     * @return
     */
    public List queryMessageList(String command,String description){
        MessageDAO messageDAO = new MessageDAO();
        return messageDAO.queryMessageList(command,description);
    }
    /**
     * 删除message的某条记录
     * @param id
     */
    public void deleteOne(String  id){
        if (id != null && !"".equals(id.trim())){
            MessageDAO messageDAO = new MessageDAO();
            messageDAO.deleteOne(Integer.valueOf(id));
        }
    }

    /**
     * 删除message的某条记录
     * @param ids
     */
    public void deleteBatch(String[]  ids){
        List idList = new ArrayList();
        for (String id : ids) {
            idList.add(Integer.valueOf(id));
        }

        MessageDAO messageDAO = new MessageDAO();
        messageDAO.deleteBatch(idList);
    }


}

创建不同的servlet((仅提供ListServlet.java;DeleteOneServlet.java其他不列出来)

ListServlet.java

public class ListServlet extends javax.servlet.http.HttpServlet {
    protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
        doGet(request,response);


    }

    protected void doGet(javax.servlet.http.HttpServletRequest req, javax.servlet.http.HttpServletResponse resp)
            throws javax.servlet.ServletException, IOException {
        //设置编码
        req.setCharacterEncoding("UTF-8");
        //接受页面的值
        String command =req.getParameter("command");
        String description = req.getParameter("description");
        //向页面传值
        req.setAttribute("command",command);
        req.setAttribute("description",description);
        
        //查询消息列表,并传递给页面
        MessageService messageService = new MessageService();
        req.setAttribute("messageList", messageService.queryMessageList(command,description));

        //调整页面
        req.getRequestDispatcher("/WEB-INF/jsp/back/list.jsp").forward(req,resp);

    }
}

DeleteOneServlet.java

package com.younghare.micromessage.servlet;

import com.younghare.micromessage.service.MessageService;

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import java.io.IOException;

/**
 * message单条记录删除控制层
 */
@WebServlet(name = "DeleteOneServlet")
public class DeleteOneServlet extends HttpServlet {
    protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
        doGet(request,response);


    }

    protected void doGet(javax.servlet.http.HttpServletRequest req, javax.servlet.http.HttpServletResponse resp)
            throws javax.servlet.ServletException, IOException {
        //设置编码
        req.setCharacterEncoding("UTF-8");
        //接受页面的值
        String id =req.getParameter("id");
        //查询消息列表,并传递给页面
        MessageService messageService = new MessageService();
        messageService.deleteOne(id);

        //调整页面
        req.getRequestDispatcher("/List.action").forward(req,resp);

    }
}

在web.xml中注册servlet,并配置http访问路径


...
    
        ListServlet
        com.younghare.micromessage.servlet.ListServlet
    
    
        DeleteOneServlet
        com.younghare.micromessage.servlet.DeleteOneServlet
    

...

    
    
        ListServlet
        /List.action
    

    
    
        DeleteOneServlet
        /DeleteOneServlet.action
    

...


创建单元测试用例MessageDAOTest

MessageDAOTest.java

import com.younghare.micromessage.bean.Message;
import org.junit.Test;

import java.util.List;

public class MessageDAOTest {
    @Test
    public void testqueryMessageList() {
        MessageDAO messageDAO = new MessageDAO();
        List messages = messageDAO.queryMessageList("","精");
        System.out.println("记录数:"+messages.size());
    }

    @Test
    public void testqueryMessageListByMysql() {
        MessageDAO messageDAO = new MessageDAO();
        List messages =  messageDAO.queryMessageListByMysql("","");
        System.out.println("记录数:"+messages.size());

    }
}

你可能感兴趣的:(mybatis、jstl、log4j搭建自动回复机器人(含知识要点与步骤))