mysql查询不定参数_【实践记录】Java操作MySQL数据库——不定条件参数查询

引入

在数据库中,经常要实现查询操作,而且查询条件是不断根据实际情况动态变化的,以简书用户为例。假设一个简书用户有以下参数:用户名、个人简介、关注人数、粉丝人数、文章数、字数、收获喜欢数。如果我们的查询条件是用户名为某个值这一个条件、又或者用户名为某个值和关注人数在某一区间这两个条件。通过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;

随意添加数据后,数据库如图:

f9d28ae92257

数据库示例.png

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存储参数条件、通过List> 来存储多个参数条件

(2)、代码中SQL语句通过 and 实现查询条件的交集,当然也可以通过 or实现查询条件的并集,不过拼接SQL语句写法会有不同

(3)、SQL语句中 where 1=1 用来避免无查询条件时会出错。但如果确保有参数,其实也不用加 1=1.写法参照下文的拓展——通过 or实现查询条件的并集。

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> params) throws SQLException{

//获取数据库连接

Connection conn = DBUtil.getConnection();

List usersList = new ArrayList();

//通过拼接构建SQL语句

StringBuilder sb = new StringBuilder();

sb.append("select * from users where 1=1 ");

if(params!=null&&params.size()>0){

for(int i = 0;i

Map map = params.get(i);

sb.append(" and "+map.get("name")+" "+map.get("rela")+" "+map.get("value")+" ");

}

}

//执行SQL语句

PreparedStatement ps =conn.prepareStatement(sb.toString());

System.out.println(sb.toString());

ResultSet rs = ps.executeQuery();

//提取查询结果

Users user = null;

while(rs.next()){

user = new Users();

user.setId(rs.getInt("u_id"));

user.setName(rs.getString("u_name"));

user.setIntroduce(rs.getString("u_introduce"));

user.setFocusNum(rs.getLong("u_num_focus"));

user.setFansNum(rs.getLong("u_num_fans"));

user.setArticlesNum(rs.getLong("u_num_ariticles"));

user.setWordsNum(rs.getLong("u_num_words"));

user.setLikeNum(rs.getLong("u_num_like"));

usersList.add(user);

}

return usersList;

}

}

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 = new ArrayList>();

params.add(UsersDAO.addCondition("u_num_fans",">","100"));

try {

List usersList = new ArrayList();

usersList = UsersDAO.query(params);

for(Users s:usersList){

System.out.println("Id:"+String.valueOf(s.getId()));

System.out.println("昵称:"+s.getName());

System.out.println("个人介绍:"+s.getIntroduce());

System.out.println("关注人数:"+String.valueOf(s.getFocusNum())+"人");

System.out.println("粉丝人数:"+String.valueOf(s.getFansNum())+"人");

System.out.println("文章数:"+String.valueOf(s.getArticlesNum())+"篇");

System.out.println("字数:"+String.valueOf(s.getWordsNum())+"字");

System.out.println("收获喜欢数:"+String.valueOf(s.getLikeNum())+"个");

System.out.println();

}

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

public static void main(String[] args) {

Test test = new Test();

test.show();

}

}

f9d28ae92257

示例一结果.png

示例二:

添加代码:

params.add(UsersDAO.addCondition("u_name","=","'小明'"));

f9d28ae92257

示例二结果.png

拓展

1.通过 or 实现查询条件的并集

要点:

(1)、从第二个条件参数前开始加 or

//通过拼接构建SQL语句

StringBuilder sb = new StringBuilder();

sb.append("select * from users where ");

if(params!=null&&params.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 map = params.get(i);

sb.append(" or "+map.get("name")+" "+map.get("rela")+" "+map.get("value")+" ");

}

}

}

f9d28ae92257

or条件示例结果.png

注意事项(本次实践踩的坑)

1.连接MySQL数据库的连接语句记得设置编码格式,与数据库默认字符集相对应。不然很容易出现中文乱码或者查询不出正确结果。如何判断是编码格式问题方法:数据库新增一条记录,字符串部分用英文代替,跑一次程序若能正常运行,则是编码格式(中文无法正常识别)出了问题。

2.SQL注入引起的安全问题。网上评论说通过SQL语句拼接的方法容易导致SQL注入,由于没有接触过SQL注入,所以暂时无法细说。大概就是恶意SQL语句也拼接进来了吧。

相关参考

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/26022.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android 配置子Module混淆时遇到的错误,和一些零散技术点总结

概要说明: 1、子Module不能配置混淆,仅仅只能在主Module中配置混淆。 2、主Module配置了混淆,打包成apk后,其他Module的代码也会一起混淆。 3、所有Module中的res目录下的资源都会在打包时合并到主Module的res目录下对应文件位置。…

俄罗斯钓鱼服务器位置,俄罗斯钓鱼4《RussianFishing4》钓鱼地点攻略

俄罗斯钓鱼4《RussianFishing4》钓鱼地点攻略 一,胖比 35.49 卡8 蜂蜜面团 二.银鲫 同样35.49.卡8,甜面团,碎麦粥(这同点位就上个配置图吧) 三.青蛙 41.41 深度17,苍蝇 四.拟鲤 地点:码头 卡8毛翅目 五.梅花鲈 49.56 卡…

钓鱼概率问题,C语言实现和Python代码实现

钓鱼概率问题,C语言实现和Python代码实现 问题描述 又到了万物复苏的春天!活蹦乱跳的大鱼在沁湖各展风姿,GDUFE 的渔夫全都迫不及待地来钓鱼了,Baby O 也是其中之一。 其中,沁湖里有 n条鱼,来参加比赛的…

使用Ambari快速部署Hadoop大数据环境

前言 做大数据相关的后端开发工作一年多来,随着Hadoop社区的不断发展,也在不断尝试新的东西,本文着重来讲解下Ambari,这个新的Apache的项目,旨在让大家能够方便快速的配置和部署Hadoop生态圈相关的组件的环境,并提供维护和监控的功能. 作为新手,我讲讲我自己的学习经历,刚刚开始…

未来计算机带给自动化的机遇,数字化变革催生机遇 自动化已然“原力觉醒”...

原标题:数字化变革催生机遇 自动化已然“原力觉醒” 自动化兼具计算机速度与人工智能 计算机快速、精确,但缺乏智能。人工速度慢、不稳定,但足智多谋。自动化则以最简单的方式将计算机的速度与人工智能相结合,将手动流程转变为无需…

热烈庆祝祖国成立70周年,2019国庆档大片《我和我的祖国》、《攀登者》、《中国机长》数据分析

今年的国庆有大阅兵,也有情怀大片着实很不一般,今年我的国庆节是在医院里面度过的,不过我没有错过这举国欢庆的大阅兵仪式,还记得那一天早上好多老人、病号都齐刷刷地站在大厅注目着硕大的显示屏中的阅兵典礼,非常庄严…

代码规范指南:怎样写才能干净整洁

选自 Medium 作者:Chris Blakely 机器之心编译 能把代码写出来是一回事,但是写出整洁、可读的代码又是另一回事。然而,什么是「干净的代码」呢?怎么才能写出「干净的代码」?为了解答这些问题,本文作者写了一…

58全站用户行为数据仓库建设及实践

背景 随着58业务体系的不断建设与发展,数据分析与应用需求越来越丰富,给数据仓库的建设工作带来了很大的挑战。 全站行为数据仓库建设过程中,我们总结的问题包括如下几点: (1) 数据体系架构已经无法支持业务的快速迭代&#xff0c…

CSDN每日打卡已经2周,进展如何?(送两个CSDN背包)

🍅 作者主页:不吃西红柿 🍅 简介:CSDN博客专家 & 总榜前十🏆、HDZ核心组成员。欢迎点赞、收藏、评论 🍅 粉丝专属福利:知识体系、面试题库、技术互助、简历模板。文末公众号领取 点赞评论 …

哈利路亚

2019独角兽企业重金招聘Python工程师标准>>> 产品规划、产品设计、产品开发、数据分析、数据挖掘、数据开发 转载于:https://my.oschina.net/u/818486/blog/185941

php钓鱼怎么使用方法,路亚钓法操作步骤及抛投技巧

路亚操作的五个基本步骤 虽然按照拟饵的钓法可以横跨淡水钓与海水钓二大系统,而且拟饵的种类达十大类几千种之多,但是,要如何才能玩好拟饵钓法,主要的操竿技巧则有五点,即为:“抽”、“摆”、“旋”、“快”…

AI扮演Linux虚拟机,能管理文件编程开浏览器,还能跟自己「套娃」聊天 | ChatGPT新玩法...

詹士 发自 凹非寺量子位 | 公众号 QbitAI ChatGPT能运行docker了? 还可以自己连接到OpenAI网站,查查自己? 被玩出花的OpenAI聊天AI ChatGPT,又被整出新活了。 如上技能是一位DeepMind研究者Jonas Degrave的最新发现。 刚发出来几小…

chatgpt赋能python:Python作画:如何使用Python创建美丽而独特的艺术作品

Python作画:如何使用Python创建美丽而独特的艺术作品 介绍 Python被认为是一种多用途编程语言,可用于开发各种应用程序,包括软件工具、游戏、Web应用程序、机器学习算法和数据分析。但你也可能没有意识到,Python还可以被用于造美…

Stable Diffusion高阶技能(1)-掌握这些,你也能绘出惊艳画作

开篇 初踏入AI作画的世界,你可能会对如何制造出惊艳的艺术作品而困惑。作为一个前沿技术的探索者,我在这一篇文章中,会和你一同揭秘如何用正确的提示词操控AI的“透视”,将最美的画面展现在你眼前。 技能一、提高图片质量的高阶手法 在数量众多的元素中,我们如何做出最…

【益智游戏】开锁小游戏+ChatGPT写html代码

跟军哥吃饭聊天,说到一些个有意思的思维题目,说是小学五年级的题目,我竟然想了好久,问的GPT才恍然大悟!哈哈,记录下,顺便给小孩讲讲 在网页上玩一玩! 游戏规则: 密码锁有…

Python量化交易实战教程汇总

完整版视频教程 你将收获 手把手带你打造一个易扩展、更安全、效率更高的量化交易系统 教给你量化交易的投资思想 编程技术 核心量化策略 交易系统开发 讲师经验分享 成为一个“技术流”理财高手 结合chatgpt提问快速掌握Python量化交易实战 快速提问提高学习效率 适…

Android 微信登录 无法调起授权页面

如果你什么都比对了,有问题,只有一个原因 签名不匹配, 工具地址 微信开放文档 去微信 官方下载签名工具,然后按到手机上,然后在你工程的包名 粘贴一下子,发到手机上,然后用微信那个工具 放包名,获取你的签名,然后去微信官方换一下,然后等一会就好了.\ 如果这个还不行, and…

老杨说运维 | 运维数智化转型正确打开方式是什么?他这样说

2023年5月9日,中国计算机用户协会信息科技审计分会会员大会暨金融科技风险管理与审计论坛成功于北京召开。擎创科技CEO杨辰受邀与会,并分享了在数智运维发展过程中对企业数智化转型建设的规划思考以及相关实践经验。 同时,年会上举行了“金融…

【[ChatGPT] 从 GPT-3.5 到 GPT-5 的进阶历程 |带你全面详细的了解与学习】

目录 一、简介背景介绍OpenAi的前世今生Ai概述GTP的出现 二、chatGPT的进阶之路chatGPT版本的区别A. 模型规模的比较B. 语言理解能力的比较C. 训练数据集的比较D. 应用场景的比较 三、GTP-4到GTP-5的过渡GTP5的发展之路 四、深度学习的愿景GTP-5能否取代程序员?深度…

亚马逊运营知识:ASIN文案编写技巧

ASIN页面是买家了解商品的重要渠道,对转化率的影响很大,它包括了图片、价格、评论、文案等。那么ASIN文案怎么编辑呢?下面海熹跨境人才网给大家分享亚马逊运营人才ASIN文案编写技巧。一起来了解一下吧。 一、确认主要关键词列表 首先,我们需…