Spring框架学习笔记(9)——Spring对JDBC的支持

本文内容纲要:Spring框架学习笔记(9)——Spring对JDBC的支持

一、使用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 中得到支持

本文内容总结:Spring框架学习笔记(9)——Spring对JDBC的支持

原文链接:https://www.cnblogs.com/huangjian2/p/6397547.html

以上是 Spring框架学习笔记(9)——Spring对JDBC的支持 的全部内容, 来源链接: utcz.com/z/362683.html

回到顶部