Java后端DAO层学习记录

在DAO层中,主要是和数据库打交道,负责一些数据的访问。而现在我要根据批量id查询大量用户的信息,按照常规操作来:

  @Repository
    public class UserDao extends BaseDAO {
    //定义新的RowMapper来获取参数
    public class UserMapper implements RowMapper {
            @Override
            public User mapRow(ResultSet resultSet,int index) throws SQLException{
                User user = new User();
                user.setId(resultSet.getInt("id"));
                user.setUsername(resultSet.getString("username"));
                user.setPassword(resultSet.getString("password"));
                return user;
            }
        }
            //根据批量的id得到大量用户的写法,利用集合
        public Collection findUsersByIDs(Collection ids){
            StringBuilder sql = new StringBuilder("select * from user where id in (");
            ids.forEach((id)->sql.append("?,"));
            sql.deleteCharAt(sql.length()-2);
    //        sql.deleteCharAt(sql.lastIndexOf(","));  //找到最后的一个逗号将其删除构成完整的sql语句,和上面的功能一样
            sql.append(")");
            //query有三个参数:SQL语句,参数数组,RowMapper对象,在这里就是我们上面实现了ROwMapper的UserMapper
            return jdbcTemplate.query(sql.toString(),ids.toArray(new Object[0]),new UserMapper());
        }


上面的写法除了用forEach遍历赋值外,还可以用常规的for循环来赋值,也可以用多线程并发,如下:

 public Collection findUsersByIDs(Collection ids){
        StringBuilder sql = new StringBuilder("select * from user where id in (");
        Object[] args = new Object[ids.size()];
        AtomicInteger index = new AtomicInteger(0);
        ids.forEach((id)->{
            sql.append(id).append("?,");
            args[index.getAndIncrement()] = id;
        });
        sql.deleteCharAt(sql.length()-2);
        sql.append(")");
       // return jdbcTemplate.query(sql.toString(),args,new UserMapper());
        // TODO:  不知道这个方法和下面的方法是否一致
        return jdbcTemplate.query(sql.toString(),ids.toArray(new Object[0]),new UserMapper());
        }

在这里顺便引用一下当时在慕课网上学习spring时很好的一些对于spring总结,来加深学习理解:
IOC即DI,不必调用者自己去new被调用对象,而是通过spring IOC容器把配置好的bean对象注入,可以通过设置注入即setter方法和构造器注入。bean装载可以通过xml配置设定,也可以同过设定扫描路径,然后通过注解来让容器识别到要装载的bean。aop面向切面编程,切面与业务是垂直的,不同业务往往都要做一些公共的类似的额外操作,在业务之前做,或在业务之后做,或在业务出了异常时做,或者在业务前后都要做,甚至这些要做的额外操作要用到业务本身的输入参数和业务完成的输出结果。比如业务一般都得记录日志,比如涉及数据更新的业务完成后都得伴随数据库操作,账户各种操作前都要验证用户权限,这些业务伴随的操作往往大致相似,如果每个业务都要写这些操作,特别繁琐,把这些操作提出来就成了切面,与业务分离。xml 和API方式都可以实现aop配置,pointcut是业务,aspect是切面,它俩怎么交互执行,怎么传参和调用结果,都可以通过xml和API方式实现。另外还有配置代理这一块比较蒙逼。最牛逼的是,之前看得傻了眼那么繁琐和复杂的xml,api方式用简单直观的aspectj方式竟然能等效实现,用的纯Java标签,在xml 里设一下自动代理。不过仅仅@Aspect容器不识别,要加上@Component 才识别。

你可能感兴趣的:(Java,spring)