该部分代码以完成,欢迎参考
https://github.com/heibai23/MicroMessage
jdbc的数据库连接地址后面加?useUnicode=true&characterEncoding=UTF-8
Message.xml的select标签中间select语句最后没加where 1=1
正确的sql语句是select ID,COMMAND,DESCRIPTION,CONTENT from MESSAGE where 1=1 and COMMAND=? 。
String 每次追加字符串时会重新分配存储空间,性能较差;
StringBuilder和StringBuffer会在原对象上向后追加,性能较好。
其中StringBuilder性能最好,但不是线程安全的,而StringBuffer支持线程安全,因此多线程环境应该用StringBuffer
判断字符串为空时,可以去一下空格
sql.append(" and DESCRIPTION like '%' ? '%'");
这句 ? 前后一定要加空格,不然查不出来。
Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/micro_message?useUnicode=true&characterEncoding=utf-8","root", "root");
这句要这样写,若写成
Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/micro_message","root", "root");可能会出现中文乱码问题,无法进行列表查询。
sql.append(" and DESCRIPTION like '%'?'%'");中'%'与?之间要有空格才行。否则查询不出结果的。
trim() 方法用于删除字符串的头尾空白符。
在无多线程的情况下操纵同一个变量,例如:StringBuilder
输入框回显数据${command}
Trim Trim() 功能删除字符串首部和尾部的空格。 语法Trim ( string ) 参数string:string类型,指定要删除首部和尾部空格的字符串返回值String。函数执行成功时返回删除了string字符串首部和尾部空格的字符串,发生错误时返回空字符串("")。如果任何参数的值为NULL,Trim()函数返回NULL。
String 字符串常量 StringBuffer 字符串变量(线程安全) StringBuilder 字符串变量(非线程安全) 简要的说, String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象, 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM 的 GC 就会开始工作,那速度是一定会相当慢的。 在大部分情况下 StringBuilder > StringBuffer
@关键代码(技巧): StringBuilder sql=new StringBuilder(" select ID,COMMAND,DESCRIPTION,CONTENT from message where 1=1 "); List<String> paramList=new ArrayList<String>(); if(command!=null&&!"".equals(command.trim())){ sql.append(" and COMMAND=? "); paramList.add(command); } if(description!=null&&!"".equals(description.trim())){ sql.append(" and DESCRIPTION like '%' ? '%' ");//MySql语法:'%'空格?空格'%' paramList.add(description); } PreparedStatement pstmt=conn.prepareStatement(sql.toString()); for(int i=0;i<paramList.size();i++){ pstmt.setString(i+1,paramList.get(i)); } ResultSet rs=pstmt.executeQuery(); 注意1:PreparedStatement语句要在sql语句还没准备好后面,但要在循环前面。 注意2:为何不直接在if语句后写“?”的内容呢?因为不知道问号序号是多少,不好控制。 Ps1:Tomcat启动一般用Debug,只要不要设置断点,效果与Run是一样的,这样一来,如果想调试就设置断点即可,不需要再切换到Debug模式(Ps:Debug模式下,修改Java代码会自动上传到服务器,无需重新启动Tomcat) Ps2:sql+="";//这样写不好,因为原来的字符串占用内存还在,推荐使用StringBuffer、StringBuilder。
List<Message> messageList=new ArrayList<Message>(); while(rs.next()){ Message message=new Message(); messageList.add(message); message.setId(rs.getString("ID")); ... } 注意:先放数据,再添加到容器;或者先添加到容器,再放数据。都是一样的,因为它放进去是引用类型,并不是对象本身。 select * from...//1 select id,name,...(所有列名) from...//2 注意:2的效率和安全性比1要高。 Ps1: Alt+Shift+J:自动添加类的文档注释。 Ctrl+Shift+Y:大写转小写 Ctrl+Shift+X:小写转大写 Ps2:varStatus=""中变量名支持自定义。