• Spring框架学习笔记(9)——Spring对JDBC的支持


    一、使用JdbcTemplate和JdbcDaoSupport

    1、配置并连接数据库

    ①创建项目并添加jar包,要比之前Spring项目多添加两个jar包c3p0-0.9.1.2.jar和mysql-connector-java-5.1.7-bin.jar

    ②创建db.properties添加以下配置

    pp为数据库名initPoolSize和maxPoolSize随意

    jdbc.user=root
    jdbc.password=root
    jdbc.driverClass=com.mysql.jdbc.Driver
    jdbc.jdbcUrl=jdbc:mysql:///pp
    
    jdbc.initPoolSize=5
    jdbc.maxPoolSize=10

    ③创建applicationContext.xml添加配置

    <!-- 导入资源 -->
    <context:property-placeholder location="classpath:db.properties"/>
    
    <!-- 配置C3P0数据源 -->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
       <property name="user" value="${jdbc.user}"></property>
          <property name="password" value="${jdbc.password}"></property>
          <property name="driverClass" value="${jdbc.driverClass}"></property>
          <property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
          
          <property name="initialPoolSize" value="${jdbc.initPoolSize}"></property>
          <property name="maxPoolSize" value="${jdbc.maxPoolSize}"></property>
    </bean>

    ④创建一个单元测试类测试是否能够连接数据库

    public class JDBCtest {
    
        private ApplicationContext ctx = null;
        
        {
            ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
        }
        @Test
        public void testDataSource() throws SQLException {
            DataSource dataSource = ctx.getBean(DataSource.class);
            System.out.println(dataSource.getConnection());
        }
    
    }

    MySql创建数据库

    2、使用JdbcTemplate

    ①applicationContext.xml添加bean

    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"></property>
    </bean>

    ②修改JDBCtest.java添加JbdcTemplate属性和Update方法

    public class JDBCtest {
    
        private ApplicationContext ctx = null;
        
        private JdbcTemplate jdbcTemplate = null;
        
        {
            ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
            jdbcTemplate = (JdbcTemplate) ctx.getBean("jdbcTemplate");
        }
    
        @Test
        public void testUpdate() {
            String sql = "update tbl_user set name = ? where id = ?";
            jdbcTemplate.update(sql, "李四" , 1);
        }
        
        @Test
        public void testDataSource() throws SQLException {
            DataSource dataSource = ctx.getBean(DataSource.class);
            System.out.println(dataSource.getConnection());
        }
    }

    执行成功“张三”修改为“李四”

    update还可以用来新增和删除

    使用jdbcTemplate.update执行insert和delete

    @Test
    public void testUpdate() {
        String sql = "update tbl_user set name = ? where id = ?";
        jdbcTemplate.update(sql, "李四", 1);
        String sql1 = "insert into tbl_user(name , account) values (?,?)";
        jdbcTemplate.update(sql1, new Object[]{"jj",250});
        String sql2 = "delete from tbl_user where id = ?";
        jdbcTemplate.update(sql2, 1);
    }

    ③使用jdbcTemplate.batchUpdate执行批量操作

    @Test
    public void testBatchUpdate() {
        String sql = "insert into tbl_user(name , account) values (?,?)";
        List<Object[]> args = new ArrayList<Object[]>();
        args.add(new Object[] { "jja", 250 });
        args.add(new Object[] { "jjb", 260 });
        args.add(new Object[] { "jjc", 270 });
        args.add(new Object[] { "jjd", 280 });
        args.add(new Object[] { "jje", 290 });
        jdbcTemplate.batchUpdate(sql, args);
    }

    同样的batchUpdate也可以用来执行批量删除和添加

    ④使用jdbcTemplate.queryForObject从数据库获取对象

    首先新建对象User

    public class User {
    
        private int id;
        private String name;
        private double account;
        private Date birthday;
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public double getAccount() {
            return account;
        }
    
        public void setAccount(double account) {
            this.account = account;
        }
    
        public Date getBirthday() {
            return birthday;
        }
    
        public void setBirthday(Date birthday) {
            this.birthday = birthday;
        }
    
        @Override
        public String toString() {
            return "User [id=" + id + ", name=" + name + ", account=" + account + ", birthday=" + birthday + "]";
        }
    
    }

    在JDBCtest.java里添加testQueryForObject方法

    /**
     * <p>Description: 从数据库获取一个对象
     * 不是使用jdbcTemplate.queryForObject(sql, requiredType, args)方法
     * 而是使用jdbcTemplate.queryForObject(sql, args, argTypes, rowMapper)方法
     * </p>
     */
    @Test
    public void testQueryForObject() {
        String sql = "select id, name, account, birthday from tbl_user where id = ?";
        RowMapper<User> rowMapper = new BeanPropertyRowMapper<User>(User.class); 
        User user = jdbcTemplate.queryForObject(sql, rowMapper, 1);
        System.out.println(user.toString());
    }

    ⑤使用jdbcTemplate的局限性

    不支持级联属性,JdbcTemplate到底是一JDBC小工具不是ORM框架

     ⑥查实体类集合

    /**
     * <p>Description: 查实体类集合</p>
     */
    @Test
    public void testQueryForList() {
        String sql = "select id, name, account, birthday from tbl_user where id > ?";
        RowMapper<User> rowMapper = new BeanPropertyRowMapper<User>(User.class); 
        List<User> users = jdbcTemplate.query(sql, rowMapper, 5);
        System.out.println(users.toString());
    }

     二、使用NamedParameterJdbcTemplate

    1、配置NamedParameterJdbcTemplate Bean

    <!-- 该对象可以使用具名参数,该对象没有无参构造器,所以必须传一个参数 -->
    <bean id="namedParameterJdbcTemplate" class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
        <constructor-arg ref="dataSource"></constructor-arg>
    </bean>

    2、在JDBCtest测试类中添加测试方法

    /**
     * <p>Description: 可以为参数起名字增强维护性,较为麻烦</p>
     */
    @Test
    public void testNamedParameterJdbcTemplate() {
        String sql = "insert into tbl_user(name, account) values (:name,:account)";
        Map<String , Object> paramMap = new HashMap<String , Object>();
        paramMap.put("name", "hj");
        paramMap.put("account", "10000000000");
        namedParameterJdbcTemplate.update(sql, paramMap);
    }
    
    /**
     * <p>Description: 可以直接传对象</p>
     */
    @Test
    public void testNamedParameterJdbcTemplate2() {
        String sql = "insert into tbl_user(name, account) values (:name,:account)";
        User user = new User();
        user.setName("kk");
        user.setAccount(666);
        SqlParameterSource paramSource = new BeanPropertySqlParameterSource(user);
        namedParameterJdbcTemplate.update(sql, paramSource);
    }

    数据库中添加数据成功

    在经典的 JDBC 用法中, SQL 参数是用占位符 ? 表示,并且受到位置的限制. 定位参数的问题在于, 一旦参数的顺序发生变化, 就必须改变参数绑定. 
    在 Spring JDBC 框架中, 绑定 SQL 参数的另一种选择是使用具名参数(named parameter). 
    具名参数: SQL 按名称(以冒号开头)而不是按位置进行指定. 具名参数更易于维护, 也提升了可读性. 具名参数由框架类在运行时用占位符取代
    具名参数只在 NamedParameterJdbcTemplate 中得到支持
  • 相关阅读:
    C# WPF定时器
    C#处理JSON数据
    SQL-乐观锁,悲观锁之于并发
    C# 集合-并发处理-锁OR线程
    C# 生成二维码,彩色二维码,带有Logo的二维码及普通条形码
    C# (事件触发)回调函数,完美处理各类疑难杂症!
    C# Lambda表达式
    C# 匿名方法
    浅谈C# 匿名变量
    鸡兔同笼
  • 原文地址:https://www.cnblogs.com/huangjian2/p/6397547.html
Copyright © 2020-2023  润新知