NamedParameterJdbcTemplate学习总结

NamedParameterJdbcTemplate学习总结NamedParameterJdbcTemplate学习总结

大家好,又见面了,我是你们的朋友全栈君。

环境

版本信息

spring的版本为4.1.4(spring3我也用过,就配置信息略有不同,其用法还是一样的)

配置信息

需要在applicationContext.xml中配置以下信息

<bean id="namedParameterJdbcTemplate" class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
    <constructor-arg ref="dataSource"/>
</bean>

如果已经在文件中配置了jdbctemplate的话还可以使用以下方法配置

<bean id="namedParameterJdbcTemplate" class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
    <constructor-arg ref="jdbcTemplate"/>
</bean>

当然也可以使用最原始的方法(该方法也需要配置jdbctemplate)

NamedParameterJdbcTemplate namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(jdbcTemplate);

持久化类

本文章中的所有案例都是根据以下类来试验的:

    public class User {
        private int id;
        private String userName;
        private String sex;
        private String password;
        private String address;
            //省略 set/get
    }

简单操作数据

查询

查询一条数据

传入参数是基本数据类型的map时

    public User selectUserById(String id) {
        String sql = "SELECT id,username,sex,password,address FROM user WHERE id = :id";
        Map<String, Object> paramMap = new HashMap<String, Object>();
        paramMap.put("id", id);
        RowMapper<User> rm = BeanPropertyRowMapper.newInstance(User.class);
        User user = namedParameterJdbcTemplate.queryForObject(sql, paramMap, rm);
        return user;
    }

传入的参数是对象时

    public User queryByUser(User user) {
        String sql = "SELECT id,username,sex,password,address FROM user WHERE id = :id";
        SqlParameterSource ps = new BeanPropertySqlParameterSource(user);
        RowMapper<User> rm = BeanPropertyRowMapper.newInstance(User.class);
        return namedParameterJdbcTemplate.queryForObject(sql, ps, rm);
    }

查询多条数据

普通查询

    public List<User> selectUser() {
        String sql = "SELECT id,username,sex,password,address FROM user";
        Map<String, Object> paramMap = new HashMap<String, Object>();
        RowMapper<User> rm = BeanPropertyRowMapper.newInstance(User.class);
        List<User> userList = namedParameterJdbcTemplate.query(sql, rm);
        return userList;
    }

模糊查询

    public List<User> selectUserLikeByName(String name) {
        //'%'空格:userName空格'%' 一定要有空格,不然会报错
        String sql = "SELECT id,username,sex,password,address FROM user WHERE username LIKE '%' :userName '%'";
        Map<String, Object> paramMap = new HashMap<String, Object>();
        paramMap.put("userName", name);
        RowMapper<User> rm = BeanPropertyRowMapper.newInstance(User.class);
        List<User> users = namedParameterJdbcTemplate.query(sql, paramMap, rm);
        return users;
    }

添加数据

    public void insertUser(User user) {
        String sql = "INSERT INTO user (username, sex, password, address) VALUES (:username,:sex,:password,:address)";
        Map<String, Object> paramMap = new HashMap<String, Object>();
        paramMap.put("username", user.getUserName());
        paramMap.put("sex", user.getSex());
        paramMap.put("password", user.getPassword());
        paramMap.put("address", user.getAddress());
        namedParameterJdbcTemplate.update(sql, paramMap);
    }

修改数据

    public void updateUser(User user) {
        String sql = "UPDATE user SET username = :userName,sex = :sex,password=:password,address=:address WHERE id = :id;";
        SqlParameterSource ps = new BeanPropertySqlParameterSource(user);
        namedParameterJdbcTemplate.update(sql, ps);
    }

可以与添加数据再进行对比,这样就能发现当占位符比较多的情况下传入对象时多么的方便

删除数据

    public void deleteUser(String id) {
        String sql = "DELETE FROM user WHERE id = :id";
        Map<String, Object> paramMap = new HashMap<String, Object>();
        paramMap.put("id", id);
        namedParameterJdbcTemplate.update(sql, paramMap);
    }

看到此处可以发现添加,修改,删除数据namedParameterJdbcTemplate提供的方法都是一样的,都是update方法。

批量操作数据

批量操作数据一共有两种方法

批量添加

方法一

    public void batchInsert() {
        User chen = new User("chen", "男", "123456789", "fuzhou");
        User alex = new User("alex", "男", "123456", "fuzhou");
        List<User> userList = new ArrayList<>();
        userList.add(chen);
        userList.add(alex);
        List<Map<String, Object>> batchValues = new ArrayList<>(userList.size());
        for (User user : userList) {
            batchValues.add(
                    new MapSqlParameterSource("username", user.getUserName())
                            .addValue("sex", user.getSex())
                            .addValue("password", user.getPassword())
                            .addValue("address", user.getAddress())
                            .getValues());
        }
        String sql = "INSERT INTO user (username, sex, password, address) VALUES (:username,:sex,:password,:address)";
        int[] updateCounts = namedParameterJdbcTemplate.batchUpdate(sql, batchValues.toArray(new Map[userList.size()]));
    }

方法二

    public void batchInsertUser() {
        User chen = new User("chen", "男", "123456789", "fuzhou");
        User alex = new User("alex", "男", "123456", "fuzhou");
        List<User> userList = new ArrayList<>();
        userList.add(chen);
        userList.add(alex);
        String sql = "INSERT INTO user (username, sex, password, address) VALUES (:username,:sex,:password,:address)";
        SqlParameterSource[] batch = SqlParameterSourceUtils.createBatch(userList.toArray());
        int[] updateCounts = namedParameterJdbcTemplate.batchUpdate(sql, batch);
    }

批量修改

方法一

    public void batchUpdate() {
        User chen = new User(12,"chen", "男", "111111111", "fuzhou");
        User alex = new User(13,"alex", "男", "111111111", "fuzhou");
        List<User> userList = new ArrayList<>();
        userList.add(chen);
        userList.add(alex);
        List<Map<String, Object>> batchValues = new ArrayList<>(userList.size());
        for (User user : userList) {
            batchValues.add(
                    new MapSqlParameterSource("username", user.getUserName())
                            .addValue("id",user.getId())
                            .addValue("sex", user.getSex())
                            .addValue("password", user.getPassword())
                            .addValue("address", user.getAddress())
                            .getValues());
        }
        String sql = "UPDATE user SET username = :username,sex = :sex,password=:password,address=:address WHERE id = :id;";
        int[] updateCounts = namedParameterJdbcTemplate.batchUpdate(sql, batchValues.toArray(new Map[userList.size()]));
    }

方法二

    public void batchUpdateUser() {
        User chen = new User(14,"chen", "男", "111111111", "fuzhou");
        User alex = new User(15,"alex", "男", "111111111", "fuzhou");
        List<User> userList = new ArrayList<>();
        userList.add(chen);
        userList.add(alex);
        String sql = "UPDATE user SET username = :username,sex = :sex,password=:password,address=:address WHERE id = :id;";
        SqlParameterSource[] batch = SqlParameterSourceUtils.createBatch(userList.toArray());
        int[] updateCounts = namedParameterJdbcTemplate.batchUpdate(sql, batch);
    }

批量删除

同上

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/107312.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 经典sql实例大全

    经典sql实例大全经典sql实例大全

    2022年4月24日
    62
  • c语言位运算取反_c语言取反程序

    c语言位运算取反_c语言取反程序先说结论假设x为signedint,也就是说它的补码表示中第一位表示符号(1:负;0:正),那么~x=-(x+1)证明计算机内部使用补码表示,则问题相当于求证:当x为signedint时,(~x)补=[-(x+1)]补(0)证明:因为补码有个规律:(x+y)补=(x)补+(y)补,所以:[-(x+1)]补=[(-x)+(-1)]补=(-x)补+(-1)补要证(~x)补=[-(x+1)…

    2022年8月14日
    4
  • Spring JDBC StoredProcedure类示例

    Spring JDBC StoredProcedure类示例org.springframework.jdbc.core.StoredProcedure类是RDBMS存储过程的对象抽象的超类。这个类是抽象的,目的是让子类将提供一个用于调用的类型化方法,该方法委托给所提供的execute(java.lang.Object…)方法。继承的sql属性是RDBMS中存储过程的名称。使用到的Student表的结构如下-CREATETAB…

    2022年7月26日
    2
  • 阿里云ddns过程记录

    阿里云ddns过程记录申请了阿里云一年的动态域名,收费的,闲置了几个月,用openwrt一直没成功,最近研究asterisk部署,有个公网的ddns还是方便不少,所以把闲置的域名得拾起来了,过程如下1.开启阿里云后台权限(在访问控制菜单中,文章最后有链接)AliyunDNSReadOnlyAccessAliyunDNSFullAccess2.下载脚本运行GitHub-risfeng/aliyun-ddns-shell:阿里云域名解析动态更新IPShell脚本阿里云域名解析动态更新IPSh

    2022年6月6日
    30
  • java 23中设计模式认识及自我理解

    java 23中设计模式认识及自我理解java 23中设计模式认识及自我理解

    2022年4月24日
    43
  • C# 数组截取

    C# 数组截取这段时间常常需要对数据的数据进行截取,以方便解析。原来一直用的Array.ConstrainedCopy();以及 Array.Copy();来进行数组复制截取 先看Array.ConstrainedCopy():其说明如下 publicstaticvoidConstrainedCopy(ArraysourceArray,intsourceIndex,Arraydes…

    2022年6月8日
    153

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号