zoukankan      html  css  js  c++  java
  • [Spring学习笔记 6 ] Spring JDBC 详解

     项目使用maven管理,pom.xml和项目组织如下:

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.amos.spring</groupId>
        <artifactId>Lspring_JDBC</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <packaging>jar</packaging>
    
        <name>Lspring_JDBC</name>
        <url>http://maven.apache.org</url>
    
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.2</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-jdbc</artifactId>
                <version>3.2.4.RELEASE</version>
            </dependency>
    
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
                <version>3.2.4.RELEASE</version>
            </dependency>
            <dependency>
                <groupId> org.aspectj</groupId>
                <artifactId> aspectjweaver</artifactId>
                <version> 1.6.11</version>
            </dependency>
            <dependency>
                <groupId>commons-dbcp</groupId>
                <artifactId>commons-dbcp</artifactId>
                <version>1.2.2</version>
            </dependency>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.24</version>
            </dependency>
    
        </dependencies>
    </project>

    逻辑步骤如下:

    1.直接看代码:传统操作数据库方式

    package com.amos.spring.dao;
    
    import java.sql.Connection;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    
    import javax.sql.DataSource;
    
    import org.apache.commons.dbcp.BasicDataSource;
    
    /** 
    * @ClassName: 传统的操作数据库的方式  
    * @Description: TODO
    * @author: amosli
    * @email:amosli@infomorrow.com
    * @date Nov 28, 2013 2:03:23 AM  
    */
    public class DbUtil {
        private static DataSource datasource;
        static {
            // 初始化连接池
            BasicDataSource dSource = new BasicDataSource();
            // 设置连接池的属性
            dSource.setDriverClassName("com.mysql.jdbc.Driver");
            dSource.setUrl("jdbc:mysql:///spring_learn");
            dSource.setUsername("root");
            dSource.setPassword("root");
            datasource = dSource;
        }
    
        public static Connection getConn() throws SQLException {
            return datasource.getConnection();
        }
    
        public static void close(ResultSet rs, Statement stmt, Connection conn) {
            if (rs != null) {
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (stmt != null) {
                try {
                    stmt.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    2.定义一个person接口

    package com.amos.spring.dao;
    
    import java.util.List;
    
    import com.amos.spring.model.Person;
    
    /** 
    * @ClassName: IpersonDao 
    * @Description: TODO
    * @author: amosli
    * @email:amosli@infomorrow.com
    * @date Nov 27, 2013 12:35:48 AM  
    */
    public interface IpersonDao {
        void save(Person p);
    
        void update(Long id, Person p);
    
        void delete(Long id);
    
        List<Person> loadAll();
    
    }

    3.使用最原始的操作数据库方式

    package com.amos.spring.impl;
    
    import java.sql.Connection;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.List;
    
    import com.amos.spring.dao.DbUtil;
    import com.amos.spring.dao.IpersonDao;
    import com.amos.spring.model.Person;
    
    /** 
    * @ClassName: PersonDaoImplJdbcOld 
    * @Description: 最原始的操作
    * @author: amosli
    * @email:amosli@infomorrow.com
    * @date Nov 28, 2013 12:15:20 AM  
    */
    public class PersonDaoImplJdbcOld implements IpersonDao {
    
        public void save(Person p) {
            // 获得连接
            // 获得一个连接Connection
            Connection conn = null;
            Statement stmt = null;
            try {
                conn = DbUtil.getConn();
                // 开取事务
                conn.setAutoCommit(false);
                // 初始化相关的Statment对象
                stmt = conn.createStatement();
                String sql = "insert into person(name,age) values('" + p.getName() + "'," + p.getAge() + ")";
                stmt.executeUpdate(sql);
                // 提交事务
                conn.commit();
            } catch (Exception e) {
                try {
                    if (conn != null)
                        conn.rollback();
                } catch (SQLException e1) {
                    e1.printStackTrace();
                }
            } finally {
                DbUtil.close(null, stmt, conn);
            }
        }
    
        public void update(Long id, Person p) {
            // 获得一个连接Connection
            Connection conn = null;
            Statement stmt = null;
            try {
                conn = DbUtil.getConn();
                // 开取事务
                conn.setAutoCommit(false);
                // 初始化相关的Statment对象
                stmt = conn.createStatement();
                String sql = "update person set name = '" + p.getName() + "',age='" + p.getAge() + "' where id='" + p.getId() + "'";
                stmt.executeUpdate(sql);
                // 提交事务
                conn.commit();
            } catch (Exception e) {
                try {
                    if (conn != null)
                        conn.rollback();
                } catch (SQLException e1) {
                    e1.printStackTrace();
                }
            } finally {
                DbUtil.close(null, stmt, conn);
            }
        }
    
        public void delete(Long id) {
            Connection conn = null;
            Statement stmt = null;
            try {
                conn = DbUtil.getConn();
                // 开取事务
                conn.setAutoCommit(false);
                // 初始化相关的Statment对象
                stmt = conn.createStatement();
                String sql = "delete person where id='"+id+"'";
                stmt.executeUpdate(sql);
                // 提交事务
                conn.commit();
            } catch (Exception e) {
                try {
                    if (conn != null)
                        conn.rollback();
                } catch (SQLException e1) {
                    e1.printStackTrace();
                }
            } finally {
                DbUtil.close(null, stmt, conn);
            }
        }
    
        public List<Person> loadAll() {
            // TODO Auto-generated method stub
            return null;
        }
    
    }

    4.发现有很多冗余的地方,关于数据库的开启关闭都是相同的,怎么抽象出来共有的地方???

    定义一个接口,使用内部类实现这个接口,然后调用这个方法。

    package com.amos.spring.impl;
    
    import java.sql.Connection;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.List;
    
    import com.amos.spring.dao.DbUtil;
    import com.amos.spring.dao.IpersonDao;
    import com.amos.spring.model.Person;
    
    /**
     * @ClassName: PersonDaoImplJdbc
     * @Description: 把相同的操作封装成一个接口,用内部 类实现接口
     * @author: amosli
     * @email:amosli@infomorrow.com
     * @date Nov 27, 2013 11:37:50 PM
     */
    public class PersonDaoImplJdbc implements IpersonDao {
    
        interface UpdateOperation {
            /**
             * 把各种各样的操作封装成一个接口
             * 
             * @param stmt
             * @throws SQLException
             */
            void execute(Statement stmt) throws SQLException;
        }
    
        /**
         * 执行数据库操作
         */
        public void excuteUpdate(UpdateOperation operation) {
            // 获得一个连接Connection
            Connection conn = null;
            Statement stmt = null;
            try {
                conn = DbUtil.getConn();
                // 开取事务
                conn.setAutoCommit(false);
                // 初始化相关的Statment对象
                stmt = conn.createStatement();
                // 执行具体的操作
                operation.execute(stmt);
                // 提交事务
                conn.commit();
            } catch (Exception e) {
                try {
                    if (conn != null)
                        conn.rollback();
                } catch (SQLException e1) {
                    e1.printStackTrace();
                }
            } finally {
                DbUtil.close(null, stmt, conn);
            }
        }
    
        public void save(final Person p) {
            // save中就只有核心的业务代码了
            excuteUpdate(new UpdateOperation() {
                public void execute(Statement stmt) throws SQLException {
                    String sql = "insert into person(name,age) values('" + p.getName() + "'," + p.getAge() + ")";
                    stmt.executeUpdate(sql);
                }
            });
        }
    
        public void update(final Long id, final Person p) {
            excuteUpdate(new UpdateOperation() {
                public void execute(Statement stmt) throws SQLException {
                    String sql = "update person set name = '" + p.getName() + "',age='" + p.getAge() + "' where id='" + id + "'";
                    stmt.executeUpdate(sql);
                }
            });
        }
    
        public void delete(final Long id) {
            excuteUpdate(new UpdateOperation() {
                public void execute(Statement stmt) throws SQLException {
                    String sql = "delete person where id='" + id + "'";
                    stmt.executeUpdate(sql);
                }
            });
    
        }
    
        public List<Person> loadAll() {
            return null;
        }
    
    }

    5.怎么才能进一步优化代码???那就把刚才核心代码抽象成一个类,不仅person可以使用其他类也可以使用

    如下代码:

    package com.amos.spring.impl;
    
    import java.sql.Connection;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.List;
    
    import com.amos.spring.dao.DbUtil;
    import com.amos.spring.dao.IpersonDao;
    import com.amos.spring.model.Person;
    
    /**
     * @ClassName: PersonDaoImplJdbcTemplate
     * @Description: 代码继续优化,把实现接口的方法提取出来
     * @author: amosli 
     * @email:amosli@infomorrow.com
     * @date Nov 27, 2013 11:51:06 PM
     */
    public class PersonDaoImplJdbcTemplate implements IpersonDao {
    
        interface UpdateOperation {
            /**
             * 把各种各样的操作封装成一个接口
             * 
             * @param stmt
             * @throws SQLException
             */
            void execute(Statement stmt) throws SQLException;
        }
    
        /**
         * 执行数据库操作
         */
        public void excuteUpdate(UpdateOperation operation) {
            // 获得一个连接Connection
            Connection conn = null;
            Statement stmt = null;
            try {
                conn = DbUtil.getConn();
                // 开取事务
                conn.setAutoCommit(false);
                // 初始化相关的Statment对象
                stmt = conn.createStatement();
                // 执行具体的操作
                operation.execute(stmt);
                // 提交事务
                conn.commit();
            } catch (Exception e) {
                try {
                    if (conn != null)
                        conn.rollback();
                } catch (SQLException e1) {
                    e1.printStackTrace();
                }
            } finally {
                DbUtil.close(null, stmt, conn);
            }
        }
    
        public void excuteSql(final String sql) {
            excuteUpdate(new UpdateOperation() {
                public void execute(Statement stmt) throws SQLException {
                    stmt.executeUpdate(sql);
                }
            });
        }
    
        public void save(final Person p) {
            // save中就只有核心的业务代码了
            String sql = "insert into person(name,age) values('" + p.getName() + "'," + p.getAge() + ")";
            excuteSql(sql);
        }
    
        public void update(final Long id, final Person p) {
            String sql = "update person set name = '" + p.getName() + "',age='" + p.getAge() + "' where id='" + id + "'";
            excuteSql(sql);
        }
    
        public void delete(final Long id) {
            String sql = "delete person where id='" + id + "'";
            excuteSql(sql);
        }
    
        public List<Person> loadAll() {
            return null;
        }
    
    }

    6.写个testcase测试下吧:

    package com.amos.spring.dao;
    
    import com.amos.spring.impl.PersonDaoImplJdbcTemplateBest;
    import com.amos.spring.model.Person;
    
    /** 
    * @ClassName: PersonDaoTest 
    * @Description: 把关于数据库操作的类封装起来进行调用
    * @author: amosli
    * @email:amosli@infomorrow.com
    * @date Nov 28, 2013 1:59:04 AM  
    */
    public class PersonDaoTest {
        private static IpersonDao dao;
    
        public static void main(String args[]) {
            dao = new PersonDaoImplJdbcTemplateBest();
            Person person = new Person();
            person.setName("运哥");
            person.setAge(29);
            dao.save(person);
        }
    }

    然后去查看数据库即可。

    数据库非常简单,person数据库生成代码:

    DROP TABLE IF EXISTS `person`;
    CREATE TABLE `person` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `name` varchar(1000) DEFAULT NULL,
      `age` int(11) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=gbk;
    
    -- ----------------------------
    -- Records of person
    -- ----------------------------
    INSERT INTO `person` VALUES ('1', '运哥', '23');

    7.使用spring 又该如何呢?使用JdbcTemplate模板

    package com.amos.spring.impl;
    
    import java.util.List;
    
    import org.springframework.jdbc.core.JdbcTemplate;
    
    import com.amos.spring.dao.IpersonDao;
    import com.amos.spring.model.Person;
    
    /** 
    * @ClassName: SpringJdbcTemplateBest 
    * @Description: 使用spring 框架进行操作数据库
    * @author: amosli
    * @email:amosli@infomorrow.com
    * @date Nov 28, 2013 1:01:27 AM  
    */
    public class SpringJdbcTemplateBest implements IpersonDao {
        private JdbcTemplate jdbcTemplate;
        public List<Person> loadAll() {
            return null;
        }
    
        public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
            this.jdbcTemplate = jdbcTemplate;
        }
    
        public void save(Person p) {
            String sql = "insert into person(name,age) values('" + p.getName() + "'," + p.getAge() + ")";
            System.out.println("save:" + sql);
            jdbcTemplate.update(sql);
        }
    
        public void update(Long id, Person p) {
            String sql = "update person set name = '" + p.getName() + "',age='" + p.getAge() + "' where id='" + id + "'";
            jdbcTemplate.update(sql);
        }
    
        public void delete(Long id) {
            String sql = "delete person where id='" + id + "'";
            jdbcTemplate.update(sql);
        }
    
    }

    8.配置bean.xml文件

    <?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-3.2.xsd
                   http://www.springframework.org/schema/context
                   http://www.springframework.org/schema/context/spring-context-3.2.xsd
                   ">
        <context:property-placeholder location="db.properties" />
        <!-- 配置连接池 -->
        <bean id="mydataSource" class="org.apache.commons.dbcp.BasicDataSource">
            <property name="driverClassName" value="${db.driverClassName}"></property>
            <property name="url" value="${db.url}"></property>
            <property name="username" value="${db.username}"></property>
            <property name="password" value="${db.password}"></property>
        </bean>
        <!-- 配置jdbctemplate -->
        <bean id="myjdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
            <property name="dataSource" ref="mydataSource"></property>
        </bean>
        <bean id="personDao" class="com.amos.spring.impl.SpringJdbcTemplateBest">
            <property name="jdbcTemplate" ref="myjdbcTemplate"></property>
        </bean>
    </beans>

    db.properties:

    db.driverClassName=com.mysql.jdbc.Driver
    db.url=jdbc:mysql:///spring_learn
    db.username=root
    db.password=root

    9.写个testcase测试一下:

    package com.amos.spring.dao;
    
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    import com.amos.spring.model.Person;
    
    public class SpringPersonDaoTest {
        private static IpersonDao dao;
    //    @Test
        public static void main(String args[]){
            ApplicationContext acx = new ClassPathXmlApplicationContext("bean.xml");
            dao = acx.getBean(IpersonDao.class);
            Person person = new Person();
            person.setName("运哥");
            person.setAge(33);
            dao.save(person);
        }
    }
  • 相关阅读:
    设置nginx禁止IP直接访问,只能通过指定的域名访问
    (转)给力开源,.Net开源地址大收集
    Jmeter的使用
    Jmeter的安装
    虚拟机的使用(1)
    win下 Eclipse+PyDev环境搭建
    eclipse配置pydev解释器
    win下Python2.7+pip+Ipython安装
    CentOS 6.5 安装VMTools 及 设置拼音输入法
    CentOS 6.5 + JDK + mysql + tomcat + jpress搭建及所遇问题解决
  • 原文地址:https://www.cnblogs.com/amosli/p/3446915.html
Copyright © 2011-2022 走看看