JdbcTemplate

发布时间 2023-06-11 20:40:53作者: 郭培鑫同学

知识点1:准备

导入相关jar包;

解释:

1.第一个框是mysql连接池和连接

2.第二个框是spring里的jar引入

  • orm是其他框架,spring结合用
  • tx是处理事务的

xml配置

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

配置JdbcTemplate对象,注入DataSource


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

  1. 开启扫描
    <!--开启组件扫描-->
    <context:component-scan base-package="com.gudoaxia.jdbcTemplate"></context:component-scan>
  1. service类
@Service
public class BookService {

    //注入dao
    @Autowired
    private BookDao bookDao;
}
  1. dao类
@Repository
public interface BookDao {

}

@Repository
public class BookDaoImpl implements BookDao{

    //注入JdbcTemplate
    @Autowired
    private JdbcTemplate jdbcTemplate;
}

知识点2:添加

知识点3:修改

知识点4:查询

知识点5:批量添加

完整代码

server层

@Service
public class BookService {

    //注入dao
    @Autowired
    private BookDao bookDao;

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

    //修改的方法
    public void updateBook(Book book){
        bookDao.updateBook(book);
    }
    //删除的方法
    public void deleteBook(String id){
        bookDao.delete(id);
    }
    //4. 查询返回某个值的方法:表记录数
    public int selectCount(){
       return bookDao.selectCount();
    }
    //5. 查询返回对象
    public Book findOne(String id){
        return bookDao.findBookInfo(id);
    }
    //6. 查询返回集合
    public List<Book> findAllBook(){
        return bookDao.findAllBook();
    }
    //7. 批量操作添加
    public  void batchAdd(List<Object[]> batchArgs){
         bookDao.batchAddBook(batchArgs);
    }
}

Dao层

public interface BookDao {
    //添加的方法
    void add(Book book);

    void updateBook(Book book);

    void delete(String id);

    int selectCount();

    Book findBookInfo(String id);

    List<Book> findAllBook();

    void batchAddBook(List<Object[]> batchArgs);
}
@Repository
public class BookDaoImpl implements BookDao{

    //注入JdbcTemplate
    @Autowired
    private JdbcTemplate jdbcTemplate;

    //1. 添加的方法
    @Override
    public void add(Book book) {

        String sql = "insert into t_book values(?,?,?)";
        Object[] args = {book.getUserId(), book.getUserName(), book.getUserStatus()};

        int update = jdbcTemplate.update(sql, args);
        System.out.println("添加成功,添加了"+update+"行");
    }
    //2. 修改的方法
    @Override
    public void updateBook(Book book) {

        String sql = "update t_book set name=?,status=? where id=?";
        Object[] args = {book.getUserName(),book.getUserStatus(),book.getUserId()};
        int update = jdbcTemplate.update(sql, args);
        System.out.println("修改成功,修改了"+update+"行");

    }
    //3. 删除的方法
    @Override
    public void delete(String id) {
        String sql ="delete from t_book where id=?";
        jdbcTemplate.update(sql,id);
    }
    //4. 查询返回某个值的方法
    @Override
    public int selectCount() {
        String sql ="select count(*) from t_book";
        Integer count = jdbcTemplate.queryForObject(sql, Integer.class);
        return count;
    }
    //5. 查询返回对象
    @Override
    public Book findBookInfo(String id) {
        String sql = "select id as userId,name as userName,status as userStatus from t_book where id=?";
        //第二参数:RowMapper接口,针对返回不同数据类型数据,用于数据封装,即封装sql语句。
        Book book = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<Book>(Book.class), id);
        return book;
    }
    //6. 查询返回集合
    @Override
    public List<Book> findAllBook() {
        String sql ="select id as userId,name as userName,status as userStatus from t_book";
        List<Book> bookList = jdbcTemplate.query(sql, new BeanPropertyRowMapper<Book>(Book.class));

        return bookList;
    }
    //7. 批量操作
    @Override
    public void batchAddBook(List<Object[]> batchArgs) {
        String sql ="insert into t_book values(?,?,?)";
        int[] ints = jdbcTemplate.batchUpdate(sql,batchArgs);
        System.out.println(Arrays.toString(ints));
    }
}

测试

public class testJdbcDemo {

    @Test
    public void testJdbc(){
        ApplicationContext context =
                new ClassPathXmlApplicationContext("bean.xml");
        BookService bookService = context.getBean("bookService", BookService.class);
//        //添加
//        Book book = new Book();
//        book.setUserId("2");
//        book.setUserName("Spring6");
//        book.setUserStatus("a");
//        bookService.addBook(book);

//        //修改:根据id修改
//        Book book2 = new Book();
//        book2.setUserId("1");
//        book2.setUserName("JavaWeb");
//        book2.setUserStatus("a");
//        bookService.updateBook(book2);

//        //删除
//        bookService.deleteBook("2");
//          //查询返回某个值
//        int i = bookService.selectCount();
//        System.out.println("返回查询数量:"+i);
//        //查询返回对象
//        Book one = bookService.findOne("1");
//        System.out.println(one);
//        //查询返回集合
//        List<Book> allBook = bookService.findAllBook();
//        System.out.println(allBook);

        //批量添加
        ArrayList<Object[]> batchArgs = new ArrayList<>();
        Object[] o1 = {"2","Java","a"};
        Object[] o2 = {"3","C++","a"};
        Object[] o3 = {"4","Mysql","a"};
        batchArgs.add(o1);
        batchArgs.add(o2);
        batchArgs.add(o3);

        bookService.batchAdd(batchArgs);
    }
}

总结:

  1. 使用JdbcTemplate准备工作:
  • jar包,德鲁伊连接池,xml的jdbcTemplate的dataSource注入
  1. crud环节:
  • 添加:使用setX方法添加;
  • 修改:根据id修改;
  • 删除:根据id删除;
  • 查询:查询某个值;查询获取某个对象;查询获取多个对象;
  • 批量增加:batchUpdate(sql,batchArgs):batchArgs为Object类型的集合;
  1. 在server层编写方法,对外部暴露调用;在server层的方法实际调用的是:dao层接口的实现类的方法,具体的业务逻辑在实现类中具体编写。
JdbcTemplate 方法 参数说明
添加 update(sql, args) args占位符
修改 update(sql, args) args占位符
删除 update(sql,id) args占位符
查询count* queryForObject(sql, Integer.class) 第二参数为查询返回类型类
查询一条记录 queryForObject(sql, new BeanPropertyRowMapper(Book.class), id 第二参数为sql数据封装
查询多条记录 query(sql, new BeanPropertyRowMapper(Book.class)) 第二参数为sql数据封装
批量添加 batchUpdate(sql,batchArgs) 第二参数为要批量添加的行行记录,通常为数组类型的集合。

debug


准备环节

bug1:

问题:使用注解autowired 注入jdbctemplate , 代码爆红,无法注入的解决。

解决思路:可能是xml配置文件的注入dataSource出错,在<property name="dataSource" ref="dataSource"></property>上的光标XML tag has empty body,说明这里出错。

解决:改为<property name="dataSource" ref="dataSource" />

总结:idea太过智能便捷,导致导入标签错误。这里应该使用单标签,进行获取jdbctemplate 对象。