一、什么是JdbdTemplate
Spring框架对JDBC进行封装,使用JdbdTemplate方便实现对数据库操作
二、准备工作
1、导入依赖
druid :德鲁伊连接池
mysql-connector-java
spring-jdbc
spring-tx: spring事务
spring-orm :整合Template或者mybatis要用
创建一个maven项目后,可以直接把下边的依赖坐标,复制到pom文件中
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.7.RELEASE</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.20</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.2.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>4.3.0.RELEASE</version>
</dependency>
</dependencies>
2、在spring配置文件中配置数据库连接池
- destroy-method="close"作用是当数据库连接不使用的时候,就把该连接重新放到数据池中,方便下次使用调用。
- xml中:&要用
&
进行转义
<!-- 数据库连接池。
destroy-method="close"作用是当数据库连接不使用的时候,就把该连接重新放到数据池中,方便下次使用调用.
xml中:&要用 & 转义-->
<bean id="dataSourceDefault" class="com.alibaba.druid.pool.DruidDataSource"
destroy-method="close">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/数据库名字?userSSL=true&
useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC" />
<property name="username" value="root" />
<property name="password" value="root" />
</bean>
3、在配置文件中,配置JdbcTemplate对象,注入dataSourceDefault
<!--JdbcTemplate对象-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<!--注入dataSourceDefault-->
<property name="dataSource" ref="dataSourceDefault"></property>
</bean>
三、代码实现
1、创建service类,创建dao类,在dao注入jdbcTemplate对象
- 配置文件
<!-- 开启组件扫描-->
<context:component-scan base-package="com.lu"></context:component-scan>
- BookService类
@Service
public class BookService {
//注入dao
@Autowired
private BookDao bookDao;
}
-
BookDao类
@Repository public interface BookDao { }
-
BookDaoImpl类
@Repository public class BookDaoImpl implements BookDao{ //注入JdbcTemplate @Autowired private JdbcTemplate jdbcTemplate; }
2、JdbcTemplate操作数据库(添加)
(1)创建数据库和book表
create database spring-crud; use spring-crud; CREATE TABLE `book` ( `book_id` int(20) NOT NULL, `book_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL, `bstatus` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL, PRIMARY KEY (`book_id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
(2)创建数据库对应的实体类
public class Book {
private int book_id;
private String book_name;
private String bstatus;
//get和set方法生成一下
}
3、编写service和dao
(1)在dao中进行数据库添加操作
(2)调用JdbcTemplate对象里面的update方法实现添加操作
第一个参数:sql语句
第二个参数:可变参数,设置sql语句值
@Repository
public class BookDaoImpl implements BookDao{
//注入JdbcTemplate
@Autowired
private JdbcTemplate jdbcTemplate;
@Override
public void add(Book book) {
//1、创建sql语句
String sql = "insert into book values(?,?,?)";
//调用方法实现
//可变参数可以一个一个写上,如下
//jdbcTemplate.update(sql,book.getBook_id(),book.getBook_name(),book.getBstatus());
//也可以这样写
Object []args = {book.getBook_id(),book.getBook_name(),book.getBstatus()};
int update = jdbcTemplate.update(sql,args);
System.out.println("插入结果:"+update);
}
}
4、测试类及结果图
-
测试类
public class TestBook { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("application.xml"); BookService bookService = context.getBean("bookService",BookService.class); Book book = new Book(); book.setBook_id(2); book.setBook_name("java"); book.setBstatus("2存在"); bookService.bookAdd(book); } }
-
结果图
5、更新和删除
在BookService类中添加方法,方法里面是调用bookDao中的方法;在BookDao接口中添加接口;在BookDaoImpl类中实现接口中的方法。
@Override
public void updateBook(Book book) {
String sql = "update book set book_name=?,bstatus=? where book_id=?";
Object []args = {book.getBook_name(),book.getBstatus(),book.getBook_id()};
int update = jdbcTemplate.update(sql,args);
System.out.println("更新结果:"+update);
}
@Override
public void deleteBook(int id) {
String sql = "delete from book where book_id = ?";
int update = jdbcTemplate.update(sql,id);
System.out.println("删除结果结果:"+update);
}
6、查询操作
(1)查询返回某个值
场景:查询表里面有多少条记录,返回一个值。
使用JdbcTemplate的queryForObject方法,如下图。
有两个参数:
第一个参数:sql语句
第二个参数:返回类型的Class
BookDaoImpl类
//查询表中记录数
@Override
public int selectCount() {
String sql = "select count(*) from book";
Integer count = jdbcTemplate.queryForObject(sql, Integer.class);
return count;
}
(2)查询返回对象
场景:查询图书信息
使用JdbcTemplate的queryForObject方法,如下图。
有三个参数
第一个参数:sql语句。就是定义的sql。
第二个参数:RowMapper。是接口,返回不同类型数据,使用这个接口里面实现类完成数据封装。
第三个参数:sql语句值。就是问号中的值。
BookDaoImpl类
@Override
public Book findBookInfo(int id) {
String sql = "select * from book where book_id=?";
Book book = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<Book>(Book.class), id);
return book;
}
(3)查询返回集合
场景:查询图书列表分页
使用JdbcTemplate的queryForObject方法,
有两个参数
第一个参数:sql语句。就是定义的sql。
第二个参数:RowMapper。是接口,返回不同类型数据,使用这个接口里面实现类完成数据封装。
//要导入util包下的list
@Override
public List<Book> findAllBook() {
String sql = "select * from book";
List<Book> bookList = jdbcTemplate.query(sql, new BeanPropertyRowMapper<Book>(Book.class));
return bookList;
}
四、批量操作
批量操作:操作表里面的多条记录
1、批量添加
JdbcTemplate的batchUpdate方法
有两个参数
第一个参数:sql语句。
第二个参数:List集合,添加多条记录数据
@Override
public void batchAddBook(List<Object[]> batchArgs) {
String sql = "insert into book values(?,?,?)";
int [] ints = jdbcTemplate.batchUpdate(sql,batchArgs);
System.out.println(Arrays.toString(ints));
}
测试类:
List<Object[]> batchArgs = new ArrayList<>();
Object [] o1 = {2,"c","a"};
Object [] o2 = {3,"mysql","b"};
Object [] o3 = {4,"c++","c"};
batchArgs.add(o1);
batchArgs.add(o2);
batchArgs.add(o3);
bookService.batchAdd(batchArgs);
2、批量修改
JdbcTemplate实现批量添加操作:
@Override
public void batchUpdateBook(List<Object[]> batchArgs) {
String sql = "update book set book_name=?,bstatus=? where book_id=?";
int [] ints = jdbcTemplate.batchUpdate(sql,batchArgs);
System.out.println(Arrays.toString(ints));
}
测试类:
List<Object[]> batchArgs = new ArrayList<>();
Object [] o1 = {"c-up","a",2};
Object [] o2 = {"mysql-up","b",3};
Object [] o3 = {"c++-up","c",4};
batchArgs.add(o1);
batchArgs.add(o2);
batchArgs.add(o3);
bookService.batchUpdate(batchArgs);
3、批量删除
JdbcTemplate实现批量删除操作:
@Override
public void batchDeleteBook(List<Object[]> batchArgs) {
String sql = "delete from book where book_id = ?";
int[] ints = jdbcTemplate.batchUpdate(sql, batchArgs);
System.out.println(Arrays.toString(ints));
}
测试类:
List<Object[]> batchArgs = new ArrayList<>();
Object [] o1 = {2};
Object [] o2 = {3};
Object [] o3 = {4};
batchArgs.add(o1);
batchArgs.add(o2);
batchArgs.add(o3);
bookService.batchDelete(batchArgs);
练习代码:
链接:https://pan.baidu.com/s/12OUZajY40C25yhE5TbrOcQ
提取码:wces