引入
在数据库中,经常要实现查询操作,而且查询条件是不断根据实际情况动态变化的,以用户为例。假设一个用户有以下参数:用户名、个人简介、关注人数、粉丝人数、文章数、字数、收获喜欢数。如果我们的查询条件是用户名为某个值这一个条件、又或者用户名为某个值和关注人数在某一区间这两个条件。通过Java操作的话,我们不可能每种情况都写一个查询方法,最有效的方法应该是:只写一个方法,让他自己检测参数个数,获取条件参数,实现对应的数据库操作。那么该如何实现呢?
知识点归纳(方法步骤)
1.数据库设计
为了方便,直接使用Navicat for MySQL来创建数据表
要点:
(1)、设置默认字符集为 utf8
(2)、字段类型:char类型长度固定、varchar类型长度随内容变化
CREATE TABLE users(
u_id int NOT NULL AUTO_INCREMENT,
u_name char(20) NOT NULL UNIQUE,
u_introduce char(50) NOT NULL,
u_num_focus bigint NOT NULL,
u_num_fans bigint NOT NULL,
u_num_ariticles bigint NOT NULL,
u_num_words bigint NOT NULL,
u_num_like bigint NOT NULL,
PRIMARY KEY(u_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
随意添加数据后,数据库如图:
2.根据数据库编写Users类
要点:
(1)、MyEclipse中菜单栏 Source 中选项 Generate Getters and Setters 可以自动创建set()、get()方法。
/*
* 省略了set()、get()方法
*/
public class Users {
private int Id;
private String name;
private String introduce;
private long focusNum;
private long fansNum;
private long ArticlesNum;
private long wordsNum;
private long likeNum;
}
3.编写连接、关闭数据库的util工具类
要点:
(1)、Java连接MySQL数据库需要JDBC驱动:本人的为 mysql-connector-java-5.1.39-bin.jar
(2)、Java连接MySQL数据库的连接语句记得设置字符集 useUnicode=true&characterEncoding=utf-8。(踩了坑,花了一天才解决出现的MySQL不识别中文字符问题)
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DBUtil {
/*
* 获取数据库的连接
*/
public static Connection getConnection(){
Connection conn = null;
try {
conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/db_jianshuuser?useUnicode=true&characterEncoding=utf-8", "root", "123456");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return conn;
}
/*
* 关闭数据库的连接
*/
public static void close(Connection conn){
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
4.在UserDAO类中实现不定条件参数查询
要点:
(1)、通过Map
import java.io.UnsupportedEncodingException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import demo.pojo.Users;
import util.DBUtil;
public class UsersDAO {
/*
* 不定条件参数查询
*/
public static Map addCondition(String str1,String str2,Object obj){
Map map = new HashMap();
map.put("name",str1);
map.put("rela",str2);
map.put("value",obj);
return map;
}
public static List query(List
5.测试
要点:
(1)、通过List对象的add方法添加参数个数
(2)、MySQL数据库中如果字段是字符类型的需要加单引号 'xxx',如 '小明'
**示例一:
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import demo.dao.UsersDAO;
import demo.pojo.Users;
public class Test {
public void show(){
List
示例二:
添加代码:
params.add(UsersDAO.addCondition("u_name","=","'小明'"));
拓展
1.通过 or 实现查询条件的并集
要点:
(1)、从第二个条件参数前开始加 or
//通过拼接构建SQL语句
StringBuilder sb = new StringBuilder();
sb.append("select * from users where ");
if(params!=null&¶ms.size()>0){
if(params.size()==1){
Map map = params.get(0);
sb.append(map.get("name")+" "+map.get("rela")+" "+map.get("value")+" ");
}else{
Map map0 = params.get(0);
sb.append(map0.get("name")+" "+map0.get("rela")+" "+map0.get("value")+" ");
for(int i = 1;i map = params.get(i);
sb.append(" or "+map.get("name")+" "+map.get("rela")+" "+map.get("value")+" ");
}
}
}
注意事项(本次实践踩的坑)
1.连接MySQL数据库的连接语句记得设置编码格式,与数据库默认字符集相对应。不然很容易出现中文乱码或者查询不出正确结果。如何判断是编码格式问题方法:数据库新增一条记录,字符串部分用英文代替,跑一次程序若能正常运行,则是编码格式(中文无法正常识别)出了问题。
2.SQL注入引起的安全问题。网上评论说通过SQL语句拼接的方法容易导致SQL注入,由于没有接触过SQL注入,所以暂时无法细说。大概就是恶意SQL语句也拼接进来了吧。
相关参考
慕课网JDBC教程搭建模型层IV
java编码字符集及jdbc连接数据库指定字符集
SQL注入——百度百科