zoukankan      html  css  js  c++  java
  • Spring学习记录(十四)---JDBC基本操作

    先看一些定义:

    在Spring JDBC模块中,所有的类可以被分到四个单独的包:
    1、core
    即核心包,它包含了JDBC的核心功能。此包内有很多重要的类,包括:JdbcTemplate类、SimpleJdbcInsert类,SimpleJdbcCall类,以及NamedParameterJdbcTemplate类。
    2、datasource
    即数据源包,访问数据源的实用工具类。它有多种数据源的实现,可以在JavaEE容器外部测试JDBC代码。
    3、object
    即对象包,以面向对象的方式访问数据库。它允许执行查询并返回结果作为业务对象。它可以在数据表的列和业务对象的属性之间映射查询结果。
    4、support
    即支持包,是core包和object包的支持类。例如提供了异常转换功能的SQLException类。

    Spring中的JDBC帮我们做很多事情,如定义数据库连接参数,打开数据库连接,处理异常,关闭数据库连接。

    我们只需要关心SQL语句,也就是增删改查。就行

    连接数据库,一般都用xml配置

     1     <!-- 导入资源文件 -->
     2     <context:property-placeholder location="class:db.properties"/>
     3 
     4     <!-- 配置c3p0数据源 -->
     5     <bean id="dataSource" class="com.mchange.v2.c3p0ComboPooledDataSource">
     6     <property name="user" value="${jdbc.user}"></property>
     7     <property name="password" value="${jdbc.password}"></property>
     8     <property name="driverClass" value="${jdbc.driverClass}"></property>
     9     <property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
    10     <property name="initPoolSize" value="${jdbc:initPoolSize}"></property>
    11     <property name="maxPoolSize" value="${jdbc:maxPoolSize}"></property>
    12     </bean>

    资源文件:

    1   jdbc:user=root
    2   jdbc:password=1230
    3   jdbc:driverClass=com.mysql.jdbc.Driver
    4   jdbc:jdbcUrl=jdbc:mysql:///spring4
    5 
    6   jdbc:initPoolSize=5
    7   jdbc:maxPoolSize=10

    main函数

    1     public void main() {
    2         ApplicationContext ctx=new ClassPathXmlApplicationContext("jdbc.xml");
    3         DataSource dataource = ctx.getBean(DataSource.class);
    4         System.out.println(dataource.getConnection());
    5     }

    这样就能连接上数据库了。

    处理SQL语句的是core包中的类,也要在xml中配置,这里说一下,最多是使用 jdbcTemplate 

    1、JdbcTemplate 

    1     <!-- 配置Spring的JdbcTemplate,数据源作它的属性-->
    2     <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    3         <property name="dataSource" ref="dataSource"></property>
    4     </bean>
    5     <!-- 配置NamedParameterJdbcTemplate,可以为参数命名。其没有无参构造函数,所以要指定参数 -->
    6     <bean id="namedParameterJdbcTemplate" class="org.springframework.jdbc.core.nameparam.NamedParameterJdbcTemplate">
    7         <constructor-arg ref="dataSource"></constructor-arg>
    8     </bean>

     获取jdbcTemplate和NamedParameterJdbcTemplate对象

    1 JdbcTemplate jdbcTemplate=(JdbcTemplate) ctx.getBean("jdbcTemplate");
    2 NamedParameterJdbcTemplate namedParameterJdbcTemplate=(NamedParameterJdbcTemplate) ctx.getBean("namedParameterJdbcTemplate");
        //更新一条记录
        @Test
        public void testUpdate(){
            String sql="UPDATE employees SET last_name = ? WHERE id = ?";
            jdbcTemplate.update(sql,"jack",5);
        }
        /*
         * 获取单个列的总数
         */
        @Test
        public void testQueryForObject2(){
            String sql="SELECT count(id) FROM employees";
            long count=jdbcTemplate.queryForObject(sql,Long.class);
            System.out.println(count);
        }

     如何获取一条数据?应该要把它取出放在一个对象里面吧。

     为了能取出数据,必须创建一个对象专门用来存放,

     1   //用来存放数据的类,一条数据就是一个对象
     2 public class Employee {
     3     private int id;
     4     private String lastName;
     5     private String email;
     6     private Template template;
     7     public int getId() {
     8         return id;
     9     }
    10     public void setId(int id) {
    11         this.id = id;
    12     }
    13     public String getLastName() {
    14         return lastName;
    15     }
    16     public void setLastName(String lastName) {
    17         this.lastName = lastName;
    18     }
    19     public String getEmail() {
    20         return email;
    21     }
    22     public void setEmail(String email) {
    23         this.email = email;
    24     }
     1     /*从数据库获取一条记录,实际得到对应一个对象
     2      * 注意不是调用queryForObject(String sql, Class<Employee> requiredType,..)
     3      * 而是调用queryForObject(String sql, RowMapper<Employee> rowMapper)
     4      * 1.其中的RowMapper指定如何去映射结果集的行,常用的实现类为BeanPropertyRowMapper
     5      * 2.使用sql中列的别名完成列名和类的属性名的映射,last_name lastName
     6      * 3.不支持级联映射,Employee类一个属性是一个对象,那这个对象不能被级联映射获取
     7      */
     8     @Test
     9     public void testQueryForObject(){
    10         String sql="SELECT id,last_name lastName,email FROM employees WHERE id = ?";
    11         RowMapper<Employee> rowMapper=new BeanPropertyRowMapper<>(Employee.class);//完成一条数据和一个对象属性的映射
    12         Employee employee=jdbcTemplate.queryForObject(sql, rowMapper,1); //1是参数,就是id的参数
    13     }

    获取id大于5的所有数据

    1     /*
    2      * 查到实体类的集合
    3      */
    4     public void testQueryForList(){
    5         String sql="SELECT id,last_name lastName,email FROM employees WHERE id > ?";
    6         RowMapper<Employee> rowMapper=new BeanPropertyRowMapper<>(Employee.class);
    7         List<Employee> employee=jdbcTemplate.query(sql, rowMapper,5);
    8         System.out.println(employee);
    9     }
     1     //批量处理
     2     //最后一个参数是Object[]的List类型,因为修改一条记录需要一个Object的数组,那么多条就需要多个Object的数组
     3     @Test
     4     public void testBatchUpdate(){
     5         String sql="INSERT INTO employees(last_name,email,dept_id) VALUES(?,?,?)";
     6         //使用数组集合
     7         List<Object[]> batchArgs=new ArrayList<>();
     8         batchArgs.add(new Object[]{"AA","aa@atguigu.com",1});//一条数据就是一个对象数组
     9         batchArgs.add(new Object[]{"BB","bb@atguigu.com",2});
    10         batchArgs.add(new Object[]{"CC","cc@atguigu.com",3});
    11         batchArgs.add(new Object[]{"DD","dd@atguigu.com",3});
    12         batchArgs.add(new Object[]{"EE","ee@atguigu.com",2});
    13         jdbcTemplate.update(sql,batchArgs);
    14     }

    2、NamedParameterJdbcTemplate--具名参数 ,可以给参数命名,不用像上面一样都是问号 "?"作参数。参数多了的话,更便于维护

     1     /*
     2      * 参数名要对应一个值,就要使用键值对。用HashMap
     3      */
     4     @Test
     5     public void testNamedParameterJdbcTemplate(){
     6         String sql="INSERT INTO employees(lase_name,email,dept_id) VALUES(:lastName,:email,:deptId)";
     7         Map<String,Object> paramMap=new HashMap<>();
     8         paramMap.put("lastName", "FF");
     9         paramMap.put("email", "FF@aa.com");
    10         paramMap.put("deptId", 2);
    11         namedParameterJdbcTemplate.update(sql, paramMap);
    12     }

    再看这个,也可以用对象存入。

     1     /*
     2      * 可以对参数命名,用对象传入
     3      */
     4     @Test
     5     public void testNamedParameterJdbcTemplate2(){
     6         String sql="INSERT INTO employees(lase_name,email,dept_id) VALUES(:lastName,:email,:deptId)";
     7         Employee employee=new Employee();
     8         employee.setLastName("SYZ");
     9         employee.setEmail("ee@e.com");
    10         employee.setId(3);
    11         SqlParameterSource paramSource=new BeanPropertySqlParameterSource(employee);//完成一条数据和一个对象属性的映射
    12         namedParameterJdbcTemplate.update(sql, paramSource);
    13     }
  • 相关阅读:
    bzoj1066: [SCOI2007]蜥蜴(最大流)
    bzoj4551: [Tjoi2016&Heoi2016]树(树链剖分)
    bzoj2663: [Beijing wc2012]灵魂宝石(二分+匈牙利)
    bzoj2150: 部落战争(匈牙利)
    bzoj1797: [Ahoi2009]Mincut 最小割(最小割+强联通tarjan)
    bzoj3993: [SDOI2015]星际战争(网络流)
    bzoj3504: [Cqoi2014]危桥(网络流)
    bzoj3212: Pku3468 A Simple Problem with Integers(线段树)
    bzoj4590: [Shoi2015]自动刷题机(二分答案)
    [WC2013]糖果公园
  • 原文地址:https://www.cnblogs.com/ooooevan/p/5825392.html
Copyright © 2011-2022 走看看