1 使用Spring JDBC访问数据库
- database模块是为了连接数据库,所以在database的pom文件里添加数据库操作的依赖包(从上到下依次数据库连接池,mysql驱动,springJDBC)
<dependencies>
<!-- https://mvnrepository.com/artifact/commons-dbcp/commons-dbcp -->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.45</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>
2介绍右边idea里集成的前端工具
1)(点击右边的database)
2) 使用
1 +->数据源 ->Mysql
2 起名字 之后链接到自己已有的数据库上
3 检查mysql连接驱动程序
{
class : com.mysql.jdbc.Driver
Driver files : MySQL Connect/J ver.5.1.45
}
如果显示invalid timezone 把time什么的utf改成GMD
1 在右边数据库表右键SQL Genrator生成sql脚本
2 在resources处新建文件命名javaee.sql(javaee为数据库名称),保存sql语句
越来越多业务,每创建一个表都在这里保存一下
3完成DAO模式
1)把上节课写的补充完整,具体做法新建pagage DAO和Model和Bus,把book放到model里
2)数据库配置信息新加到resources里,命名mysql.properties,
driverClassName = com.mysql.jdbc.Driver
mysql.url = jdbc:mysql://localhost:3306/table
mysql.userName = root
mysql.password = 123456
3)在database-context.xml文件配置数据库连接
加载文件
<!--加载数据库访问配置-->
<context:property-placeholder location="mysql.properties"/>
<!--配置数据源-->
<!--引用后应该javaee.sql所有变量都被引用过,都变蓝-->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close"
p:driverClassName="${driverClassName}"
p:url="${mysql.url}"
p:username="${mysql.userName}"
p:password="${mysql.password}"/>
<!--先声明数据源,然后再配置如下,说明要去这个数据源找,所以配置jdbc模板之前要先设置数据源-->
<bean id="jdbcTemlate" class="org.springframework.jdbc.core.JdbcTemplate"
p:dataSource-ref="dataSource"/>
至此spring访问数据库的大环境搭好了
4完整实现·DAO
1)再DAO包下定义接口,定义所有增删改查功能
package org.example.DAO;
import org.example.Model.Book;
import java.util.List;
public interface BookDAO {
void insertBook(Book book);
void modifyBook(Book book);
List<Book> queryAll();
void insertAll(List<Book> bookList);
void deleteBook(Book book);
void deleteAll(List<Book> bookList);
void deleteById(String id);
Book queryOneBook(Book book);
Book queryOneBookById(String id);
}
2)使用接口-抽象-实现模式,所以先在DAO建立接口实现类AbstractBookDAO 继承接口BookDAO
在这个抽象类定义所有增删改查所共用的一些对象,然后给出所有增删改查的默认实现
package org.example.DAO;
import org.example.Model.Book;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import javax.annotation.Resource;
import java.util.List;
public class AbstractBookDAO implements BookDAO{
List<Book>books;
JdbcTemplate jdbcTemplate;
@Resource(name="list")
public void setBooks(List<Book> books) {
this.books = books;
}
@Autowired
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
@Override
public void insertBook(Book book) {
}
@Override
public void modifyBook(Book book) {
}
@Override
public List<Book> queryAll() {
return null;
}
@Override
public void insertAll(List<Book> bookList) {
}
@Override
public void deleteBook(Book book) {
}
@Override
public void deleteAll(List<Book> bookList) {
}
@Override
public void deleteById(String id) {
}
@Override
public Book queryOneBook(Book book) {
return null;
}
@Override
public Book queryOneBookById(String id) {
return null;
}
}
jdbc已经在xml里配置过了,可以在抽象类中直接装配@Autowired
list还得去配置文件里说明一下,然后才可以@Resource(name = “list”)
<!--配置集合对象-->
<bean id="list" class="java.util.ArrayList" scope="prototype"/>
然后自动生成接口方法
DAO设计完成
下来写具体实现类
DAO下新建class
package org.example.DAO;
import org.example.Model.Book;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.RowMapper;
import java.util.List;
public class BookDAOImpl extends AbstractBookDAO{
@Override
public void insertBook(Book book) {
super.insertBook(book);
String INSERT_BOOK="INSERT INTO book(isdn,name,price) VALUES(?,?,?)";
Object[]args={book.getIsdn(),book.getName(),book.getPrice()};
jdbcTemplate.update(INSERT_BOOK,args);
//完成插入数据库的操作
}
@Override
public void modifyBook(Book book) {
super.modifyBook(book);
String MODIFY_BOOK="update book set price=? where isdn=?";
Object []args={book.getPrice(),book.getIsdn()};
jdbcTemplate.update(MODIFY_BOOK,args);
}
@Override
public List<Book> queryAll() {
String QUERY_ALL_BOOK="select * from book";
RowMapper<Book> rowMapper=new BeanPropertyRowMapper<~>(Book.class);
books = jdbcTemplate.query(QUERY_ALL_BOOK,rowMapper);
return books;
}
}
完成jdbc的装配,下来该业务了
5Business业务
1)新建类,命名SaleService
2)创建一个对象BookDAO bookDAO,自动生成set方法
3)接口实现类建立联系,所以在BookDAOImpl里public类外@Repository(value= “bookDaoImpl”),即把实现类声明成组件,并取个名字
@Repository(value = "bookDaoImpl")
//不要忘了!!,写到BookDAOImpl类外
4)自动装配@Autowired 并说明哪个实现类@Quakifier(value = “bookDaoImpl”),完成接口和实现类的装配
package org.example.Bussiness;
import org.example.DAO.BookDAO;
import org.example.Model.Book;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import java.util.List;
public class SaleService {
BookDAO bookDAO;
@Autowired
@Qualifier(value = "bookDaoImpl")
public void setBookDAO(BookDAO bookDAO) {
this.bookDAO = bookDAO;
}
public void insert(Book book){
bookDAO.insertBook(book);
}
public void onSale(float sale){
List<Book>bookList=bookDAO.queryAll();
for(Book b:bookList){
b.setPrice(b.getPrice()*sale);
bookDAO.modifyBook(b);
}
}
}
6单元测试
1)回到beantest,实现大甩卖业务,所以SaleService service;同时加上注解@Autowired
2)提示报错,说不能实现自动装配,在SaleService类前加上注解@Service实现注解
3)写插入单元测试函数
@Test
public void insert(){
book.setIsdn("007");
book.setPrice((float) 4.32);
book.setName("美术");
service.insert(book);
}
4)右键运行,应该显示一个pass,且数据库中有这条数据
5)测试大甩卖
@Test
public void onSale(){
service.onSale(0.5f);//5折
}