JdbcTemplate

  • 在spring中使用JdbcTemplate进行数据库管理操作

在JdbcTemplate中执行SQL语句的方法大致分为3类:

  1. execute:可以执行所有SQL语句,一般用于执行DDL语句。
  2. update:用于执行INSERTUPDATEDELETE等DML语句。
  3. query....:用于DQL数据查询语句。

JdbcTemplate概念及使用

a)Spring 框架对 JDBC 进行封装,使用 JdbcTemplate 方便实现对数据库操作

b)引入相关 jar 包

c)在 spring 配置文件配置数据库连接池

1
2
3
4
5
6
7
8
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
destroy-method="close">
<property name="url" value="jdbc:mysql:///test" />
<property name="username" value="root" />
<property name="password" value="qwer" />
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
</bean>

d)配置 JdbcTemplate 对象,注入 DataSource

1
2
3
4
5
6
<!-- JdbcTemplate 对象 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<!--注入 dataSource-->
<property name="dataSource" ref="dataSource"></property><!--set方式注入-->
</bean>

e)创建 service 类,创建 dao 类,在 dao 注入 jdbcTemplate 对象

1
2
<!-- 组件扫描 -->
<context:component-scan base-package="com.atguigu"></context:component-scan>
1
2
3
4
5
6
7
8
9
10
11
12
13
@Service
public class BookService {
//注入 dao
@Autowired
private BookDao bookDao;
}

@Repository
public class BookDaoImpl implements BookDao {
//注入 JdbcTemplate
@Autowired
private JdbcTemplate jdbcTemplate;
}

JdbcTemplate操作数据库

1、JdbcTemplate 添加

a)对应数据库创建实体类

b)创建service和dao

(1)在 dao 进行数据库添加操作

(2)调用 JdbcTemplate 对象里面 update 方法实现添加操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class BookDaoImpl implements BookDao {
//注入 JdbcTemplate
@Autowired
private JdbcTemplate jdbcTemplate;
//添加的方法
@Override
public void add(Book book) {
//1 创建 sql 语句
String sql = "insert into t_book values(?,?,?)";
//2 调用方法实现
Object[] args = {book.getUserId(), book.getUsername(),book.getUstatus()};
int update = jdbcTemplate.update(sql,args);
System.out.println(update);
}
}

2、JdbcTemplate 修改和删除

  • 使用JdbcTemplate 模板所实现的 “增删改” 都是调用了同一个 update”方法

1、修改

1
2
3
4
5
6
7
@Override
public void updateBook(Book book) {
String sql = "update t_book set username=?,ustatus=? where user_id=?";
Object[] args = {book.getUsername(), book.getUstatus(),book.getUserId()};
int update = jdbcTemplate.update(sql, args);
System.out.println(update);
}

2、删除

1
2
3
4
5
6
@Override
public void delete(String id) {
String sql = "delete from t_book where user_id= ?";
int update = jdbcTemplate.update(sql, id);
System.out.println(update);
}

3、JdbcTemplate查询返回某个值

1
2
3
4
5
6
7
8
//查询表记录数
@Override
public int selectCount() {
String sql = "select count(*) from t_book";
//queryForObject方法中:第一个参数代表--sql语句;第二个参数代表--返回类型class
Integer count = jdbcTemplate.queryForObject(sql, Integer.class);
return count;
}

4、JdbcTemplate查询返回对象

  • jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<Book>(Book.class), id);
  • queryForObject方法 参数
    第一个参数:sql语句
    第二个参数:RowMapper 是接口,针对返回不同类型数据,使用这个接口里面 实现类 完成数据封装
    第三个参数:sql 语句值
1
2
3
4
5
6
@Override
public Book findBookInfo(String id) {
String sql = "select * from t_book where user_id=?";
Book book = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<Book>(Book.class), id);
return book;
}

5、JdbcTemplate 查询返回集合

  • 场景:查询图书列表,分页
1
2
3
4
5
6
7
8
9
@Override
public List<Book> findAllBook() {
String sql = "select * from t_book";

List<Book> bookList = jdbcTemplate.query(sql, new BeanPropertyRowMapper<Book>(Book.class));

return bookList;
}

6、JdbcTemplate批量操作

  • 批量添加 :返回行数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//
@Override
public void batchAddBook(List<Object[]> batchArgs) { // 注意类型是Object[]
String sql = "insert into t_book values(?,?,?)";
//batchUpdate方法 第一个参数:sql语句 第二个参数:List集合,添加多条记录数据
int[] ints = jdbcTemplate.batchUpdate(sql, batchArgs);
System.out.println(Arrays.toString(ints));
}


@Test
public void batchAddTest(){
//批量添加测试
List<Object[]> batchArgs = new ArrayList<>();
Object[] o1 = {"3","java","a"};
Object[] o2 = {"4","c++","b"};
Object[] o3 = {"5","MySQL","c"};
batchArgs.add(o1);
batchArgs.add(o2);
batchArgs.add(o3);
//调用批量添加
bookService.batchAdd(batchArgs);

}

7、JdbcTemplate 实现批量修改操作

批量修改(同批量添加一样,调用同一个方法)

  • jdbcTemplate.batchUpdate(sql, args);

字节码

1
2
int[] batchUpdate(String var1, List<Object[]> var2, int[] var3) throws DataAccessException;
int[] batchUpdate(String var1, List<Object[]> var2) throws DataAccessException;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@Override
public void batchUpdate(List<Object[]> batchArgs) {
String sql = "update t_book set username=?,ustatus=? where user_id=?";
int[] ints = jdbcTemplate.batchUpdate(sql, batchArgs);
System.out.println(Arrays.toString(ints));
}

@Test
public void batchUpdateTest(){
List<Object[]> batchArgs = new ArrayList<>();
//只需要有id 即可
Object[] o1 = {"3","java_update","a111"};
Object[] o2 = {"4","c++_update","b111"};
Object[] o3 = {"5","MySQL_update","c111"};

batchArgs.add(o1);
batchArgs.add(o2);
batchArgs.add(o3);
bookService.batchUpdate(batchArgs);
}

批量删除

  • 返回值是影响的行数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@Override
public void batchDeleteBook(List<Object[]> batchArgs) {
String sql = "delete t_book where user_id=?";
int[] ints = jdbcTemplate.batchUpdate(sql, batchArgs);
System.out.println(Arrays.toString(ints));
}

@Test
public void batchDeleteTest(){
List<Object[]> batchArgs = new ArrayList<>();
//只需要有id 即可
Object[] o1 = {"3"};
Object[] o2 = {"4"};
Object[] o3 = {"5"};
batchArgs.add(o1);
batchArgs.add(o2);
batchArgs.add(o3);

bookService.batchDelete(batchArgs);
}