1.项目介绍
基于Spring的xml配置实现账户的CRUD案例
1.1步骤分析
1)准备数据库环境
2)创建java项目,导入坐标
3)编写Account实体类
4)编写AccountDao接口和实现类
5)编写AccountService接口和实现类
6)编写spring核心配置文件
7)编写测试代码
2.项目实现
2.1 准备数据库环境
CREATE DATABASE spring_db;
USE spring_db;
CREATE TABLE account(
#名字,类型,限制
id INT(11) NOT NULL AUTO_INCREMENT,
NAME VARCHAR(32) DEFAULT NULL,
money DOUBLE DEFAULT NULL,
PRIMARY KEY(id)
);
INSERT INTO account(id, NAME, money) VALUES (1, 'tom', 1000), (2, 'jerry', 1000);
2.2 创建java项目,导入坐标(依赖)
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>SpringIOC</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.9</version>
</dependency>
<dependency>
<groupId>commons-dbutils</groupId>
<artifactId>commons-dbutils</artifactId>
<version>1.6</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
</project>
2.3 编写Account类
- Account类
package com.kk.entity;
public class Account {
private Integer id;
private String name;
private double money;
public Integer getId() {
return id;
}
public String getName() {
return name;
}
public double getMoney() {
return money;
}
}
2.4 编写AccountDao接口,AccountDaoImp实现类
使用数据库连接池,进行数据库的增删改查
- AccountDao接口
package com.kk.dao;
import com.kk.entity.Account;
import java.util.List;
public interface AccountDao {
public List<Account> findAll();
public Account findById(Integer id);
public void save(Account account);
public void update(Account account);
public void delete(Integer id);
}
- AccountDaoImp
package com.kk.dao;
import com.kk.entity.Account;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import java.sql.SQLException;
import java.util.List;
public class AccountDaoImp implements AccountDao {
private QueryRunner queryRunner;
public void setQueryRunner(QueryRunner queryRunner){
this.queryRunner = queryRunner;
}
@Override
public List<Account> findAll() {
List<Account> list = null;
String sql = "select * from account";
try{
// 执行sql
list = queryRunner.query(sql, new BeanListHandler<Account>(Account.class));
} catch (SQLException e) {
e.printStackTrace();
}
return list;
}
@Override
public Account findById(Integer id) {
Account account = null;
String sql = "select * from account where id = ?";
try{
account = queryRunner.query(sql, new BeanHandler<Account>(Account.class), id);
} catch (SQLException e) {
e.printStackTrace();
}
return account;
}
@Override
public void save(Account account) {
String sql = "insert into account values(null, ?, ?)";
try{
queryRunner.update(sql, account.getName(), account.getMoney());
} catch(SQLException e){
e.printStackTrace();
}
}
@Override
public void update(Account account) {
String sql = "update account set name=?, money=? where id=?";
try{
queryRunner.update(sql, account.getName(), account.getMoney(), account.getId());
} catch (SQLException e) {
e.printStackTrace();
}
}
@Override
public void delete(Integer id) {
String sql = "delete from account where id = ?";
try{
queryRunner.update(sql, id);
} catch(SQLException e){
e.printStackTrace();
}
}
}
2.5 编写AccountService接口,AccountServiceImp实现类
- AccountService接口
package com.kk.service;
import com.kk.entity.Account;
import java.util.List;
public interface AccountService {
public List<Account> findAll();
public Account findById(Integer id);
public void save(Account account);
public void update(Account account);
public void delete(Integer id);
}
- AccountServiceImp实现类
package com.kk.service;
import com.kk.dao.AccountDao;
import com.kk.entity.Account;
import java.util.List;
public class AccountServiceImp implements AccountService {
// 调用数据库的AccountDao进行crud
private AccountDao accountDao;
public void setAccountDao(AccountDao accountDao){
this.accountDao = accountDao;
}
@Override
public List<Account> findAll() {
return accountDao.findAll();
}
@Override
public Account findById(Integer id) {
return accountDao.findById(id);
}
@Override
public void save(Account account) {
accountDao.save(account);
}
@Override
public void update(Account account) {
accountDao.update(account);
}
@Override
public void delete(Integer id) {
accountDao.delete(id);
}
}
2.6 编写spring核心配置文件
- applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/spring_db"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</bean>
<bean id="queryRunner" class="org.apache.commons.dbutils.QueryRunner">
<constructor-arg name="ds" ref="dataSource"></constructor-arg>
</bean>
<bean id="accountDao" class="com.kk.dao.AccountDaoImp">
<property name="queryRunner" ref="queryRunner"/>
</bean>
<bean id="accountService" class="com.kk.service.AccountServiceImp">
<property name="accountDao" ref="accountDao"/>
</bean>
</beans>
2.7 测试代码
只测试了save,其他相同道理
import com.kk.entity.Account;
import com.kk.service.AccountService;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class ApplicationTest {
@Test
public void test(){
// 1.添加1个账户
Account account = new Account("kk", 123);
// 2.获取spring的上下文环境
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
AccountService accountService = (AccountService) applicationContext.getBean("accountService");
accountService.save(account);
}
}
2.8 优化数据库配置文件
在写dataSource的时候,数据库的信息是写死到配置文件中的,但是实际上有时候会配置其他数据库,所以我们将数据库配置信息都会抽取到jdbc.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/spring_db
jdbc.username=root
jdbc.password=123456
然后再配置文件applicationContext.xml中进行配置
首先引入命名空间和约束路径,
classpath会到当前类的class文件下去找
- applicationContext.xml
<?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"
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">
<context:property-placeholder location="classpath:jdbc.properties"/>
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<bean id="queryRunner" class="org.apache.commons.dbutils.QueryRunner">
<constructor-arg name="ds" ref="dataSource"></constructor-arg>
</bean>
<bean id="accountDao" class="com.kk.dao.AccountDaoImp">
<property name="queryRunner" ref="queryRunner"/>
</bean>
<bean id="accountService" class="com.kk.service.AccountServiceImp">
<property name="accountDao" ref="accountDao"/>
</bean>
</beans>
测试结果
(糟糕没有添加name为unique)