Java 如何通用化查询逻辑应对复杂的查询需求?
<p>数据库有一些数据,如下模拟;</p>
<pre><code class="language-java">
ArrayList<User> objects = Lists.newArrayList();
objects.add(new User("zhangsan", "123456", 18, 1));
objects.add(new User("lisi", "123456", 22, 1));
objects.add(new User("wangwu", "123456", 30, 1));
objects.add(new User("zhaoliu", "123456", 43, 1));
objects.add(new User("xiaoli", "xiaoli67889", 16, 0));
objects.add(new User("xiaona", "nai324389", 22, 0));
</code></pre>
<h3>问题抛出</h3>
<p>针对这些数据的查询而言,通常会在 service 层定义许多查询接口,例如</p>
<ul>
<li>查询性别为男的用户</li>
<li>查询性别为男年龄 20 以下的用户</li>
<li>查询性别为男年龄 20 以下的并且默认密码是 123456 的用户</li>
<li>随需求增加...</li>
</ul>
<p>面对需求的变化多样,总是需要增量添加 controller 方法,service 方法,甚至 dao 方法,如何解决这个问题呢?</p>
<h3>面向函数编程是否能满足呢?</h3>
<pre><code class="language-java">//dao
public static List<User> getUserList() {
ArrayList<User> objects = Lists.newArrayList();
objects.add(new User("zhangsan", "123456", 18, 1));
objects.add(new User("lisi", "123456", 22, 1));
objects.add(new User("wangwu", "123456", 30, 1));
objects.add(new User("zhaoliu", "123456", 43, 1));
objects.add(new User("xiaoli", "xiaoli67889", 16, 0));
objects.add(new User("xiaona", "nai324389", 22, 0));
return objects;
}
</code></pre>
<pre><code class="language-java">//service
public static Optional getUserListByPredicate(Predicate<User> predicate) {
List<User> userList = UserDao.getUserList();
ArrayList<Object> resultList = Lists.newArrayList();
for (User user : userList) {
if (predicate.test(user)) {
resultList.add(user);
}
}
return Optional.ofNullable(resultList);
}
</code></pre>
<pre><code class="language-java">//controller
public static void main(String[] args) {
//查询性别为男,年龄 20 以下,并且密码为默认密码 123456 的用户
Optional<List> result = UserService.getUserListByPredicate((User user) -> {
return user.getSex() == 1 && user.getAge() < 20 && user.getPassword().equals("123456");
});
result.get().stream().forEach(user -> System.out.println(user));
}
</code></pre>
<p>我的想法是,dao 层总是返回全量的数据(此处有问题性能问题),在 service 层对查询条件进行抽象,controller 只需要将查询条件传入即可。</p>
<h3>更进一步用 stream 处理</h3>
<pre><code class="language-java">//dao
public static List<User> getUserList() {
ArrayList<User> objects = Lists.newArrayList();
objects.add(new User("zhangsan", "123456", 18, 1));
objects.add(new User("lisi", "123456", 22, 1));
objects.add(new User("wangwu", "123456", 30, 1));
objects.add(new User("zhaoliu", "123456", 43, 1));
objects.add(new User("xiaoli", "xiaoli67889", 16, 0));
objects.add(new User("xiaona", "nai324389", 22, 0));
return objects;
}
</code></pre>
<pre><code class="language-java">//controller 层
/**
* 查询性别为男,年龄 20 以下,并且密码为默认密码 123456 的用户
*
* @param args
*/
public static void main(String[] args) {
List<User> userList = UserDao.getUserList();
userList.stream().filter(
user -> user.getSex() == 1 && user.getAge() < 20 && user.getPassword().equals("123456")
).forEach(user -> System.out.println(user));
}
</code></pre>
<p>我的想法是,controller 总是获取所有的数据,针对流根据业务进行业务操作。</p>
<p>——————————</p>
<p>以上两种方法是否可行? 问题?</p>
收藏(0)
分享
相关标签:
注意:本文归作者所有,未经作者允许,不得转载