转载请注明出处:
牵手生活--头条新闻:笔记是整理思路方式,分享是一个美德,牵手是我的生活方式
牵手生活--:笔记是整理思路方式,分享是一个美德,牵手是我的生活方式
项目效果
机器人聊天url
http://localhost:8080/InitTalkServlet.action
自动回复指令维护url
http://localhost:8080/List.action
app实现流程
- javaBean 创建于数据库中表对应的实体
- dao:实现表对应的增删改查,如MessageDAO是和message表相关的数据库操作
- service:负责调用对应的dao,并实现与数据库无关的业务逻辑操作。如MessageService调用MessageDAO实现增删改查,并负责一些数据类型转换。
- servlet:主要是通过调用对应的service,提供http方法方法,并处理web访问的格式(如UTF-8)与参数接收。
- DbHelper:提供访问数据库辅助。如单例模式DBJdbcHelper提供jdbc方式访问mysql数据库连接对象Connection;DBMybatisHelper(还没改为单例模式)提供mybatis访问数据库的会话SqlSession
用idea创建一个maven 的web项目MicroMessageMybatis
注:如果对idea创建Manven webapp不熟悉,可参见Spring MVC -Hello World(环境搭建)
下面介绍涉及知识
- 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包)
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配置文件
- mybatis配置文件入口Configuration.xml(可以是其他文件名称哦)
-
mybatis范围数据库的sql语句与参数配置文件Command.xml;CommandContent.xml;Message.xml
mybatis的配置文件参考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输出到文件
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());
}
}