关于java数据表搜索 列值的返回问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于java数据表搜索 列值的返回问题相关的知识,希望对你有一定的参考价值。

像以下代码
while(rs.next())
Xxx x= new Xxx();

x.setId(rs.getInt("id"));
x.setName(rs.getString("name");
...


假如一个表中列项很多 难道都要这个这样get,set么 有什么简便的方法

要不用开源框架,要不自己写个简单的框架,我就写了个简单的

/**
* 返回list,list里面装map数据
* @param sql
* @return
*/
public List<Map<String,String>> find_list_map(String sql) 
List<Map<String,String>> list = new ArrayList<Map<String,String>>();
Map<String, String> map = null;
try 
if(conn==null)
try 
getConn();
 catch (Exception e) 
e.printStackTrace();


statement = conn.createStatement();
rs = statement.executeQuery(sql);
int columnCount = max_count(rs);
ResultSetMetaData metaData = rs.getMetaData();
while(rs.next())
map = new HashMap<String, String>();
for(int i=1;i<=columnCount;i++)
map.put(metaData.getColumnName(i), rs.getString(i));

list.add(map);

 catch (SQLException e) 
e.printStackTrace();
finally

return list;


List<Map<String,String>> 这个返回,根据自己的需要把,我创建了一个简单的表,就2个字段,是String类型的,所以就封装String了

/////////////////////如果你很想用实体类的话,可以研究一下这个,我自己写的,还不完整,String和int的可以封装,自己在do_set方法里面添加就可以了
public <T> List<T> find_entity(Class<T> t,String sql)
List<T> list = new ArrayList<T>();
Object obj = null;
//将实体类set方法名和类型存起来
 Field[] field = t.getDeclaredFields();
        for (int i = 0; i < field.length; i++) 
            // 权限修饰符
            // 属性类型
            Class<?> type = field[i].getType();
            name_nameType_map.put(field[i].getName(), type.getName());
        
try 
if(conn==null)
try 
getConn();
 catch (Exception e) 
e.printStackTrace();


statement = conn.createStatement();
rs = statement.executeQuery(sql);
int columnCount = max_count(rs);
ResultSetMetaData metaData = rs.getMetaData();

String columnName = "";
String setName = "";
// Class<?> type = null;
while(rs.next())
obj = t.newInstance();
for(int i = 1;i<=columnCount;i++)
//得到数据库字段名
columnName = metaData.getColumnName(i);
//拼接set方法字符串
setName = "set" + columnName.substring(0, 1).toUpperCase()+columnName.substring(1, columnName.length());
// type = field[i-1].getType();
//将数据库的字段值封装到对象里
do_set(obj,setName,columnName,rs.getString(i));


list.add((T)obj);

 catch (Exception e) 
e.printStackTrace();
finally

return list;

/**
 * 封装,暂时只做了int和String类型的处理,其他的需要再写上
 * @param obj
 * @param setName
 * @param type
 * @param v
 */
private void do_set(Object obj, String setName,String columnName,
String v) 
Method method;
String tp = name_nameType_map.get(columnName);
try 
if("int".equals(tp))
method = obj.getClass().getMethod(setName,int.class);
method.invoke(obj,Integer.valueOf(v));
else if("java.lang.String".equals(tp))
method = obj.getClass().getMethod(setName,String.class);
method.invoke(obj,v);

 catch (Exception e) 
e.printStackTrace();

参考技术A ResultSet的方法

ResultSetMetaData
getMetaData()
Retrieves the number, types and properties of
this ResultSet object's columns.

ResultSetMetaData 类里面有列的信息,列数量、列名等。

再使用循环,取各字段就好了。
可以按List<Map<String, Object>> 返回
参考技术B 你可以使用hibernat框架 不然你就自己写一个模板吧 一劳永逸

如何在MySql中返回具有相同列值的行

【中文标题】如何在MySql中返回具有相同列值的行【英文标题】:How to return rows that have the same column values in MySql 【发布时间】:2013-05-23 01:36:30 【问题描述】:

让我们考虑下表-

ID Score
1  95

2  100

3  88

4  100

5  73

我是一个 SQL 新手,但如何返回包含 ID 2 和 4 的分数? 所以它应该返回 100,因为它在 ID 2 和 4 中都有特色

【问题讨论】:

【参考方案1】:

这是“sets-within-sets”查询的示例。我建议使用 having 子句进行聚合,因为它是最灵活的方法。

select score
from t
group by score
having sum(id = 2) > 0 and -- has id = 2
       sum(id = 4) > 0     -- has id = 4

这样做是按分数聚合。然后having 子句(sum(id = 2))的第一部分计算每个分数有多少个“2”。第二个是计算有多少个“4”。仅返回“2”和“4”的分数。

【讨论】:

【参考方案2】:
SELECT score
FROM t
WHERE id in (2, 4)
HAVING COUNT(*) = 2 /* replace this with the number of IDs */

这将选择 ID 为 2 和 4 的行。HAVING 子句然后确保我们找到了这两行;如果缺少任何一个,则计数将小于 2。

这假定id 是一个唯一的列。

【讨论】:

在更一般的情况下,当 id 不能保证唯一时,我们可以使用 COUNT(DISTINCT id) 代替 COUNT(*) b>. 确实如此,但根据我的经验,这种模式的几乎所有使用都涉及独特的列。【参考方案3】:
select Score
from tbl a
where a.ID = 2 -- based off Score with ID = 2
    --include Score only if it exists with ID 6 also
    and exists (
        select 1
        from tbl b
        where b.Score = a.Score and b.ID = 6
    )
    -- optional?  ignore Score that exists with other ids as well
    and not exists (
        select 1
        from tbl c
        where c.Score = a.Score and c.ID not in (2, 6)
    )

【讨论】:

以上是关于关于java数据表搜索 列值的返回问题的主要内容,如果未能解决你的问题,请参考以下文章

关于java的binarySearch()方法

关于java传递值的说明

关于java中属性变量默认值的问题。

java关于POI的使用问题

关于ajax请求action回调函数处理返回值的问题

关于java跨项目调用接口的问题