• 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
  • 相关阅读:
    设计模式的原则
    List是线程安全的吗?如果不是该怎么办呢?安全的List对性能的影响有多大呢?
    StringBuilder是不是线程安全的?
    并行运算和普通运算之性能比较
    分布式与集群的区别
    sql查询性能分析
    C#代码实现,确保windows程序只有一个实例(instance)
    jQuery UI
    开源框架完美组合之Spring.NET + NHibernate + ASP.NET MVC + jQuery + easyUI 中英文双语言小型企业网站Demo
    整理的一些学习网站资料
  • 原文地址:https://www.cnblogs.com/lemonzhang/p/12912123.html
Copyright © 2020-2023  润新知