问题1
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'bookService': Unsatisfied dependency expressed through field 'bookDao'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.atguigu.spring5.dao.BookDao' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
曾报了类似这样的一个错误,经过排查,是在IMPL层实现类前漏写了
@Repository
它一般用于DAO类
Spring Repository注释是@Component注释的一种特殊形式,因此Spring 框架会通过类路径扫描自动检测Spring Repository类。
Spring Repository is very close to DAO pattern where DAO classes are responsible for providing CRUD operations on database tables. However, if you are using Spring Data for managing database operations, then you should use Spring Data Repository interface.
Spring Repository非常接近DAO模式,其中DAO类负责对数据库表提供CRUD操作。 但是,如果您使用Spring Data来管理数据库操作,则应该使用Spring Data Repository接口。
问题2
查询语句在控制台的参数为空,但数据库是已经得到了修改
我在这里曾犯了两次错误,首先在运用
String sql="select*from t_spring where user_id=? ";这种语句的时候,一定要保持数据库的列名称与Dao层类对象属性的名字保持一致!不然将无法产生正确的映射。
第二次则是表的名称写错,根本无法查询正确的值,也可以从这里推出,如果数据库与Dao层的属性的类型不一致,也会返回null;
下面是利用JDBCTemplate对数据库进行增删改查的一系列基本操作,在此做个记录
Book对象
public class Book {
private String userId;
private String username;
private String ustatus;
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getUstatus() {
return ustatus;
}
public void setUstatus(String ustatus) {
this.ustatus = ustatus;
}
@Override
public String toString() {
return "Book{" +
"userId='" + userId + '\'' +
", username='" + username + '\'' +
", ustatus='" + ustatus + '\'' +
'}';
}
Dao层接口以及实现类
public interface BookDao {
//添加的方法
void add(Book book);
void update(Book book);
void delete(String id);
//查询总行数
int selectCount();
Book findOne(String id);
//查询返回集合
List<Book> findAllBook();
//批量添加
void batchAddBook(List<Object[]> batchArgs);
//批量更新
void batchUpdateBook(List<Object[]> batchArgs);
//批量删除
void batchDeleteBook(List<Object[]> batchArgs);
}
@Repository
public class BookDaoImpl implements BookDao {
//注入JDBCTemplate,将xml文件中的JDBCTEMPLATE注入进来
@Autowired
private JdbcTemplate jdbcTemplate;
//添加的方法
@Override
public void add(Book book) {
String sql="insert into t_spring values(?,?,?)";
int update=jdbcTemplate.update(sql,book.getUserId(),book.getUsername(),book.getUstatus());
System.out.println(update);//输出影响行数
}
@Override
public void update(Book book) {
String sql="update t_spring set username=?,ustatus=? where user_id=?";
int update=jdbcTemplate.update(sql,book.getUsername(),book.getUstatus(),book.getUserId());
System.out.println(update);//输出影响行数
}
@Override
public void delete(String id) {
String sql="delete from t_spring where user_id=?";
int update=jdbcTemplate.update(sql,id);//无返回值填参数
System.out.println(update);//输出影响行数
}
@Override
//看表内有多少行的数据
public int selectCount() {
String sql="select count(*) from t_spring ";
Integer count=jdbcTemplate.queryForObject(sql,Integer.class);//返回值的引用类型.class
return count;
}
@Override
public Book findOne(String id) {
String sql="select*from t_spring where user_id=? ";
//调用方法
Book book=jdbcTemplate.queryForObject(sql,new BeanPropertyRowMapper<Book>(Book.class),id);
System.out.println(book);
return book;
}
@Override
public List<Book> findAllBook() {
String sql = "select * from t_spring";
//调用方法
List<Book> bookList = jdbcTemplate.query(sql, new BeanPropertyRowMapper<Book>(Book.class));
return bookList;
}
@Override
public void batchAddBook(List<Object[]> batchArgs) {//即将多组数据一同放在batchArgs中,再一条条执行sql语句
String sql = "insert into t_spring values(?,?,?)";
int[] ints = jdbcTemplate.batchUpdate(sql, batchArgs);
System.out.println(Arrays.toString(ints));
}
@Override
public void batchUpdateBook(List<Object[]> batchArgs) {
String sql = "update t_spring set username=?,ustatus=? where user_id=?";
int[] ints = jdbcTemplate.batchUpdate(sql, batchArgs);
System.out.println(Arrays.toString(ints));
}
@Override
public void batchDeleteBook(List<Object[]> batchArgs) {
String sql = "delete from t_spring where user_id=?";
int[] ints = jdbcTemplate.batchUpdate(sql, batchArgs);
System.out.println(Arrays.toString(ints));
}
}
Service层
@Service
public class BookService {
//注入Dao
@Autowired
private BookDao bookDao;
//添加方法
public void addBook(Book book){
bookDao.add(book);
}
public void updateBook(Book book){
bookDao.update(book);
}
public void deleteBook(String id){
bookDao.delete(id);
}
//查询表记录数
public void findCount(){
bookDao.selectCount();
}
public void FindOne(String id){
bookDao.findOne(id);
}
//查询返回集合
public List<Book> findAll(){
return bookDao.findAllBook();
}
//批量插入
public void batchAdd(List<Object[]> batchArgs){
bookDao.batchAddBook(batchArgs);
}
//批量修改
public void batchUpdate(List<Object[]> batchArgs){
bookDao.batchUpdateBook(batchArgs);
}
public void batchDelete(List<Object[]> batchArgs) {
bookDao.batchDeleteBook(batchArgs);
}
}
TEST测试方法
@Test
public void testJdbcTemplate(){
ApplicationContext context=new ClassPathXmlApplicationContext("bean1.xml");
BookService bookService=context.getBean("bookService",BookService.class);
//添加操作
/* Book book=new Book();
book.setUserId("2");
book.setUsername("java");
book.setUstatus("a");
bookService.addBook(book);*/
//全部查询
/* List<Book> list=bookService.findAll();
System.out.println(list);*/
//更新某一行
/*book.setUserId("1");
book.setUsername("wc");
book.setUstatus("GOOD");
bookService.updateBook(book);
//查询数据库所有行数
bookService.findCount();*/
//查找特定一行
/* bookService.FindOne("1");*/
//删除特定一行
/* String id="1";
bookService.deleteBook(id);*/
//批量添加
/* 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);*/
//批量修改
/* List<Object[]> batchArgs = new ArrayList<>();
Object[] o1 = {"java0909","a3","3"};
Object[] o2 = {"c++1010","b4","4"};
Object[] o3 = {"MySQL1111","c5","5"};
batchArgs.add(o1);
batchArgs.add(o2);
batchArgs.add(o3);
//调用方法实现批量修改
bookService.batchUpdate(batchArgs);*/
//批量删除
List<Object[]> batchArgs = new ArrayList<>();
Object[] o1 = {"3"};
Object[] o2 = {"4"};
batchArgs.add(o1);
batchArgs.add(o2);
//调用方法实现批量删除
bookService.batchDelete(batchArgs);
}
}
以及需要配置的XML文件 bean1(Spring)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
<!-- 组件扫描 -->
<context:component-scan base-package="com.atguigu"></context:component-scan>
<!-- 数据库连接池 -->
<!-- 配置连接池 -->
<!-- DruidDataSource dataSource = new DruidDataSource(); -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
destroy-method="close">
<property name="url" value="jdbc:mysql://localhost:3306/book" />
<property name="username" value="root" />
<property name="password" value="wc123456" />
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver" />
</bean>
<!-- JdbcTemplate对象 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<!--注入dataSource-->
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--创建事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!--注入数据源-->
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--开启事务注解-->
<tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>
配置的jar包,我要去学一些maven配置了,以后要学的更多,jar包导入还是比较累人的,后续的maven心得也会后续更新