Spring学习笔记——(6)Spring之JDBCTemplate

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/shaohe18362202126/article/details/82597199

一、配置数据库与数据连接池

1、新建db.properties文件

jdbc.user=root
jdbc.password=root
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.jdbcUrl=jdbc:mysql:///jdbc_test
 
jdbc.initPoolSize=5
jdbc.maxPoolSize=10

2、Spring配置

<!-- 导入资源文件 -->
<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="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
	<property name="driverClass" value="${jdbc.driverClass}"></property>
	<property name="initialPoolSize" value="${jdbc.initPoolSize}"></property>
	<property name="maxPoolSize" value="${jdbc.maxPoolSize}"></property>
</bean>

3、maven配置

<dependencies>
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-context</artifactId>
		<version>4.0.5.RELEASE</version>
	</dependency>
	<!-- https://mvnrepository.com/artifact/aspectj/aspectjrt -->
	<dependency>
		<groupId>aspectj</groupId>
		<artifactId>aspectjrt</artifactId>
		<version>1.5.3</version>
	</dependency>
	<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
	<dependency>
		<groupId>org.aspectj</groupId>
		<artifactId>aspectjweaver</artifactId>
		<version>1.6.8</version>
	</dependency>
	<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
	<dependency>
		<groupId>mysql</groupId>
		<artifactId>mysql-connector-java</artifactId>
		<version>5.1.6</version>
	</dependency>
	<!-- https://mvnrepository.com/artifact/c3p0/c3p0 -->
	<dependency>
		<groupId>c3p0</groupId>
		<artifactId>c3p0</artifactId>
		<version>0.9.1.2</version>
	</dependency>
	<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-jdbc</artifactId>
		<version>4.3.14.RELEASE</version>
	</dependency>
	<!-- https://mvnrepository.com/artifact/org.springframework/spring-web -->
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-web</artifactId>
		<version>4.3.14.RELEASE</version>
	</dependency>
	<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-webmvc</artifactId>
		<version>4.3.14.RELEASE</version>
	</dependency>
	<!-- https://mvnrepository.com/artifact/org.springframework/spring-orm -->
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-orm</artifactId>
		<version>4.3.14.RELEASE</version>
	</dependency>
	<!-- https://mvnrepository.com/artifact/junit/junit -->
	<dependency>
		<groupId>junit</groupId>
		<artifactId>junit</artifactId>
		<version>4.12</version>
		<scope>test</scope>
	</dependency>
</dependencies>

二、使用JDBCTemplate

1、Spring配置

<!-- 配置 Spirng 的 JdbcTemplate -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
	<property name="dataSource" ref="dataSource"></property>
</bean>

2、执行增删改操作

/**
 * 执行 INSERT, UPDATE, DELETE
 */
@Test
public void testUpdate() {
	String sql = "UPDATE user SET password = ? WHERE id = ?";
	jdbcTemplate.update(sql, "1234", 1);
}

3、执行批量更新

/**
 * 执行批量更新: 批量的 INSERT, UPDATE, DELETE<br>
 * 最后一个参数是 Object[]的 List 类型: 修改一条记录需要一个 Object 的数组, 多条就需要多个 Object的数组
 */
@Test
public void testBatchUpdate() {
	String sql = "INSERT INTO user(username, password, remark) VALUES(?,?,?)";
	List<Object[]> batchArgs = new ArrayList<>();
	batchArgs.add(new Object[] { "Tom", "123", "Tom" });
	batchArgs.add(new Object[] { "Mary", "123", "Mary" });
	batchArgs.add(new Object[] { "Jerry", "123", "Jerry" });
	jdbcTemplate.batchUpdate(sql, batchArgs);
}

4、查询对象

/**
 * 从数据库中获取一条记录, 实际得到对应的一个对象 <br>
 * 注意不是调用 queryForObject(String sql,Class<Employee>requiredType,Object...args)方法!<br>
 * 而需要调用 queryForObject(String sql,RowMapper <Employee>rowMapper,Object...args)<br>
 * 1. 其中的 RowMapper 指定如何去映射结果集的行, 常用的实现类为 BeanPropertyRowMapper <br>
 * 2. 使用 SQL 中列的别名完成列名和类的属性名的映射. 例如 last_name lastName <br>
 * 3. 不支持级联属性. JdbcTemplate 到底是一个 JDBC 的小工具, 而不是 ORM 框架
 */
@Test
public void testQueryForObject() {
	String sql = "SELECT id,username,password,remark FROM user WHERE id = ?";
	// RowMapper<User> rowMapper = new BeanPropertyRowMapper<>(User.class);
	User user = jdbcTemplate.queryForObject(sql, new UserRowMapper(), 1);
	System.out.println(user);
}

使用UserRowMapper转换对象

public class UserRowMapper implements RowMapper<User> {

	@Override
	public User mapRow(ResultSet rs, int rowNum) throws SQLException {
		User user = new User();
		user.setId(rs.getInt("id"));
		user.setUsername(rs.getString("username"));
		user.setPassword(rs.getString("password"));
		user.setRemark(rs.getString("remark"));
		return user;
	}

}

5、查询实体类的集合

/**
 * 查询实体类的集合<br>
 * 注意调用的不是 queryForList 方法
 */
@Test
public void testQueryForList() {
	String sql = "SELECT id,username,password,remark FROM user WHERE id > ?";
	List<User> users = jdbcTemplate.query(sql, new UserRowMapper(), 1);
	System.out.println(users);
}

6、获取单个列的值

/**
 * 获取单个列的值, 或做统计查询<br>
 * 使用 queryForObject(String sql, Class<Long> requiredType)
 */
@Test
public void testQueryForObject2() {
	String sql = "SELECT count(id) FROM user";
	long count = jdbcTemplate.queryForObject(sql, Long.class);
	System.out.println(count);
}

三、使用NamedParameterJdbcTemplate

1、配置NamedParameterJdbcTemplate

<!-- 配置 NamedParameterJdbcTemplate, 该对象可以使用具名参数, 其没有无参数的构造器, 所以必须为其构造器指定参数 -->
<bean id="namedParameterJdbcTemplate"
	class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
	<constructor-arg ref="dataSource"></constructor-arg>
</bean>

2、为参数起名字

/**
 * 参数起名字.<br>
 * 1. 好处: 若有多个参数, 则不用再去对应位置, 直接对应参数名, 便于维护<br>
 * 2. 缺点: 较为麻烦.
 */
@Test
public void testNamedParameterJdbcTemplate() {
	String sql = "INSERT INTO user(username, password, remark) VALUES(:username,:password,:remark)";
	Map<String, Object> paramMap = new HashMap<>();
	paramMap.put("username", "FF");
	paramMap.put("password", "123");
	paramMap.put("remark", "[email protected]");
	namedParameterJdbcTemplate.update(sql, paramMap);
}

3、使用SqlParameterSource

/**
 * 使用具名参数时,使用 update(String sql,SqlParameterSource paramSource)方法进行更新操作 <br>
 * 1. SQL 语句中的参数名和类的属性一致!<br>
 * 2. 使用 SqlParameterSource 的 BeanPropertySqlParameterSource 实现类作为参数.
 */
@Test
public void testNamedParameterJdbcTemplate2() {
	String sql = "INSERT INTO user(username, password, remark) VALUES(:username,:password,:remark)";
	User user = new User();
	user.setUsername("paramSource");
	user.setPassword("321");
	user.setRemark("SqlParameterSource");
	SqlParameterSource paramSource = new BeanPropertySqlParameterSource(user);
	namedParameterJdbcTemplate.update(sql, paramSource);
}

猜你喜欢

转载自blog.csdn.net/shaohe18362202126/article/details/82597199