普通实现:
1、创建数据表customer。
可以使用任何数据库实现,在项目中要引入相应数据库驱动包并配置相应数据库连接。
2、创建Customer pojo。
Customer类的属性对应数据库的属性,除了为每个属性提供相应的get和set方法外不提供任何 其他业务逻辑实现。
public class Customer {
int custId;
String name;
int age;
//getter and setter method
}
3、创建数据访问接口。
该接口声明对对数据库的所有操作,如插入删除等。
public interface CustomerDAO {
public void insert(Customer customer);
}
4、实现数据访问。
实现数据库访问接口,提供与数据库交互的具体业务逻辑实现。该类中会调用JDBC函数。
JDBC相关知识在这篇博客。
public class JdbcCustomerDAO implements CustomerDAO{
//DataSource在Bean中配置,用于获取mysql驱动
private DataSource dataSource;
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}
public void insert(Customer customer){
//定义预处理SQL语句
String sql = "INSERT INTO CUSTOMER " + "(CUST_ID, NAME, AGE) VALUES (?, ?, ?)";
Connection conn = null;
try {
//连接数据库
conn = dataSource.getConnection();
//预处理方式执行SQL语句
PreparedStatement ps = conn.prepareStatement(sql);
ps.setInt(1, customer.getCustId());
ps.setString(2, customer.getName());
ps.setInt(3, customer.getAge());
ps.executeUpdate();
ps.close();
} catch (SQLException e) {
throw new RuntimeException(e);
} finally {
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {}
}
}
}
}
5、配置bean。
<bean id="customerDAO" class="com.yiibai.customer.dao.impl.JdbcCustomerDAO">
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/yiibaijava" />
<property name="username" value="root" />
<property name="password" value="password" />
</bean>
6、对数据库进行操作。
public static void main( String[] args ){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
CustomerDAO customerDAO = (CustomerDAO) context.getBean("customerDAO");
Customer customer = new Customer(1, "yiibai",29);
customerDAO.insert(customer);
}
使用JdbcTemplate实现:
上方代码是原始实现,可以看到很多代码被用于创建连接、关闭连接、处理异常等。这样有很明显的缺点:代码冗余和容易出错。
使用JdbcTemplate可节省大量的冗余代码,因为JdbcTemplate类会自动处理它。
public class JdbcCustomerDAO implements CustomerDAO{
private DataSource dataSource;
//使用JdbcTemplate
private JdbcTemplate jdbcTemplate;
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}
public void insert(Customer customer){
//定义预处理sql语句
String sql = "INSERT INTO CUSTOMER " + "(CUST_ID, NAME, AGE) VALUES (?, ?, ?)";
//使用dataSource初始化jdbcTemplate
jdbcTemplate = new JdbcTemplate(dataSource);
//插入数据
jdbcTemplate.update(sql, new Object[] { customer.getCustId(),
customer.getName(),customer.getAge()
});
}
}
使用JdbcDaoSupport实现:
通过扩展 JdbcDaoSupport,类中就不需要DataSource和JdbcTemplate句柄了,因为JdbcDaoSupport有静态方法会自动注入dataSource。而且可以使用 getJdbcTemplate()方法得到 JdbcTemplate。
public class JdbcCustomerDAO extends JdbcDaoSupport implements CustomerDAO{
//继承JdbcDaoSupport,因为JdbcDaoSupport中有:
//public final void setDataSource(DataSource dataSource)方法,
//所以此类不需要持有dataSource引用
public void insert(Customer customer){
//定义预处理sql
String sql = "INSERT INTO CUSTOMER " + "(CUST_ID, NAME, AGE) VALUES (?, ?, ?)";
//执行插入操作 使用getJdbcTemplate()方法可以获取JdbcTemplate对象
getJdbcTemplate().update(sql, new Object[] { customer.getCustId(),
customer.getName(),customer.getAge()
});
}
其实最后学了MyBa'tis,可以直接用逆向工程生成DAO层代码,不需要自己实现。