• Spring对 JDBC 的支持,JdbcTemplate类的使用


    导包:spring框架的包 和 连接数据库连接池的c3p0包 连接mysql数据库的包;

    在src目录下建立jdbc.properties文件:存放连接数据库的属性值

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

    在src目录下建立spring bean configuration file的xml文件:applicationContext.xml

        <!-- 基于注解的,导入标识的包,可以识别本包,或其自包,其只对带有指定注解的类,方法有效,不是对这个包中的所有类和方法有效 -->
        <context:component-scan base-package="com.atguigu.spring.jdbc"></context:component-scan>
        
        <!-- 导入资源文件 ,classpath.jdbc.properties 为类路径下的文件名为 jdbc.properties-->
        <context:property-placeholder location="classpath:jdbc.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>
        
        <!-- 配置spring的JdbcTemplate -->
        <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
            <property name="dataSource" ref="dataSource"></property>
        </bean>

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

    建立test类中可能用到的Employee,Department类,这里,只有属性,set,get,tostring等方法就。。。

    Employee类的属性:

    private Integer id;
    private String lastName;
    private String email;
    private Department department;

    Department类的属性:

    private Integer id;
    private String name;

    建立类:EmployeeDao,基于注解的查询方法

    package com.atguigu.spring.jdbc;
    
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.jdbc.core.BeanPropertyRowMapper;
    import org.springframework.jdbc.core.JdbcTemplate;
    import org.springframework.jdbc.core.RowMapper;
    import org.springframework.stereotype.Component;
    
    @Component//基本注解
    public class EmployeeDao {
        
        @Autowired
        public JdbcTemplate jdbcTemplate;
        
        public Employee get(Integer id){
            String sql="select id,last_name,email from tables where id=?";
            RowMapper<Employee> rowMapper=new BeanPropertyRowMapper<>(Employee.class);
            Employee employee=jdbcTemplate.queryForObject(sql, rowMapper, id);
            return employee;
        }
    }    

    建立一个JUtil Test测试类:JDBCTest

    package com.atguigu.spring.jdbc;
    
    import static org.junit.Assert.*;
    
    import java.util.List;
    import java.sql.SQLException;
    import java.util.ArrayList;
    
    import javax.sql.DataSource;
    
    import org.junit.Test;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    import org.springframework.jdbc.core.BeanPropertyRowMapper;
    //测试类
    import org.springframework.jdbc.core.JdbcTemplate;
    import org.springframework.jdbc.core.RowMapper;
    public class JDBCTest {
        
        private ApplicationContext ctx=null;
        private JdbcTemplate jdbcTemplate;
        private EmployeeDao employeeDao;
        private NamedParameterJdbcTemplate namedParameterJdbcTemplate;
        {
            ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
            jdbcTemplate=(JdbcTemplate) ctx.getBean("jdbcTemplate");
            employeeDao=ctx.getBean(EmployeeDao.class);
         namedParameterJdbcTemplate=ctx.getBean(NamedParameterJdbcTemplate.class); }
      

      @Test
      /**
       * 使用具名参数时, 可以使用 update(String sql, SqlParameterSource paramSource) 方法进行更新操作
      * 1. SQL 语句中的参数名和类的属性一致!即上边employee中属性一致
      * 2. 使用 SqlParameterSource 的 BeanPropertySqlParameterSource 实现类作为参数.
      */
      public void testNamedParameterJdbcTemplate2(){
        String sql="insert into tables(last_name,email,dept_id) values(:lastName,:email,:deptId)";
        Employee employee=new Employee();
        employee.setLastName("panpan");
        employee.setEmail("@panpan");
        employee.setDeptId(4);

        SqlParameterSource paramSource=new BeanPropertySqlParameterSource(employee);
        namedParameterJdbcTemplate.update(sql, paramSource);
      }

      
      

       //可以为参数起名字
       //好处: 若有多个参数, 则不用再去对应位置, 直接对应参数名, 便于维护
      //缺点: 较为麻烦.
      public void testNamedParameterJdbcTemplate(){
        String sql="insert into tables(last_name,email,dept_id) values(:la,:em,:de)";

        Map<String, Object> paramMap=new HashMap<String, Object>();

        paramMap.put("la", "fsd");
        paramMap.put("em", "@ji");
        paramMap.put("de", 3);

        namedParameterJdbcTemplate.update(sql, paramMap);
      }


    @Test
    //对基于注解的方法测试 public void testEmployeeDao(){ System.out.println(employeeDao.get(1)); } //获取单个列的值, 或做统计查询 //使用 queryForObject(String sql, Class<Long> requiredType) public void testQueryForObject2(){ String sql="select count(id) from tables"; long count=jdbcTemplate.queryForObject(sql, Long.class); System.out.println(count); } //查到实体类的集合 //注意调用的不是 queryForList 方法 public void testQueryForList(){ String sql="select id,last_name,email from tables where id>?"; RowMapper<Employee> rowMapper=new BeanPropertyRowMapper<>(Employee.class); List<Employee> employees=jdbcTemplate.query(sql, rowMapper, 1); System.out.println(employees); } /** * 从数据库中获取一条记录, 实际得到对应的一个对象 * 注意不是调用 queryForObject(String sql, Class<Employee> requiredType, Object... args) 方法! * 而需要调用 queryForObject(String sql, RowMapper<Employee> rowMapper, Object... args) * 1. 其中的 RowMapper 指定如何去映射结果集的行, 常用的实现类为 BeanPropertyRowMapper * 2. 使用 SQL 中列的别名完成列名和类的属性名的映射. 例如 last_name lastName * 3. 不支持级联属性. JdbcTemplate 到底是一个 JDBC 的小工具, 而不是 ORM 框架 */ public void testQueryForObject(){ String sql="select id,last_name lastName,email,dept_id as "department.id" from tables where id=?"; RowMapper<Employee> rowMapper=new BeanPropertyRowMapper<>(Employee.class); Employee employee=jdbcTemplate.queryForObject(sql, rowMapper,1); System.out.println(employee); } //执行批量更新: 批量的 INSERT, UPDATE, DELETE //最后一个参数是 Object[] 的 List 类型: 因为修改一条记录需要一个 Object 的数组, //那么多条不就需要多个 Object 的数组 public void testBatchUpdate(){ String sql="insert into tables(last_name,email,dept_id) values(?,?,?)"; List<Object[]> batchArgs=new ArrayList<>(); batchArgs.add(new Object[]{"AAA","testa",5}); batchArgs.add(new Object[]{"BBB","JIJK",6}); batchArgs.add(new Object[]{"CCC","panpN",3}); batchArgs.add(new Object[]{"DDD","jfids",2}); batchArgs.add(new Object[]{"EEE","tfsd",4}); jdbcTemplate.batchUpdate(sql,batchArgs); } //执行 INSERT, UPDATE, DELETE,只修改sql语句,即可 public void testUpdate(){ String sql="update tables set last_name=? where id=?"; jdbcTemplate.update(sql, "权", "1"); } //测试数据库连接池是否连接成功 public void testDataSource() throws SQLException { DataSource dataSource=ctx.getBean(DataSource.class); System.out.println(dataSource.getConnection()); } }

     

  • 相关阅读:
    tomcat集群安装
    jdk
    docker容器间互联
    part1-vulkan开发环境搭建
    宝塔面板mysql表误操作导致原数据表被删恢复过程(附php代码正则插入id)
    php Redis定时执行或延迟(异步)
    Tp5 微信公众号 获取用户信息 EasyWeChat使用
    Fastadmin Area模型返回没值 没对象georadius 源码里面没有$redis->geoadd 解决办法
    [CF Contest] 1059 A~C
    [多校练习] 成都七中数据结构 Challenge 系列解题报告
  • 原文地址:https://www.cnblogs.com/lxnlxn/p/5870532.html
Copyright © 2020-2023  润新知