zoukankan      html  css  js  c++  java
  • SpringJDBC数据库的基本使用

     本文整理SpringJDBC的基础使用部分内容,在上版的基础上进行了略微修改。

     云笔记项目数据库部分采用的是Spring-MyBatis,前面学过了JDBC,SpringJDBC,Mybatis和Spring-MyBatis,有必要重新复习一下各个数据库连接的使用方法,理解差异点后再开始项目环境配置,磨刀不误砍柴工。

    Spring JDBC是什么

     是Spring框架对JDBC的封装,简化对JDBC操作

    Spring JDBC编程步骤

     step1 导包 

     spring-webmvc,spring-jdbc,ojdbc,dbcp,junit等。

     在pom.xml中进行如下配置

      1 <dependencies>
      2 <!-- 导入spring-webmvc的jar包 -->
      3 <dependency>
      4 <groupId>org.springframework</groupId>
      5 <artifactId>spring-webmvc</artifactId>
      6 <version>4.2.3.RELEASE</version>
      7 </dependency>
      8 
      9 <dependency>
     10 <groupId>org.springframework</groupId>
     11 <artifactId>spring-webmvc</artifactId>
     12 <version>4.2.3.RELEASE</version>
     13 <classifier>sources</classifier>
     14 </dependency>
     15 
     16 <dependency>
     17 <groupId>org.springframework</groupId>
     18 <artifactId>spring-webmvc</artifactId>
     19 <version>4.2.3.RELEASE</version>
     20 <classifier>javadoc</classifier>
     21 </dependency>
     22 <!-- 导入junit测试包-->
     23 <dependency>
     24 <groupId>junit</groupId>
     25 <artifactId>junit</artifactId>
     26 <version>4.12</version>
     27 </dependency>
     28 
     29 <dependency>
     30 <groupId>junit</groupId>
     31 <artifactId>junit</artifactId>
     32 <version>4.12</version>
     33 <classifier>sources</classifier>
     34 </dependency>
     35 
     36 <dependency>
     37 <groupId>junit</groupId>
     38 <artifactId>junit</artifactId>
     39 <version>4.12</version>
     40 <classifier>javadoc</classifier>
     41 </dependency> 
     42 
     43 <!-- 导入数据库包 -->
     44 <dependency>
     45    <groupId>commons-dbcp</groupId>
     46    <artifactId>commons-dbcp</artifactId>
     47    <version>1.4</version>
     48 </dependency> 
     49 <dependency>
     50  <groupId>com.oracle</groupId>
     51  <artifactId>ojdbc6</artifactId>
     52  <version>11.2.0.1.0</version>
     53 </dependency> 
     54 
     55 <!-- 针对mysql的导包 -->
     56 <dependency>
     57 <groupId>org.wisdom-framework</groupId>
     58 <artifactId>mysql-connector-java</artifactId>
     59 <version>5.1.34_1</version>
     60 </dependency>
     61 
     62  <!-- 针对spring JDBC导包 -->
     63  <dependency>
     64  <groupId>org.springframework</groupId>
     65  <artifactId>spring-jdbc</artifactId>
     66  <version>4.2.3.RELEASE</version>
     67  </dependency>
     68  
     69  <dependency>
     70  <groupId>org.springframework</groupId>
     71  <artifactId>spring-jdbc</artifactId>
     72  <version>4.2.3.RELEASE</version>
     73  <classifier>sources</classifier>
     74  </dependency>
     75  
     76  <dependency>
     77  <groupId>org.springframework</groupId>
     78  <artifactId>spring-jdbc</artifactId>
     79  <version>4.2.3.RELEASE</version>
     80  <classifier>javadoc</classifier>
     81  </dependency> 
     82 </dependencies>  
     83 step2 添加Spring JDBC配置文件,主要有两步:
     84 
     85 1.读取配置文件,初始化连接池:
     86 
     87 类似于以前的工具类DBUtils,先读取properties属性内容,然后初始化连接池BasicDataSource,设置数据库连接驱动,url,用户名和密码等,还可以配置其他参数,如最大连接数maxactive或者等待时间maxwait。
     88 
     89 2.将连接池注入到SpringJDBCTemplate里,初始化SpringJDBCTemplate,后面就可以被使用了
     90 
     91 <bean //此部分内容省略>
     92    <!-- 读取properties属性文件 -->
     93    <util:properties id="db" location="classpath:config.properties">    
     94    </util:properties>
     95    <!-- 配置连接池,可以参考DBUtil的方法,这里采用spring创建连接池-->
     96    <!-- destroy-method方法作用是:当spring容器关闭后,会将连接释放回到连接池,避免资源浪费 -->
     97    <bean id="ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
     98    <property name="driverClassName" value="#{db.driver}"/>
     99    <property name="url" value="#{db.url}" />
    100    <property name="username" value="#{db.user}" />
    101    <property name="password" value="#{db.pwd}" /
    102 </bean>        
    103 
    104 <!-- 配置JDBCTemplate -->
    105 <bean id="jt" class="org.springframework.jdbc.core.JdbcTemplate">
    106    <!-- 说明JdbcTemplate里有dataSource属性,有setDataSource方法,将连接池注入进去 -->
    107    <!-- 查看JdbcTemplate源码发现,连接池是通过构造器方式注入的 -->
    108    <property name="dataSource" ref="ds"></property>
    109 </bean>
    110     
    111  <!-- 配置组件扫描 -->
    112  <context:component-scan base-package="DAO"></context:component-scan>

    可以对比下DBUtil里的方法,也是读取properties属性文件,然后初始化BasicDataSource,然后写出建立连接和关闭连接的静态方法供使用,在SpringJDBC下,会使用依赖注入的方式,帮忙初始化连接池,这是Spring的特点,降低耦合度。

    package Day03;
    
    import java.io.InputStream;
    import java.sql.Connection;
    import java.sql.SQLException;
    import java.util.Properties;
    
    import org.apache.commons.dbcp.BasicDataSource;
    
    import Day01.DBUtilByDBCPInMac;
    
    public class DBUtil {
            //数据库连接池
            private static BasicDataSource ds;
            //为不同线程管理连接
            private static ThreadLocal<Connection> tl;
            //不需要实例,只需要调用静态方法
            static {
                try {
                    //创建properties
                    Properties prop=new Properties();
                    //获取文件输入流
                    InputStream is=DBUtilByDBCPInMac.class.getClassLoader().getResourceAsStream("day01/config.properties");
                    //加载文件输入流
                    prop.load(is);
                    is.close();
                    //读取配置信息    
                    //初始化连接池
                    ds=new BasicDataSource();
                    //设置驱动(Class.forName())
                    ds.setDriverClassName(prop.getProperty("driver"));
                    //设置url
                    ds.setUrl(prop.getProperty("url"));
                    //设置数据库用户名
                    ds.setUsername(prop.getProperty("user"));
                    //设置数据库密码
                    ds.setPassword(prop.getProperty("psw"));
                    //设置初始连接数
                    ds.setInitialSize(Integer.parseInt(prop.getProperty("initsize")));
                    //设置最大连接数
                    ds.setMaxActive(Integer.parseInt(prop.getProperty("maxactive")));
                    //设置等待时间
                    ds.setMaxWait(Integer.parseInt(prop.getProperty("maxwait")));
                    //设置最小空闲数
                    ds.setMinIdle(Integer.parseInt(prop.getProperty("minidle")));
                    //设置最大连接数
                    ds.setMaxIdle(Integer.parseInt(prop.getProperty("maxidle")));
                    
                    //初始化线程本地
                    tl=new ThreadLocal<Connection>();
                    
                    
                }catch(Exception e) {
                    e.printStackTrace();
                }
            }
            /**
             * 使用连接池获取连接
             * @return
             * @throws SQLException
             */
            public static Connection getConnection() throws SQLException {
                Connection conn=ds.getConnection();
                tl.set(conn);
                return conn;
            }
            /**
             * 关闭数据库连接
             */
            public static void closeConnection() {
                try {
                Connection conn=tl.get();
                if(conn!=null) {
                    //恢复连接为自动提交事务
                    conn.setAutoCommit(true);
                    //关闭了连接
                    conn.close();
                    //但是连接池是不关闭连接的,为什么这里可以关闭?
                    //因为这里关闭的只是连接池下连接的一个子类,关闭子类不影响连接池的连接
                    //而是将连接归还
                    tl.remove();
                }
                }catch(Exception e) {
                    e.printStackTrace();
                }
                
            }
            
    }

    step3 配置JDBC Template,生成JDBC模板

    JDBCTemplate把一些重复性的代码,比如获取连接关闭连接异常处理都写好了,只需要调用该对象的方法就可以很方便的访问数据库。

    step4 调用JDBCTemplate的方法来进行数据库操作,通常将JDBCTemplate注入到DAO,采用依赖注入的package DAO

    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.List;
    
    import javax.annotation.Resource;
    
    import org.springframework.dao.EmptyResultDataAccessException;
    import org.springframework.jdbc.core.JdbcTemplate;
    import org.springframework.jdbc.core.RowMapper;
    import org.springframework.stereotype.Repository;
    
    import Entity.Employee;
    
    /**
     * Spring JDBC的使用
     *
     */
    @Repository("employeeDAO")
    public class EmployeeDAO {
        //依赖注入jdbcTemplate
        @Resource(name="jt")//也可以用@Autowired和@Qualifier("jt")组合注解
        private JdbcTemplate jt;
        //把一个员工插入到数据库
        public void save(Employee e) {
            //只需要一条语句,完成自动创建连接,执行sql,关闭连接
            String sql ="INSERT INTO T_TABLE VALUES(2,?,?)";
            Object[] args= {e.getName(),e.getAge()};//元素的位置,跟上述sql一致
            jt.update(sql,args);
        }
        /**
         * 查询所有的员工
         * @return
         */
        //查询所有员工的方法
        public List<Employee> findAll(){
            String sql="SELECT * FROM T_TABLE";
            return jt.query(sql, new EmpRowMapper());
            
        }
        /**
         * 匿名内部类,这个类只能被当前类引用
         * @author
         *
         */
        class EmpRowMapper implements RowMapper<Employee>{
            /**
             * 告诉JDBCTemplate,如何将结果集转换成一个实体对象
             * rowNum:正在被处理的记录的下标,从0开始,为啥它好像在方法中就没用到过?
             */
            public Employee mapRow(ResultSet rs, int rowNum) throws SQLException {
                Employee e=new Employee();
                e.setId(rs.getInt("ID"));
                e.setName(rs.getString("NAME"));
                e.setAge(rs.getInt("age"));            
                return e;
            }
            
        }
        /**
         * 使用SpringJDBCTemplate进行查询
         * @param id
         * @return
         */
        public Employee findById(int id) {
            String sql="SELECT * FROM T_TABLE WHERE ID=?";
            Employee emp=null;
            try {
                Object[] object= {id};
                emp=jt.queryForObject(sql, object, new EmpRowMapper());
            }catch(EmptyResultDataAccessException e) {
                //空结果数据访问异常:没有数据查询到时会抛出此异常
                e.printStackTrace();
                return null;
            }
            return emp;
        }
        /**
         * SpringJDBC修改更新的方法
         * @param emp
         */
        public void modify(Employee emp) {
            String sql="UPDATE T_TABLE SET NAME=?,AGE=? WHERE ID=?";
            Object[] args= {emp.getName(),emp.getAge(),emp.getId()};
            jt.update(sql, args);
        }
        /**
         * SpringJDBC删除的方法
         * @param id
         */
        public void delete(int id) {
            String sql="DELETE FROM T_TABLE WHERE ID=?";
            Object[] args= {id};
            jt.update(sql, args);
        }
        
    
    }

    (5)使用junit包进行测试数据库操作,SpringJDBC底层还是调用了PreparedStatement,参数绑定在数据对象数组里

    package Test;
    
    import java.util.List;
    
    import org.junit.Before;
    import org.junit.Test;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    import DAO.EmployeeDAO;
    import Entity.Employee;
    
    public class testCase {
        private EmployeeDAO dao;
        /**
         * @before注解修饰的作用是在其他测试方法运行之前会执行
         */
        @Before
        public void init() {
            String config="spring-jdbc.xml";
            ApplicationContext ac=new ClassPathXmlApplicationContext(config);
            dao=ac.getBean("employeeDAO",EmployeeDAO.class);    
        }
        
        /**
         * 测试springJDBCTemplate
         */
        @Test
        public void test() {
            Employee e=new Employee();
            e.setName("duanyu");e.setAge(20);
            dao.save(e);
        }
        /**
         * 测试查询方法
         */
        @Test
        public void test1() {
            List<Employee> list=dao.findAll();
            System.out.println(list);
            
        }
        /**
         * 根据ID查询的测试
         */
        @Test
        public void test2() {
            Employee emp=dao.findById(2);
            System.out.println(emp);
            
        }
        /**
         * 更新ID为1的员工信息,UPDATE
         */
        @Test
        public void test3() {
            //先查到一个
            Employee employee=dao.findById(2);
            //对信息进行修改
            employee.setAge(employee.getAge()+10);
            dao.modify(employee);
            Employee newEmployee=dao.findById(2);
            System.out.println(newEmployee);
            
        }
        /**
         * 删除id为1的员工,方法测试
         */
        @Test
        public void test4() {
            dao.delete(2);
        }
    
    }

    总结

    SpringJDBC相比JDBC,降低了耦合度,并且实现自动连接和关闭数据库连接,要方便不少。

  • 相关阅读:
    【东师软工】第二次成绩排行榜
    博客(懒得在cnblog移了)
    elementUI el-tree 修改无子项的样式
    流文件下载方法
    2.2.3 核心模块--理解.NetCore Configuration 配置管理
    Centos7下安装部署Asp.Net Core多版本依赖环境
    LADP认证接入
    Identity Server基础
    浅析DevOps中结合IAST的落地介绍
    从Leetcode的回文子串中学习动态规划和中心扩散法
  • 原文地址:https://www.cnblogs.com/youngchaolin/p/10352710.html
Copyright © 2011-2022 走看看