一、使用JdbcTemplate和JdbcDaoSupport
1、配置并连接数据库
①创建项目并添加jar包,要比之前Spring项目多添加两个jar包c3p0-0.9.1.2.jar和mysql-connector-java-5.1.7-bin.jar
②创建db.properties添加以下配置
pp为数据库名initPoolSize和maxPoolSize随意
jdbc.user=root
jdbc.password=root
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.jdbcUrl=jdbc:mysql:///pp
jdbc.initPoolSize=5
jdbc.maxPoolSize=10
③创建applicationContext.xml添加配置
<!-- 导入资源 --> <context:property-placeholder location="classpath:db.properties"/> <!-- 配置C3P0数据源 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="user" value="${jdbc.user}"></property> <property name="password" value="${jdbc.password}"></property> <property name="driverClass" value="${jdbc.driverClass}"></property> <property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property> <property name="initialPoolSize" value="${jdbc.initPoolSize}"></property> <property name="maxPoolSize" value="${jdbc.maxPoolSize}"></property> </bean>
④创建一个单元测试类测试是否能够连接数据库
public class JDBCtest { private ApplicationContext ctx = null; { ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); } @Test public void testDataSource() throws SQLException { DataSource dataSource = ctx.getBean(DataSource.class); System.out.println(dataSource.getConnection()); } }
MySql创建数据库
2、使用JdbcTemplate
①applicationContext.xml添加bean
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="dataSource"></property> </bean>
②修改JDBCtest.java添加JbdcTemplate属性和Update方法
public class JDBCtest { private ApplicationContext ctx = null; private JdbcTemplate jdbcTemplate = null; { ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); jdbcTemplate = (JdbcTemplate) ctx.getBean("jdbcTemplate"); } @Test public void testUpdate() { String sql = "update tbl_user set name = ? where id = ?"; jdbcTemplate.update(sql, "李四" , 1); } @Test public void testDataSource() throws SQLException { DataSource dataSource = ctx.getBean(DataSource.class); System.out.println(dataSource.getConnection()); } }
执行成功“张三”修改为“李四”
update还可以用来新增和删除
使用jdbcTemplate.update执行insert和delete
@Test public void testUpdate() { String sql = "update tbl_user set name = ? where id = ?"; jdbcTemplate.update(sql, "李四", 1); String sql1 = "insert into tbl_user(name , account) values (?,?)"; jdbcTemplate.update(sql1, new Object[]{"jj",250}); String sql2 = "delete from tbl_user where id = ?"; jdbcTemplate.update(sql2, 1); }
③使用jdbcTemplate.batchUpdate执行批量操作
@Test public void testBatchUpdate() { String sql = "insert into tbl_user(name , account) values (?,?)"; List<Object[]> args = new ArrayList<Object[]>(); args.add(new Object[] { "jja", 250 }); args.add(new Object[] { "jjb", 260 }); args.add(new Object[] { "jjc", 270 }); args.add(new Object[] { "jjd", 280 }); args.add(new Object[] { "jje", 290 }); jdbcTemplate.batchUpdate(sql, args); }
同样的batchUpdate也可以用来执行批量删除和添加
④使用jdbcTemplate.queryForObject从数据库获取对象
首先新建对象User
public class User { private int id; private String name; private double account; private Date birthday; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public double getAccount() { return account; } public void setAccount(double account) { this.account = account; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } @Override public String toString() { return "User [id=" + id + ", name=" + name + ", account=" + account + ", birthday=" + birthday + "]"; } }
在JDBCtest.java里添加testQueryForObject方法
/** * <p>Description: 从数据库获取一个对象 * 不是使用jdbcTemplate.queryForObject(sql, requiredType, args)方法 * 而是使用jdbcTemplate.queryForObject(sql, args, argTypes, rowMapper)方法 * </p> */ @Test public void testQueryForObject() { String sql = "select id, name, account, birthday from tbl_user where id = ?"; RowMapper<User> rowMapper = new BeanPropertyRowMapper<User>(User.class); User user = jdbcTemplate.queryForObject(sql, rowMapper, 1); System.out.println(user.toString()); }
⑤使用jdbcTemplate的局限性
不支持级联属性,JdbcTemplate到底是一JDBC小工具不是ORM框架
⑥查实体类集合
/** * <p>Description: 查实体类集合</p> */ @Test public void testQueryForList() { String sql = "select id, name, account, birthday from tbl_user where id > ?"; RowMapper<User> rowMapper = new BeanPropertyRowMapper<User>(User.class); List<User> users = jdbcTemplate.query(sql, rowMapper, 5); System.out.println(users.toString()); }
二、使用NamedParameterJdbcTemplate
1、配置NamedParameterJdbcTemplate Bean
<!-- 该对象可以使用具名参数,该对象没有无参构造器,所以必须传一个参数 --> <bean id="namedParameterJdbcTemplate" class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate"> <constructor-arg ref="dataSource"></constructor-arg> </bean>
2、在JDBCtest测试类中添加测试方法
/** * <p>Description: 可以为参数起名字增强维护性,较为麻烦</p> */ @Test public void testNamedParameterJdbcTemplate() { String sql = "insert into tbl_user(name, account) values (:name,:account)"; Map<String , Object> paramMap = new HashMap<String , Object>(); paramMap.put("name", "hj"); paramMap.put("account", "10000000000"); namedParameterJdbcTemplate.update(sql, paramMap); } /** * <p>Description: 可以直接传对象</p> */ @Test public void testNamedParameterJdbcTemplate2() { String sql = "insert into tbl_user(name, account) values (:name,:account)"; User user = new User(); user.setName("kk"); user.setAccount(666); SqlParameterSource paramSource = new BeanPropertySqlParameterSource(user); namedParameterJdbcTemplate.update(sql, paramSource); }
数据库中添加数据成功
在经典的 JDBC 用法中, SQL 参数是用占位符 ? 表示,并且受到位置的限制. 定位参数的问题在于, 一旦参数的顺序发生变化, 就必须改变参数绑定.
在 Spring JDBC 框架中, 绑定 SQL 参数的另一种选择是使用具名参数(named parameter).
具名参数: SQL 按名称(以冒号开头)而不是按位置进行指定. 具名参数更易于维护, 也提升了可读性. 具名参数由框架类在运行时用占位符取代
具名参数只在 NamedParameterJdbcTemplate 中得到支持