目录
1、基于xml的springioc
Account
package account;
public class Account {
private int id;
private String name;
private float money;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public float getMoney() {
return money;
}
public void setMoney(float money) {
this.money = money;
}
@Override
public String toString() {
return "Account [id=" + id + ", name=" + name + ", money=" + money + "]";
}
}
AccountDaoImpl
package account;
import java.util.List;
public class AccountDaoImpl implements IAccountDao{
private JdbcUtils jdbc;
public void setJdbc(JdbcUtils jdbc) {
this.jdbc = jdbc;
}
@Override
public void save(Account account) {
jdbc.update("insert into account (name,money) values(?,?)", account.getName(),account.getMoney());
}
@Override
public void update(Account account) {
jdbc.update("update account set name = ?,money = ? where id = ?",
account.getName(),account.getMoney(), account.getId());
}
@Override
public void delete(int id) {
jdbc.update("delete from account where id = ?", id);
}
@Override
public Account findById(int id) {
Account account = jdbc.query("select * from account where id = ?", id);
return account;
}
@Override
public List<Account> findAll() {
List<Account> list = jdbc.query("select * from account");
return list;
}
}
AccountServiceImpl
package account;
import java.util.List;
//业务层实现类
public class AccountServiceImpl implements IAccountService{
private IAccountDao ad;
public void setAd(IAccountDao ad) {
this.ad = ad;
}
@Override
public void save(Account account) {
ad.save(account);
}
@Override
public void update(Account account) {
ad.update(account);
}
@Override
public void delete(int id) {
ad.delete(id);
}
@Override
public Account findById(int id) {
return ad.findById(id);
}
@Override
public List<Account> findAll() {
return ad.findAll();
}
}
JdbcUtils
package account;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ParameterMetaData;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import org.springframework.stereotype.Component;
public class JdbcUtils {
private DatabaseUtils data;
public void setData(DatabaseUtils data) {
this.data = data;
}
public Connection getConnection() throws SQLException {
return data.getConnection();
}
//增、删、改操作
public int update(String sql,Object ...params){
Connection conn = null;
PreparedStatement ps = null;
int status = 0;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
conn = getConnection();
ps = conn.prepareStatement(sql);
ParameterMetaData pmd = ps.getParameterMetaData();
int count = pmd.getParameterCount();
if(count > 0) {
if(params == null) {
throw new IllegalArgumentException("没有参数");
}
if(params.length != count) {
throw new IllegalArgumentException("参数个数不正确");
}
for(int i=0; i<params.length; i++) {
ps.setObject(i+1, params[i]);
}
}
status = ps.executeUpdate();
}catch (Exception e) {
e.printStackTrace();
}finally {
close(conn,ps,null);
}
return status;
}
//查询操作
public <T> T query(String sql,Object ...params){
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
Object obj = null;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
conn = getConnection();
ps = conn.prepareStatement(sql);
if(params.length==0) {
rs = ps.executeQuery();
List<Account> list = new ArrayList<>();
while(rs.next()) {
Account account = new Account();
account.setId(rs.getInt("id"));
account.setName(rs.getString("name"));
account.setMoney(rs.getFloat("money"));
list.add(account);
}
obj = list;
}else {
ps.setObject(1, params[0]);
rs = ps.executeQuery();
if(rs.next()) {
Account account = new Account();
account.setId(rs.getInt("id"));
account.setName(rs.getString("name"));
account.setMoney(rs.getFloat("money"));
obj = account;
}
}
}catch (Exception e) {
e.printStackTrace();
}finally {
close(conn,ps,rs);
}
return (T) obj;
}
//释放资源
public static void close(Connection conn, PreparedStatement ps, ResultSet rs) {
if(conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
conn = null;
}
if(ps != null) {
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
ps = null;
}
if(rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
rs = null;
}
}
}
DatabaseUtils
package account;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DatabaseUtils {
private String url;
private String username;
private String password;
public void setUrl(String url) {
this.url = url;
}
public void setUsername(String username) {
this.username = username;
}
public void setPassword(String password) {
this.password = password;
}
public Connection getConnection() throws SQLException{
return DriverManager.getConnection(url, username, password);
}
}
bean.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="accountService" class="account.AccountServiceImpl">
<property name="ad" ref="accountDao"></property>
</bean>
<!-- 持久层 -->
<bean id="accountDao" class="account.AccountDaoImpl">
<property name="jdbc" ref="j"></property>
</bean>
<!-- 数据库工具类 -->
<bean id="j" class="account.JdbcUtils">
<property name="data" ref="d"></property>
</bean>
<bean id="d" class="account.DatabaseUtils">
<property name="url" value="jdbc:mysql://localhost:3306/my?serverTimezone=UTC"></property>
<property name="username" value="root"></property>
<property name="password" value="mysql"></property>
</bean>
</beans>
AccountTest
package account;
import java.util.List;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class AccountTest {
private ApplicationContext ac = new ClassPathXmlApplicationContext("bean3.xml");
private IAccountService as = ac.getBean("accountService", IAccountService.class);
@Test
public void save() {
Account account = new Account();
account.setName("dd");
account.setMoney(2000);
as.save(account);
System.out.println("保存成功");
findAll();
}
@Test
public void update() {
Account account = new Account();
account.setId(4);
account.setName("ee");
account.setMoney(3000);
as.update(account);
System.out.println("修改成功");
findAll();
}
@Test
public void delete() {
as.delete(4);
System.out.println("删除成功");
findAll();
}
@Test
public void findById() {
Account account = as.findById(1);
System.out.println(account);
}
@Test
public void findAll() {
List<Account> list = as.findAll();
for(Account a : list) {
System.out.println(a.getId()+" "+a.getName()+" "+a.getMoney());
}
}
}
2、基于注解的springioc
bean.xml
<context:component-scan base-package="account"></context:component-scan>
<bean id="j" class="account.JdbcUtils">
<property name="data" ref="d"></property>
</bean>
<bean id="d" class="account.DatabaseUtils">
<property name="url" value="jdbc:mysql://localhost:3306/my?serverTimezone=UTC"></property>
<property name="username" value="root"></property>
<property name="password" value="mysql"></property>
</bean>
3、解决纯注解改造的问题
@Configuration:表示当前类是spring的配置类,相当于bean.xml。当加载该类的包时,同时没有把它写入到AnnotationConfigApplicationContext中,必须写,其他情况可以不写
@Bean:把当前方法的返回值作为bean对象注入到spring容器中,name:指定bean的id
@ComponentScan:指定扫描的包
此时不在需要bean.xml
SpringConfig
package account;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan("account")
public class SpringConfig {
@Bean(name = "jdbcUtils")
public JdbcUtils createJdbc() {
return new JdbcUtils();
}
@Bean(name = "data")
public DatabaseUtils createData() {
DatabaseUtils data = new DatabaseUtils();
data.setUrl("jdbc:mysql://localhost:3306/my?serverTimezone=UTC");
data.setUsername("root");
data.setPassword("mysql");
return data;
}
}
@Import(JdbcConfig):导入其它的配置类
@PropertySource("jdbcConfig.properties"):导入配置文件
package account;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
//@Configuration
public class JdbcConfig {
@Bean(name = "jdbcUtils")
public JdbcUtils createJdbc() {
return new JdbcUtils();
}
@Bean(name = "data")
public DatabaseUtils createData() {
DatabaseUtils data = new DatabaseUtils();
data.setUrl("jdbc:mysql://localhost:3306/my?serverTimezone=UTC");
data.setUsername("root");
data.setPassword("mysql");
return data;
}
}