版权声明:本文为博主原创文章,未经博主允许不得转载。 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);
}