jdbc中查找条件动态化

一般一个select语句的查找条件具有不确定性,如果单纯的只是把查找条件本身当做参数放入查找函数中,就不具有灵活性,如下:

public Goddess queryOne(Integer id) throws SQLException {
        Goddess g=null;
        Connection conn=DBUtil.getConn();
        String sql=""+
                    " select * from imooc_goddess"+
                    " where id=?";
        PreparedStatement ptmt=conn.prepareStatement(sql);
        ptmt.setInt(1, id);
        ResultSet rs=ptmt.executeQuery();
        while(rs.next())
        {
            g=new Goddess();
            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.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")); 
        }
        return g;
    }

这里只是把一个条件id当做查找条件作为形参,但是事实情况可能包含很多查找条件,这时考虑可以用List

public List<Goddess> query(List<Map<String,Object>> params) throws SQLException{
        Goddess g=null;
        List<Goddess> gs = new ArrayList<Goddess>();
        Connection conn=DBUtil.getConn();
        StringBuilder sb=new StringBuilder();
        sb.append("select * from imooc_goddess where 1=1");
        if(params!=null && params.size()>0)
        {
            for(int i=0;i<params.size();i++)
            {
                Map<String,Object> tmp=params.get(i);
                sb.append(" and "+tmp.get("name")+" "+tmp.get("rea")+" "+tmp.get("value"));
            }
        }
        PreparedStatement ptmt=conn.prepareStatement(sb.toString());
        ResultSet rs=ptmt.executeQuery();
        while(rs.next())
        {
            g=new Goddess();
            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.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")); 
            gs.add(g);
        }
        return gs;      
    }

如果具有以下数据表imooc_goddess:
这里写图片描述
具体测试的时候比如 select * from imooc_goddess where user_name like “’%程%’” and sex=1,代码如下:

public static void main(String[] args) throws Exception {
        GoddessDao dao=new GoddessDao();
        List<Goddess> gs=new ArrayList<Goddess>();
        Goddess g=null;
        List<Map<String,Object>> params=new ArrayList<Map<String,Object>>();
        Map<String,Object> param=new HashMap<String,Object>();
        param.put("name", "sex");
        param.put("rea","=");
        param.put("value", 1);
        params.add(param);
        param=new HashMap<String,Object>();
        param.put("name", "user_name");
        param.put("rea", "like");
        param.put("value", "'%程%'");
        params.add(param);
        gs=dao.query(params);
        for(Goddess gg:gs)
        {
            System.out.println(gg.toString());
        }
    }

输出结果如下:
Goddess [id=12, user_name=程秋平, sex=1, age=20, birthday=2017-02-21, email=Viviencheng@outlook.com, mobile=15527128967, create_user=Admin, update_user=Admin, create_date=2017-02-21, update_date=2017-02-21, isdel=1]

另外一个技巧:
如果查询条件中间不用连接词and而是用or,那么就应该把sb的初始字符串的“1=1”换成”1=0”,并且在后面的连接中用”or”:

sb.append("select * from imooc_goddess where 1=0");
        if(params!=null && params.size()>0)
        {
            for(int i=0;i<params.size();i++)
            {
                Map<String,Object> tmp=params.get(i);
                sb.append(" or "+tmp.get("name")+" "+tmp.get("rea")+" "+tmp.get("value"));
            }
        }
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
ShardingSphere提供了一种基于Spring Cloud Config的动态配置方式,可以实现Sharding-JDBC动态化配置。具体实现步骤如下: 1. 添加ShardingSphere的Spring Cloud Config依赖 ``` <dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId>sharding-jdbc-spring-cloud-config</artifactId> <version>${shardingsphere.version}</version> </dependency> ``` 2. 创建ShardingSphere的配置文件 在Spring Cloud Config Server创建一个名为`sharding-jdbc.yml`的文件,用于存放ShardingSphere的配置信息。例如: ``` spring: shardingsphere: datasource: names: ds0, ds1 ds0: type: com.zaxxer.hikari.HikariDataSource driver-class-name: com.mysql.jdbc.Driver jdbc-url: jdbc:mysql://localhost:3306/ds0 username: root password: root ds1: type: com.zaxxer.hikari.HikariDataSource driver-class-name: com.mysql.jdbc.Driver jdbc-url: jdbc:mysql://localhost:3306/ds1 username: root password: root sharding: tables: t_order: actual-data-nodes: ds$->{0..1}.t_order_$->{0..1} table-strategy: inline: sharding-column: order_id algorithm-expression: t_order_$->{order_id % 2} ``` 3. 在应用程序添加Spring Cloud Config的支持 在应用程序的`bootstrap.yml`文件添加Spring Cloud Config的配置信息,例如: ``` spring: application: name: sharding-jdbc-demo cloud: config: uri: http://localhost:8888 label: master profile: dev ``` 4. 在应用程序使用ShardingSphere 在应用程序使用ShardingSphere的DataSource,例如: ``` @Autowired private DataSource dataSource; ``` 通过以上配置,Sharding-JDBC的配置信息就可以动态地从Spring Cloud Config Server获取,并且实现动态化配置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值