SELECT * FROM tab_name WHERE 1=1 AND......
向param中传递参数,如果是字符串类型的要加单引号
like、=、like与通配符%%。这几对查询都可以
like用于模糊查询
通配符“%”代表任意长的多个字符,“_”代表任意1个字符
List<Map<String,Object>> List集合中存放Map集合
查询条件+关系符号(=、>、<、in、like等)+查询值 来自主定义查询条件
技巧:where后面添加 1=1
调用查询时可以一次设置多个Map对象放入List
查询条件用 List<Map<>> 来存储,使查询更加灵活,妙啊~
like用于模糊查询
通配符“%”代表任意长的多个字符,“_”代表任意1个字符
List<Map<String,Object>>
List集合中存放Map集合,而这个Map对象的键是String类型,值是Object类型
sql语句:通过append追加,(" and "+map.get("name")+" "+map.get("rela")+" "+map.get("value")+" "),即查询条件+关系(=、>、like)+值,这样就比较自主。
技巧:where 1=1
步骤:
//创建List集合实例
//得到访问数据库的连接对象实例
//创建StringBuilder对象实例
//向StringBuilder实例增加字符串
//对sql语句进行预编译
//进行sql语句的编译,并返回结果集
//定义一个Goddess对象类型
//通过得到的结果集对Goddess对象里的变量进行赋值
//创建一个Goddess对象
//赋值
//把Goddess对象添加到result集合中
//返回result集合,便于GoddessAction层调用Goddess层的get方法
使用query(List<Map<String,Object>> params) 和 where 1=1; jdbc传参数过多的时候:用List<Map<String,Object>> params双泛型作为参数:<br> if(params!=null&¶ms.siaze()>0){<br> for(int i =0;i<params.size();i++){<br> Map<String,Object> map = params.get(i);<br> sb.append("and "+map.get("name")+" "+map.get("relation")+" "+map.get("value")");<br> }<br> }<br> 接下来在Action(main方法)中:<br> GoddessDao g = new GoddessDao();<br> List<Map<String,Object>> params = new ArrayList<Map<String,Object>>;<br> Map<String,Object> param = new HashMap<String,Object>();<br> params.put("name","user_name");<br> params.put("relation","=");<br> params.put("value","'小美'");--------注意如果值是字符串需要加上单引号区分字符串<br> List<Goddess> result = g.query(parms);
最新回答 / zxlolr123_
已解决。为了不与前面的append(追加字符串)连在一起,导致不能识别。若前面的append的追加字符串最后加了空格 后面的可以选择不加。
sql小技巧 在这里添加WHERE 1 = 1 恒等 表示这条语句永远可以通过 AND 连接到后面的字段
@MySQL---List传参和StringBuilder的使用
public List<Goddess> query(List<Map<String, Object>> params) throws Exception{//传入List集合参数 List<Goddess> result=new ArrayList<Goddess>(); Connection conn=DBUtil.getConnection();//连接数据库 StringBuilder sb=new StringBuilder();//线程不安全,但大部分情况下速度快 sb.append("select * from imooc_goddess where 1=1 "); if(params!=null&¶ms.size()>0){//判断是否为空 for (int i = 0; i < params.size(); i++) { Map<String, Object> map=params.get(i); sb.append(" and "+map.get("name")+" "+map.get("rela")+" "+map.get("value")+" "); } } PreparedStatement ptmt=conn.prepareStatement(sb.toString());//预编译 System.out.println(sb.toString()); ResultSet rs=ptmt.executeQuery();//执行查询 Goddess g=null; while(rs.next()){//遍历查询结果集 g=new Goddess();//赋值 g.setId(rs.getInt("id")); g.setUser_name(rs.getString("user_name")); g.setAge(rs.getInt("age")); g.setSex(rs.getInt("sex")); g.setBirthday(rs.getDate("birthday")); g.setEmail(rs.getString("email")); g.setMobile(rs.getString("mobile")); g.setCreate_date(rs.getDate("create_date")); g.setCreate_user(rs.getString("create_user")); g.setUpdate_date(rs.getDate("update_date")); g.setUpdate_user(rs.getString("update_user")); g.setIsdel(rs.getInt("isdel")); result.add(g);//添加 } return result; }
public Goddess query(String name) throws SQLException{
//实例化一个数据库对应实体类对象
Goddess g = new Goddess();
//通过connection获取数据库连接
Connection conn = DBUtil.getConnection();
//根据姓名查询对应信息
String sql = "select * from imooc_goddess where user_name = ?";
//预编译sql语句
PreparedStatement pstm = conn.prepareStatement(sql);
//对占位符参数进行赋值
pstm.setString(1, name);
//执行查询获取结果集
ResultSet rs = pstm.executeQuery();
//判断rs是否为空
if(rs.next()){
//通过实体类set方法根据查询结果为对象g赋值
g.setId(rs.getInt("id"));
g.setUser_name(rs.getString("user_name"));
g.setSex(rs.getInt("sex"));
g.setAge(rs.getInt("age"));
g.setBirthday(rs.getDate("birthday"));
g.setEmail(rs.getString("email"));
g.setMobile(rs.getString("mobile"));
g.setCreate_date(rs.getString("create_date"));
g.setCreate_user(rs.getString("create_user"));
g.setUpdate_date(rs.getString("update_date"));
g.setUpdate_user(rs.getString("update_user"));
g.setIsdel(rs.getInt("isdel"));
}
//返回对象
return g;
}
GoddessDao gs = new GoddessDao();
System.out.println(gs.query("lucy"));
技巧 select * from tableName where 1=1
and ...
and...
简要的说, String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象(为什么?问问 Java 的设计者吧,为什么 String 不是原生类型呢?)因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM 的 GC 就会开始工作,那速度是一定会相当慢的。
在执行速度方面的比较:StringBuilder > StringBuffer
2. StringBuffer与StringBuilder,他们是字符串变量,是可改变的对象,每当我们用它们对字符串做操作时,实际上是在一个对象上操作的,不像String一样创建一些对象进行操作,所以速度就快了。
3. StringBuilder:线程非安全的
StringBuffer:线程安全的
当我们在字符串缓冲去被多个线程使用是,JVM不能保证StringBuilder的操作是安全的,虽然他的速度最快,但是可以保证StringBuffer是可以正确操作的。当然大多数情况下就是我们是在单线程下进行的操作,所以大多数情况下是建议用StringBuilder而不用StringBuffer的,就是速度的原因。
对于三者使用的总结:1.如果要操作少量的数据用 = String
2.单线程操作字符串缓冲区 下操作大量数据 = StringBuilder
3.多线程操作字符串缓冲区 下操作大量数据 = StringBuffer
public List<Goddess> query(List<Map<String, Object>> params) throws Exception{
List<Goddess> result=new ArrayList<Goddess>();
Connection conn=DBUtil.getConnection();
StringBuilder sb=new StringBuilder();
sb.append("select * from imooc_goddess where 1=1 ");
if(params!=null&¶ms.size()>0){
for (int i = 0; i < params.size(); i++) {
Map<String, Object> map=params.get(i);
sb.append(" and "+map.get("name")+" "+map.get("rela")+" "+map.get("value")+" ");
}
}
PreparedStatement ptmt=conn.prepareStatement(sb.toString());
System.out.println(sb.toString());
ResultSet rs=ptmt.executeQuery();
Goddess g=null;
while(rs.next()){
g=new Goddess();
g.setId(rs.getInt("id"));
g.setUser_name(rs.getString("user_name"));
g.setAge(rs.getInt("age"));
g.setSex(rs.getInt("sex"));
g.setBirthday(rs.getDate("birthday"));
g.setEmail(rs.getString("email"));
g.setMobile(rs.getString("mobile"));
g.setCreate_date(rs.getDate("create_date"));
g.setCreate_user(rs.getString("create_user"));
g.setUpdate_date(rs.getDate("update_date"));
g.setUpdate_user(rs.getString("update_user"));
g.setIsdel(rs.getInt("isdel"));
result.add(g);
}
return result;
}