#JdbcDaoSupport #提取多个dao的公共代码 @FDDLC
项目结构:
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>P035_JdbcDaoSupport</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.16</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.1.8.RELEASE</version> </dependency> <!--注意:spring-jdbc和spring-context有一部分依赖相同,易导致冲突,因此要让二者版本相同--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.1.8.RELEASE</version> </dependency> </dependencies> </project>
MySQL数据库:
database:test port:3306 table:id_name
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 class="org.springframework.jdbc.datasource.DriverManagerDataSource" id="dataSource"> <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"></property> <property name="url" value="jdbc:mysql://localhost:3306/test?characterEncoding=UTF8&serverTimezone=Asia/Shanghai"></property> <property name="username" value="root"></property> <property name="password" value="123456"></property> </bean> <!--<bean class="org.springframework.jdbc.core.JdbcTemplate" id="template"> <property name="dataSource" ref="dataSource"></property> </bean>--> <bean class="cn.liuxingchang.dao.impl.AccountDaoImplMy" id="accountDao"> <!--<property name="jdbcTemplate" ref="template"></property>--> <property name="dataSource" ref="dataSource"></property> </bean> </beans>
Account.java的内容:
package cn.liuxingchang.domain; import java.io.Serializable; public class Account implements Serializable { private Integer id; private String name; private Double money; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Double getMoney() { return money; } public void setMoney(Double money) { this.money = money; } @Override public String toString() { return "Account{" + "id=" + id + ", name='" + name + '\'' + ", money=" + money + '}'; } }
AccountDao.java的内容:
package cn.liuxingchang.dao; import cn.liuxingchang.domain.Account; public interface AccountDao { Account findAccountById(Integer id); Account findAccountByName(String name); void update(Account account); }
AccountDaoImpl.java的内容:
package cn.liuxingchang.dao.impl; import cn.liuxingchang.dao.AccountDao; import cn.liuxingchang.domain.Account; import org.springframework.jdbc.core.BeanPropertyRowMapper; import org.springframework.jdbc.core.support.JdbcDaoSupport; import java.util.List; //public class AccountDaoImplMy extends JdbcDaoSupport implements AccountDao { //上面的JdbcDaoSupport是Spring提供,一般用xml(而非注解)配置;下面的MyJdbcDaoSupport是自定义,xml和注解均可配置 public class AccountDaoImpl extends MyJdbcDaoSupport implements AccountDao { /* private JdbcTemplate template; public void setJdbcTemplate(JdbcTemplate template) { this.template = template; } */ public Account findAccountById(Integer id) { List<Account> accounts = super.getJdbcTemplate().query("select * from account where id = ?", new BeanPropertyRowMapper<Account>(Account.class), id); if(accounts.isEmpty()) { return null; } else { return accounts.get(0); } } public Account findAccountByName(String name) { List<Account> accounts = super.getJdbcTemplate().query("select * from account where name = ?", new BeanPropertyRowMapper<Account>(Account.class), name); if(accounts.isEmpty()) { return null; } else if(accounts.size() > 1) { throw new RuntimeException("结果不唯一!"); } else { return accounts.get(0); } } public void update(Account account) { super.getJdbcTemplate().update("update account set name = ?, money = ? where id = ?", account.getName(), account.getMoney(), account.getId()); } }
MyJdbcDaoSupport.java的内容:
package cn.liuxingchang.dao.impl; import org.springframework.jdbc.core.JdbcTemplate; import javax.sql.DataSource; /** * Spring对下述功能提供官方支持,故本类可视作多余! */ public class MyJdbcDaoSupport { private JdbcTemplate jdbcTemplate; /*public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; }*/ public JdbcTemplate getJdbcTemplate() { return jdbcTemplate; } public void setDataSource(DataSource dataSource) { if(jdbcTemplate == null) { jdbcTemplate = createJdbcTemplate(dataSource); } } public JdbcTemplate createJdbcTemplate(DataSource dataSource) { return new JdbcTemplate(dataSource); } }
Main.java的内容:
package cn.liuxingchang; import cn.liuxingchang.dao.AccountDao; import cn.liuxingchang.domain.Account; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Main { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml"); AccountDao accountDao = context.getBean("accountDao", AccountDao.class); System.out.println(accountDao.findAccountById(1)); //System.out.println(accountDao.findAccountByName("Zhao")); /* Account account = accountDao.findAccountById(1); account.setMoney(111.0); accountDao.update(account); */ } }