zoukankan      html  css  js  c++  java
  • Spring整合JDBC temple

    一、Spring对Jdbc的支持

      Spring为了提供对Jdbc的支持,在Jdbc API的基础上封装了一套实现,以此建立一个 JDBC 存取框架。

      作为 Spring JDBC 框架的核心, JDBC 模板的设计目的是为不同类型的 JDBC 操作提供模板方法. 每个模板方法都能控制整个过程, 并允许覆盖过程中的特定任务. 通过这种方式, 可以在尽可能保留灵活性的情况下, 将数据库存取的工作量降到最低.

    二、传统的Jdbc实现

      如下为传统的Jdbc实现,该实现有两个明显的缺点就是(1)需要自己管理连接 (2)Jdbc操作重复代码封装与编写

    public void save() {
            try {
                String sql = "insert into aa(id,name) values(3,'happy');";
                Connection con = null;
                Statement stmt = null;
                Class.forName("com.mysql.jdbc.Driver");
                // 连接对象
                con = DriverManager.getConnection("jdbc:mysql://localhost:3306/kk", "root", "123456");
                // 执行命令对象
                stmt =  con.createStatement();
                // 执行
                stmt.execute(sql);            
                // 关闭
                stmt.close();
                con.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    

    三、Spring+Jdbc实现

      相比于传统的Jdbc实现,在Jdbc API的基础上封装了一套实现JdbcTemplate,JdbcTemplate的优点如下:

      (1)配置基于模板设置

      (2)完成了资源的创建和释放的工作

      (3)完成了对JDBC的核心流程的工作,包括SQL语句的创建和执行,简化了对JDBC的操作

      (4)仅需要传递DataSource就可以把它实例化

      (5)JdbcTemplate只需要创建一次,减少了代码复用的烦恼

      (6)JdbcTemplate是线程安全类

      步骤1.配置Spring+JDBC配置文件

    db.properties

    #mysql jdbc
    jdbc.driver=com.mysql.jdbc.Driver
    jdbc.url=jdbc:mysql://localhost:3306/db1?useUnicode=true&characterEncoding=UTF-8
    jdbc.uid=root
    jdbc.pwd=root
    

    applictionContext.xml

    	<!--1 引入属性文件,在配置中占位使用 -->
    	<context:property-placeholder location="classpath:spring/db.properties" />
    	<!--2 配置C3P0数据源 -->
    	<bean id="datasource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
    		<!--驱动类名 -->
    		<property name="driverClass" value="${jdbc.driver}" />
    		<!-- url -->
    		<property name="jdbcUrl" value="${jdbc.url}" />
    		<!-- 用户名 -->
    		<property name="user" value="${jdbc.uid}" />
    		<!-- 密码 -->
    		<property name="password" value="${jdbc.pwd}" />
    		<!-- 当连接池中的连接耗尽的时候c3p0一次同时获取的连接数  -->
    		<property name="acquireIncrement" value="5"></property>
    		<!-- 初始连接池大小 -->
    		<property name="initialPoolSize" value="10"></property>
    		<!-- 连接池中连接最小个数 -->
    		<property name="minPoolSize" value="5"></property>
    		<!-- 连接池中连接最大个数 -->
    		<property name="maxPoolSize" value="20"></property>
    	</bean>
    
    	<!--整合普通的JDBC查询    start-->
    	<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    		<property name="dataSource" ref="datasource" />
    	</bean>
    	<bean id="userDao" class="com.zhangguo.JDBC.UserJDBCTemplateDAO">
    		<property name="jdbcTemplate" ref="jdbcTemplate" />
    	</bean>
    	<!--整合普通的JDBC查询   end -->
    

    四、相关类

    User.java

    package com.zhangguo.JDBC;
    
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import org.springframework.jdbc.core.RowMapper;
    
    public class UserMapper implements RowMapper<User> {
    
        @Override
        public User mapRow(ResultSet rs, int rownum) throws SQLException {
            User user = new User();
            user.setId(rs.getInt("id"));
            user.setUsername(rs.getString("username"));
            user.setPassword(rs.getString("password"));
            return user;
        }
    
    }
    

    UserJDBCTemplateDAO.java

    package com.zhangguo.JDBC;
    import java.util.List;
    
    import org.springframework.jdbc.core.BeanPropertyRowMapper;
    import org.springframework.jdbc.core.JdbcTemplate;
    import org.springframework.jdbc.core.RowMapper;
    
    public class UserJDBCTemplateDAO {
    
        private JdbcTemplate jdbcTemplate;//利用applicationContext.xml让它初始化,不用每个类都出现jdbcTemplate= new JdbcTemplate(xx)这些玩意!
    
        /*查询整张表的数据*/
        public List<User> findAllUser() {
            String sql = "select * from user";
            RowMapper<User> rowMapper = new BeanPropertyRowMapper<User>(User.class);
            return this.jdbcTemplate.query(sql, rowMapper);
        }
    
        /*修改password字段*/
        public void updatePassword(int id,String password){
            String sql = "update user set password='"+password+"' where id="+id;
            jdbcTemplate.execute(sql);
        }
    
        /*JdbcTemplate jdbcTemplate的getter setter必须有,不然spring读不到这个变量。由于不太重要,习惯性放在最后*/
        public JdbcTemplate getJdbcTemplate() {
            return jdbcTemplate;
        }
    
        public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
            this.jdbcTemplate = jdbcTemplate;
        }
    
    }
    

    UserMapper.java

    package com.zhangguo.JDBC;
    
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import org.springframework.jdbc.core.RowMapper;
    
    public class UserMapper implements RowMapper<User> {
    
        @Override
        public User mapRow(ResultSet rs, int rownum) throws SQLException {
            User user = new User();
            user.setId(rs.getInt("id"));
            user.setUsername(rs.getString("username"));
            user.setPassword(rs.getString("password"));
            return user;
        }
    
    }
    

    测试类

    JDBCUserTest

    package com.zhangguo.user;
    import com.zhangguo.JDBC.UserJDBCTemplateDAO;
    import com.zhangguo.JDBC.User;
    
    import java.util.*;//打印数据库表的时候,用到容器List、ArrayList不得不应用
    
    /*用于初始化Spring*/
    import org.junit.Test;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    import org.springframework.context.ConfigurableApplicationContext;//用于关闭Spring
    
    public class JDBCUserTest {
    
        @Test
        public void testUser() {
            ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath*:spring/applicationContext.xml");// 初始化spring
            UserJDBCTemplateDAO userDao = (UserJDBCTemplateDAO) applicationContext.getBean("userDao");// 初始化userDao这个数据库接口类
    
            // userDao.updatePassword(1, "cc");这样就能修改id=1的password字段,让其变成cc,这里不作展示
    
            /* 查询整张表的内容将其打印出来 */
            List<User> user_list = new ArrayList<User>();
            user_list = userDao.findAllUser();
            for (User user : user_list) {// jdk1.5+的foreach打印,省事,不用写这么多代码了
                System.out.println(user.getId() + "	" + user.getUsername() + "	"
                        + user.getPassword());
            }
    
            ((ConfigurableApplicationContext) applicationContext).close();// 关闭Spring避免警告
        }
    
    }
    

    程序目录结构

    Spring JDBC可以Mybaits共存的,集成了mybaits,同时也可以集成JDBCTemplate

  • 相关阅读:
    JS对象—字符串总结(创建、属性、方法)
    vue过滤器(filter)
    mac快捷键大全
    mac版 sublime快捷键大全
    mysql数据库—表的查询排序操作大全
    emmet的html和css使用技巧大全
    Java多线程——ReentrantLock源码阅读
    你真的懂ThreadPoolExecutor线程池技术吗?看了源码你会有全新的认识
    Java多线程——AQS框架源码阅读
    Java多线程——ReentrantReadWriteLock源码阅读
  • 原文地址:https://www.cnblogs.com/chance0x1/p/12956985.html
Copyright © 2011-2022 走看看