项目使用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); } }