JDBCTemplate
1、JDBCTemplate(概念和准备)
Ⅰ、什么是JDBCTemplate
(1)Spring框架对JDBC进行封装,使用JDBCTemplate方便实现对数据库操作
Ⅱ、准备工作
(1)引入相关的依赖
(2)在spring文件中配置数据库连接池
附:jdbc.properties配置文件:
prop.driverClass=com.mysql.cj.jdbc.Driver
prop.url=jdbc:mysql://localhost:3306/javavidea
prop.userName=root
prop.password=123456
<!--配置连接池-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${prop.driverClass}"></property>
<property name="url" value="${prop.url}"></property>
<property name="username" value="${prop.userName}"></property>
<property name="password" value="${prop.password}"></property>
</bean>
(3)配置JDBCTemplate对象,注入DataSource
<!-- JdbcTemplate对象-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<!-- 注入dataSource-->
<property name="dataSource" ref="dataSource"></property>
</bean>
(4)创建service类,创建dao类,在dao注入JDBCTemplate对象
①配置文件中,加入组件扫描
<!--组件扫描-->
<context:component-scan base-package="com.company"></context:component-scan>
- Service
@Service
public class BookService {
//注入dao
@Autowired
private BookDao bookdao;
}
- Dao
@Repository
public class BookDaoImpl implements BookDao {
//注入JdbcTemplate
@Autowired
private JdbcTemplate jdbcTemplate;
}
2、JdbcTemplate操作数据库
2.1 、添加
Ⅰ、对应数据库创建实体类
public class User {
private String uesrname;
private String password;
private String email;
public String getUesrname() {
return uesrname;
}
public void setUesrname(String uesrname) {
this.uesrname = uesrname;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
Ⅱ、编写service和dao
①在dao进行数据库添加操作
②在JdbcTemplate对象里面update方法实现添加操作
- 第一个参数:sql语句
- 第二个参数:可变参数,设置sql语句值
import com.company.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
@Repository
public class BookDaoImpl implements BookDao {
//注入JdbcTemplate
@Autowired
private JdbcTemplate jdbcTemplate;
//添加的方法
@Override
public void add(User user) {
//1、创建sql语句
String sql = "insert into t_user values(?,?,?)";
//2、调用实现方法
Object[] args = {user.getUesrname(), user.getPassword(), user.getEmail()};
int update = jdbcTemplate.update(sql, args);
//或不要数组 直接这样写
// int update = jdbcTemplate.update(sql, user.getUesrname(), user.getPassword(), user.getEmail());
System.out.println(update);
}
}
③测试
@Test
public void testJDBC(){
ApplicationContext context =
new ClassPathXmlApplicationContext("bean12.xml");
BookService bookService = context.getBean("bookService", BookService.class);
User user = new User();
user.setUsername("yjh");
user.setPassword("123456");
user.setEmail("13@qq.com");
bookService.addBook(user);
}
2.2、修改和删除
①修改
@Override
public void update(User user) {
//1、创建sql语句
//language = Mysql
String sql = "update t_user1 set username = ? ,password = ? where email = ? ";
//2、调用实现方法
Object[] args = {user.getUsername(), user.getPassword(), user.getEmail()};
int update = jdbcTemplate.update(sql, args);
//或不要数组 直接这样写
// int update = jdbcTemplate.update(sql, user.getUesrname(), user.getPassword(), user.getEmail());
System.out.println(update);
}
②删除
//删除
@Override
public void delete(String email) {
//1、创建sql语句
//language = Mysql
String sql = "delete from t_user1 where email = ? ";
int update = jdbcTemplate.update(sql, email);
//或不要数组 直接这样写
// int update = jdbcTemplate.update(sql, user.getUesrname(), user.getPassword(), user.getEmail());
System.out.println(update);
}
2.3、查询
- 查询返回某个值
- 查询返回对象
- 查询返回集合
Ⅰ、查询返回某个值
①查询表里有多少条记录,返回某个值
②使用JdbcTemplate实现
- 第一个参数:sql与
- 第二个参数:返回类型的Class
//查询记录数
@Override
public int selectCount() {
String sql = "select count(*) from t_user1";
Integer integer = jdbcTemplate.queryForObject(sql, Integer.class);
return integer ;
}
Ⅱ、查询返回对象
①场景:查询图书详情
②JdbcTemplate实现
- 第一个参数:sql语句
- 第二个参数:RowMapper,是一个接口返回不同类型的数据使用这个接口的实现类可以完成对数据的封装
- 第三个参数:sql语句中 ?中的值
//查询返回对象
@Override
public User findBookInfo(String email) {
String sql = "select * from t_user1 where email = ?";
User user = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<User>(User.class), email);
return user;
}
Ⅲ、查询返回集合
①场景:查询图书列表分页
②调用JdbcTemplate模板实现
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jiELDAsF-1633345576590)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20210425195408504.png)]
- 第一个参数:sql语句
- 第二个参数:RowMapper,是一个接口返回不同类型的数据使用这个接口的实现类可以完成对数据的封装
- 第三个参数:sql语句值
2.4、批量操作
Ⅰ、批量操作:操作表内多条记录
Ⅱ、JdbcTemplate实现批量操作
- 第一个参数:sql语句
- 第二个参数:List集合,表示添加多少条数据的记录
//批量添加
@Override
public void batchAddBook(List<Object[]> batchArgs) {
String sql = "insert into t_user1 values (?,?,?) ";
int[] ints = jdbcTemplate.batchUpdate(sql, batchArgs);
System.out.println(Arrays.toString(ints));
}
2.5、批量修改和删除
Ⅰ、
//批量修改
@Override
public void batchUpdateBook(List<Object[]> batchArgs) {
String sql = "update t_user1 set username = ? ,password = ? where email = ? ";
int[] ints = jdbcTemplate.batchUpdate(sql, batchArgs);
System.out.println(Arrays.toString(ints));
}
测试
List<Object[]> batchArgs = new ArrayList<>();
Object[] o1 = {"javac","11111","sdd"};
Object[] o2 = {"pythonC","15151","dada"};
Object[] o3 = {"C","dfafa","afaf"};
batchArgs.add(o1);
batchArgs.add(o2);
batchArgs.add(o3);
//调用批量修改方法
bookService.batchUpdate(batchArgs);
Ⅱ、删除
//批量删除
@Override
public void datchDeleteBook(List<Object[]> batchArgs) {
String sql = "delete from t_user1 where email = ? ";
int[] ints = jdbcTemplate.batchUpdate(sql, batchArgs);
System.out.println(Arrays.toString(ints));
}
测试
List<Object[]> batchArgs = new ArrayList<>();
Object[] o1 = {"sdd"};
Object[] o2 = {"dada"};
Object[] o3 = {"afaf"};
batchArgs.add(o1);
batchArgs.add(o2);
batchArgs.add(o3);
//调用批量修改方法
bookService.datchDelete(batchArgs);