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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 分享社群规划全流程sop(基础搭建、日常维…

    分享社群规划全流程sop(基础搭建、日常维…无套路,纯分享!全套社群运营文档,可学习套用相信不少做社群运营的朋友一定会出现过这种情况,微信社群或者QQ社群内的群成员不活跃,整天群里犹如一潭死水,此外还有运营目标不明确、成员不愿积极发言、大部分人入群从不说话等等问题。作为运营狗一定要学会社群规划,今天就给大家带来一份【社群规划全流程sop】,主要包含基础搭建、日常维护、增留转、互动案例等四个步骤,每个步骤都有详细的规划讲解,以及相关案例,非常值得参考学习使用。社群规划全流程sop社群规划全流程sop社…

    2022年5月9日
    69
  • 微生物组-宏基因组分析第9期(报名直播课免费参加线下2020.10本年最后一期)

    微生物组-宏基因组分析第9期(报名直播课免费参加线下2020.10本年最后一期)福利公告:为了响应学员的学习需求,经过易生信培训团队的讨论筹备,现决定安排扩增子16S分析、宏基因组、Python课程和转录组的线上直播课。报名参加线上直播课的老师可在1年内选择参加同课…

    2022年5月29日
    33
  • Python:暴力激活成功教程密码

    Python:暴力激活成功教程密码简介:暴力激活成功教程密码的方式一般是枚举法进行破译尝试,通过一次次不同的输入尝试从而得出最终的密码,所以密码的长度和复杂性就尤为重要。本文仅以范例,警示大家在创建密码的时候,应当尽量选择组合复杂度高的,有一定长度的密码,而不是123456之类的简单密码。激活成功教程的思路:1、获取目标密码长度,一般为4,6,12,15,18位长度。2、获取目标密码组成的范围,一般为数字,小写字母,大写字母,特殊符号3、组装密码,通过itertools模块组装。Python:常见排列组合问题处理4、枚举破译。例如生活中最常见的

    2022年8月22日
    6
  • 数据挖掘十大算法之CART详解

    数据挖掘十大算法之CART详解在2006年12月召开的IEEE数据挖掘国际会议上,与会的各位专家选出了当时的十大数据挖掘算法(top10dataminingalgorithms),本博客的十大数据挖掘算法系列文章已经介绍了其中的六个,本文主要讨论CART,即分类回归树(ClassificationAndRegressionTree),一个具体的例子将帮助大家更好地理解相关内容

    2022年6月6日
    49
  • C# SplitContainer 控件详细用法

    C# SplitContainer 控件详细用法1.可以将Windows窗体SplitContainer控件看作是一个复合体,它是由一个可移动的拆分条分隔的两个面板。当鼠标指针悬停在该拆分条上时,指针将相应地改变形状以显示该拆分条是可移动的。使用SplitContainer控件,可以创建复合的用户界面(通常,在一个面板中的选择决定了在另一个面板中显示哪些对象)。这种排列对于显示和浏览信息非常有用。拥有两个面板使您可以聚合不同区域中的信息,并且用户可以轻松地使用拆分条(也称为“拆分器”)调整面板的大小。另外,还可以嵌套多个SplitC…

    2022年7月18日
    72
  • phpstorm2021最新激活码[在线序列号]

    phpstorm2021最新激活码[在线序列号],https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月20日
    62

发表回复

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

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