zoukankan      html  css  js  c++  java
  • JdbcTemplate

    JdbcTemplate
    1、 概述
     为了使JDBC更加易于使用,Spring在JDBC API上定义了一个抽象层,以此建立一个JDBC存取框架。
     作为Spring JDBC框架的核心,JDBC模板的设计目的是为不同类型的JDBC操作提供模板方法,通过这种方式,可以在尽可能保留灵活性的情况下,将数据库存取的工作量降到最低。
     可以将Spring的JdbcTemplate看作是一个小型的轻量级持久化层框架,和我们之前使用过的DBUtils风格非常接近。

    2、环境准备:导入JAR包
      1) IOC容器所需要的JAR包
        commons-logging-1.1.1.jar
        spring-beans-4.0.0.RELEASE.jar
        spring-context-4.0.0.RELEASE.jar
        spring-core-4.0.0.RELEASE.jar
        spring-expression-4.0.0.RELEASE.jar
      2) JdbcTemplate所需要的JAR包
        spring-jdbc-4.0.0.RELEASE.jar
        spring-orm-4.0.0.RELEASE.jar
        spring-tx-4.0.0.RELEASE.jar
      3) 数据库驱动和数据源
        druid-1.1.9.jar
        mysql-connector-java-5.1.7-bin.jar

    3、创建连接数据库基本信息属性文件

    jdbc.driver=com.mysql.jdbc.Driver
    jdbc.url=jdbc:mysql://localhost:3306/ssm
    jdbc.username=root
    jdbc.password=123456

    4、在Spring配置文件中配置相关的bean

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:context="http://www.springframework.org/schema/context"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
    
        <!-- 引入属性文件 -->
        <!-- <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
            <property name="location" value="db.properties"></property>
        </bean> -->
        
        <!-- 引入属性文件 -->
        <context:property-placeholder location="db.properties"/>
    
        <!-- 创建数据源 -->
        <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
            <property name="driverClassName" value="${jdbc.driver}"></property>
            <property name="url" value="${jdbc.url}"></property>
            <property name="username" value="${jdbc.username}"></property>
            <property name="password" value="${jdbc.password}"></property>
        </bean>
    
        <!-- 通过数据源配置JdbcTemplate -->
        <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
            <property name="dataSource" ref="dataSource"></property>
        </bean>
    
    </beans>

    5、持久化操作
    1) 增删改
      JdbcTemplate.update(String, Object...)
    2) 批量增删改
      JdbcTemplate.batchUpdate(String, List<Object[]>)
        Object[]封装了SQL语句每一次执行时所需要的参数
        List集合封装了SQL语句多次执行时的所有参数
    3) 查询单行
      JdbcTemplate.queryForObject(String, RowMapper<Department>, Object...)

    4) 查询多行

      JdbcTemplate.query(String, RowMapper<Department>, Object...)
      RowMapper对象依然可以使用BeanPropertyRowMapper
    5) 查询单一值
      JdbcTemplate.queryForObject(String, Class, Object...)

    package com.atguigu.jdbctempalte;
    
    import static org.junit.Assert.*;
    
    import java.util.ArrayList;
    import java.util.List;
    
    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 TestJdbcTemplate {
    
        ApplicationContext ac = new ClassPathXmlApplicationContext("jdbc.xml");
        JdbcTemplate jdbcTemplate = ac.getBean("jdbcTemplate", JdbcTemplate.class);
    
        @Test
        public void testUpdate() {
            //jdbcTemplate.update("insert into emp values(null,'张三',23,'男')");
            /*String sql = "insert into emp values(null, ?, ?, ?)";
            jdbcTemplate.update(sql, "李四", 24, "女");//单个增删改*/    
            
            String eids = "3,4,5";
            String sql = "delete from emp where eid in ("+eids+")";
            jdbcTemplate.update(sql);
            
            String mohu = "a";
            String sqls = "select * from emp where ename like '%?%'";//错误的方式,不能加单引号'',因该是 like %?%;
            String sqlss = "select * from emp where ename like concat('%', ? ,'%')";//可以使用
            // 不能使用通配符?的情况
    //where id in (?)   ->使用字符串拼接,原因:?会加上单引号'', 而 in('1,2,3'),的效果仅仅是查询第一个1.
            //② 模糊查询 like '?'   ->采用concat()函数拼接
            
        }
        
        @Test
        public void testBatchUpdate() {
            String sql = "insert into emp values(null, ?, ?, ?)";
            List<Object[]> list = new ArrayList<>();
            list.add(new Object[] {"a1", 1, "男"});
            list.add(new Object[] {"a2", 2, "男"});
            list.add(new Object[] {"a3", 3, "男"});
            jdbcTemplate.batchUpdate(sql, list);//批量增删改
        }
    
        @Test
        public void testQueryForObject() {
            //jdbcTemplate.queryForObject(sql, requiredType)用来获取单个的值
            //jdbcTemplate.queryForObject(sql, rowMapper)用来获取单条数据
            /*String sql = "select eid,ename,age,sex from emp where eid = ?";
            RowMapper<Emp> rowMapper = new BeanPropertyRowMapper<>(Emp.class);//将列名(字段名或字段名的别名)与属性名进行映射
            Emp emp = jdbcTemplate.queryForObject(sql, new Object[] {7}, rowMapper);
            System.out.println(emp);*/
            
            String sql = "select count(*) from emp";
            Integer count = jdbcTemplate.queryForObject(sql, Integer.class);
            System.out.println(count);
        }
        
        @Test
        public void testQuery() {
            String sql = "select eid,ename,age,sex from emp";
            RowMapper<Emp> rowMapper = new BeanPropertyRowMapper<>(Emp.class);
            List<Emp> list = jdbcTemplate.query(sql, rowMapper);
            for (Emp emp : list) {
                System.out.println(emp);
            }
        }
    }
    package com.atguigu.jdbctempalte;
    
    public class Emp {
    
        private Integer eid;
        
        private String ename;
        
        private Integer age;
        
        private String sex;
    
        public Integer getEid() {
            return eid;
        }
    
        public void setEid(Integer eid) {
            this.eid = eid;
        }
    
        public String getEname() {
            return ename;
        }
    
        public void setEname(String ename) {
            this.ename = ename;
        }
    
        public Integer getAge() {
            return age;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    
        public String getSex() {
            return sex;
        }
    
        public void setSex(String sex) {
            this.sex = sex;
        }
    
        @Override
        public String toString() {
            return "Emp [eid=" + eid + ", ename=" + ename + ", age=" + age + ", sex=" + sex + "]";
        }
        
    }
    Emp
  • 相关阅读:
    CodeForces Gym 100500A A. Poetry Challenge DFS
    CDOJ 486 Good Morning 傻逼题
    CDOJ 483 Data Structure Problem DFS
    CDOJ 482 Charitable Exchange bfs
    CDOJ 481 Apparent Magnitude 水题
    Codeforces Gym 100637G G. #TheDress 暴力
    Gym 100637F F. The Pool for Lucky Ones 暴力
    Codeforces Gym 100637B B. Lunch 找规律
    Codeforces Gym 100637A A. Nano alarm-clocks 前缀和
    TC SRM 663 div2 B AABB 逆推
  • 原文地址:https://www.cnblogs.com/lemonzhang/p/12912123.html
Copyright © 2011-2022 走看看