JdbcTemplate介绍



Spring配置JdbcTemplate
1、配置数据库连接池

    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
          destroy-method="close">
        <property name="url" value="jdbc:mysql:///user_db" />
        <property name="username" value="root" />
        <property name="password" value="123456" />
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    </bean>

2、配置 JdbcTemplate 对象,注入 DataSource

    <!-- JdbcTemplate 对象 -->
    <bean id="JdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <!--注入 dataSource-->
        <property name="dataSource" ref="dataSource"></property>
    </bean>

3、开启注解扫描

<context:component-scan base-package="com.study.spring5"></context:component-scan>

4、service注入dao,dao注入JdbcTemplate

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

操作数据库

//创建sql语句
String sql = "insert into t_book values(?,?,?)";
Object[] args = {book.getUserid(), book.getUsername(), book.getUstatus()};
int rows = jdbcTemplate.update(sql, args);

String sql = "delete from t_book where userid = ?";
int rows = jdbcTemplate.update(sql, userid);

String sql = "update t_book set username = ?,ustatus = ? where userid = ?";
Object[] args = {book.getUsername(), book.getUstatus(), book.getUserid()};
int rows = jdbcTemplate.update(sql, args);


查询结果:单个记录

queryForObject(String sql,Class<T>)

  • 第一个参数:sql 语句
  • 第二个参数:返回类型 Class
String sql = "select count(*) from t_book";
Integer count = jdbcTemplate.queryForObject(sql, Integer.class);


查询结果:对象

queryForObject (String sql, RowMapper<T>rowMapper, rowMapper)

  • 第一个参数:sql 语句
  • 第二个参数:RowMapper 是接口,针对返回不同类型数据,使用这个接口里面实现类完成数据封装
  • 第三个参数:sql 语句值
String sql = "select * from t_book where userid = ?";
Book book = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<Book>(Book.class), id);


查询结果:集合

String sql = "select * from t_book";
List<Book> bookList = jdbcTemplate.query(sql, new BeanPropertyRowMapper<Book>(Book.class));



JdbcTemplate概念

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

使用JdbcTemplate的准备工作

(1)引入相关 jar 包
在这里插入图片描述

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

    <!-- 数据库连接池 -->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
          destroy-method="close">
        <property name="url" value="jdbc:mysql:///user_db" />
        <property name="username" value="root" />
        <property name="password" value="123456" />
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    </bean>

(3)配置 JdbcTemplate 对象,注入 DataSource

    <!-- JdbcTemplate 对象 -->
    <bean id="JdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <!--注入 dataSource-->
        <property name="dataSource" ref="dataSource"></property>
    </bean>

(4)开启注解扫描

    <!--开启注解扫描-->
    <context:component-scan base-package="com.study.spring5"></context:component-scan>

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

BookDaoImpl

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

BookService

@Service
public class BookService {
    //注入dao
    @Autowired
    private BookDao bookDao;
}


操作数据库(增)

1、对应数据库创建实体类
在这里插入图片描述
提供对应的 get 和 set 方法
在这里插入图片描述

2、编写 service 和 dao
BookService

@Service
public class UserService {
    //注入dao
    @Autowired
    private BookDao bookDao;

    //添加方法
    public void add(Book book) {
        bookDao.add(book);
    }
}

BookDaolmpl

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

    //添加的方法,在接口中规范方法,由实现类来完成具体功能
    @Override
    public void add(Book book) {
        //创建sql语句
        String sql = "insert into t_book values(?,?,?)";
        //调用方法实现
        Object[] args = {book.getUserid(), book.getUsername(), book.getUstatus()};
        int rows = jdbcTemplate.update(sql, args);
        System.out.println(rows);
    }
}

3 测试

    @Test
    public void testJdbcTemplate() {
        ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
        UserService userService = context.getBean("userService", UserService.class);
        Book book = new Book();
        book.setUserid(100);
        book.setUsername("Java");
        book.setUstatus("perfect");
        userService.add(book);
    }

在这里插入图片描述

操作数据库 (修改和删除)

修改

    @Override
    public void update(Book book) {
        String sql = "update t_book set username = ?,ustatus = ? where userid = ?";
        Object[] args = {book.getUsername(), book.getUstatus(), book.getUserid()};
        int rows = jdbcTemplate.update(sql, args);
        System.out.println("更新受影响的行数: " + rows);
    }

删除

    @Override
    public void delete(Integer userid) {
        String sql = "delete from t_book where userid = ?";
        int rows = jdbcTemplate.update(sql, userid);
        System.out.println("删除受影响的行数: " + rows);
    }


操作数据库 (查询)

查询返回某个值

UserService

    //查询表中记录数
    public int findCount() {
        return bookDao.selectCount();
    }

queryForObject(String sql,Class<T>)
第一个参数:sql 语句

第二个参数:返回类型 Class

    //查询表中记录数
    @Override
    public int selectCount() {
        String sql = "select count(*) from t_book";
        Integer count = jdbcTemplate.queryForObject(sql, Integer.class);
        return count;
    }

测试

        int count = userService.findCount();
        System.out.println("查询表中记录数: " + count);

在这里插入图片描述

查询返回对象

在这里插入图片描述
1、第一个参数:sql 语句
2、第二个参数:RowMapper 是接口,针对返回不同类型数据,使用这个接口里面实现类完成数据封装
3、第三个参数:sql 语句值

    @Override
    public Book findBookInfo(Integer id) {
        String sql = "select * from t_book where userid = ?";
        Book book = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<Book>(Book.class), id);
        return book;
    }

查询返回集合

    @Override
    public List<Book> findAllBook() {
        String sql = "select * from t_book";
        List<Book> bookList = jdbcTemplate.query(sql, new BeanPropertyRowMapper<Book>(Book.class));
        return bookList;
    }

操作数据库 (批量添加)

    //批量添加
    @Override
    public void batchAddBook(List<Object[]> batchArgs) {
        //创建sql语句
        String sql = "insert into t_book values(?,?,?)";
        int[] rows = jdbcTemplate.batchUpdate(sql, batchArgs);
        System.out.println("受影响的行数: " + Arrays.toString(rows));
    }

测试

        //批量添加
        List<Object[]> list = new ArrayList<>();
        Object[] o1 = {"3", "tjava","a"};
        Object[] o2 = {"4","c++","b"};
        Object[] o3 = {"5","MySQL","c"};
        list.add(o1);
        list.add(o2);
        list.add(o3);
        userService.batchAdd(list);

操作数据库 (批量修改和删除)

修改

    @Override
    public void batchUpdateBook(List<Object[]> batchArgs) {
        //创建sql
        String sql = "update t_book set username = ?,ustatus = ? where userid = ?";
        int[] rows = jdbcTemplate.batchUpdate(sql, batchArgs);
        System.out.println("受影响的行数: " + Arrays.toString(rows));
    }

测试

        List<Object[]> list = new ArrayList<>();
        //数组的顺序要和 sql 的 中的 ? 匹配
        Object[] o1 = {"java0000","a6","3"};
        Object[] o2 = {"c++1111","b7","4"};
        Object[] o3 = {"MySQL0101","c8","5"};
        list.add(o1);
        list.add(o2);
        list.add(o3);
        userService.batchUpdate(list);


删除

    @Override
    public void batchDeleteBook(List<Object[]> batchArgs) {
        String sql = "delete from t_book where userid = ?";
        int[] rows = jdbcTemplate.batchUpdate(sql, batchArgs);
        System.out.println("受影响的行数: " + Arrays.toString(rows));
    }

测试

        List<Object[]> list = new ArrayList<>();
        Object[] o1 = {"3"};
        Object[] o2 = {"4"};
        Object[] o3 = {"5"};
        list.add(o1);
        list.add(o2);
        list.add(o3);
        userService.batchDelete(list);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值