1.创建meaven项目…导入pom.xml所需依赖文件
<dependencies>
<!--Spring依赖 https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.18.RELEASE</version>
</dependency>
<!--AOP依赖 https://mvnrepository.com/artifact/org.springframework/spring-aop -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.3.18.RELEASE</version>
</dependency>
<!-- aspectjweaver:aop依赖的jar -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.9</version>
</dependency>
<!--JDBC依赖 https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.3.18.RELEASE</version>
</dependency>
<!--数据库连接池 https://mvnrepository.com/artifact/commons-dbcp/commons-dbcp -->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<!-- mysql的JDBC驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
<!-- log4j:日志文件 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
2.创建src实体类\dao层\applicationContext.xml
3.dao层实现类
JdbcTemplate主要提供以下五类方法:
execute方法:可以用于执行任何SQL语句,一般用于执行DDL语句;
update方法及batchUpdate方法:update方法用于执行新增、修改、删除等语句;batchUpdate方法用于执行批处理相关语句;
query方法及queryForXXX方法:用于执行查询相关语句;
call方法:用于执行存储过程、函数相关语句。
RowMapper:用于将结果集每行数据转换为需要的类型,用户需实现方法mapRow(ResultSet rs, int rowNum)来完成将每行数据转换为相应的类型。
RowCallbackHandler:用于处理ResultSet的每一行结果,用户需实现方法processRow(ResultSet rs)来完成处理,在该回调方法中无需执行rs.next(),该操作由JdbcTemplate来执行,用户只需按行获取数据然后处理即可。
ResultSetExtractor:用于结果集数据提取,用户需实现方法extractData(ResultSet rs)来处理结果集,用户必须处理整个结果集;
public class Studentdaolmpl extends JdbcDaoSupport implements StudentDao {
/**
* JdbcDaoSupport类中含有私有属性 private JdbcTemplate jdbcTemplate又有数控库链接方法
* Studentdaolmpl也就有了这些属性
*/
public void insertStu(Student stu) {
String sql="insert into Student(stuname,age,brithday)values(?,?,?)";
Object[] obj= {stu.getName(),stu.getAge(),stu.getBrithday()};
super.getJdbcTemplate().update(sql, obj);
}
public void updateStu(Student stu) {
String sql="update Student set stuname=?,age=?,brithday=? where id=?";
Object[] obj= {stu.getName(),stu.getAge(),stu.getBrithday(),stu.getId()};
super.getJdbcTemplate().update(sql, obj);
}
public void deleteStu(Integer id) {
String sql="delete form Student where id=?";
Object[] obj={id};
super.getJdbcTemplate().update(sql, obj);
}
public Student findById(Integer id) {
//在获取ResultSet后(也就是读取sql每行信息)后的代码需要自己写
String sql="select * from Student where id=?";
Object[] obj= {id};
return super.getJdbcTemplate().queryForObject(sql, obj,new RowMapper<Student>() {
//参3为结果映射,要把每一列的映射转换成结果对象,相当于解析rsultset
public Student mapRow(ResultSet rs, int rowNum) throws SQLException {
Student student=new Student(rs.getInt(1),rs.getString(2),rs.getInt(3),rs.getTimestamp(4));
return student;
}
});
}
public List<Student> selectAll() {
String sql="select * from Student";
//自定的根据RowMapper汇合成List集合
return super.getJdbcTemplate().query(sql, new RowMapper<Student>() {
public Student mapRow(ResultSet rs, int rowNum) throws SQLException {
Student student=new Student(rs.getInt(1),rs.getString(2),rs.getInt(3),rs.getTimestamp(4));
return student;
}
});
}
}
4.Spring配置
<?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:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
<!-- 数据库连接池 负责链接数据库 -->
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName"
value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql:///springjdbc" />
<property name="username" value="root" />
<property name="password" value="111" />
</bean>
<!--配置dao层实现类 提供共有的核心代码 JdbcDaoSupport用于替换beasDao
Dao里面的属性dataSource 值就是之前的数据库连接池
-->
<bean id="studentDao" class="dao.Studentdaolmpl">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 配置事务管理器 -->
<bean id="txManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!--导入数据连接池 -->
<property name="dataSource" ref="dataSource" />
</bean>
<!--
需要指名事务管理器在什么情况下起作用
增删改需要而查询不需要
-->
<!-- 配置事务管理器发挥作用的时机
<tx:method name="insert*" propagation="REQUIRED"/>
管理的方法以insert开头命名 执行状态
REQUIRED 发挥作用
SUPPORTS 禁用
name="insert*" 对dao层的方法命名起着约束的作用
在语句执行之前会创建事务管理器 如果事务成功则提交反之事务回滚
-->
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="insert*" propagation="REQUIRED"/>
<tx:method name="update*" propagation="REQUIRED"/>
<tx:method name="delete*" propagation="REQUIRED"/>
<!-- 其他命名方式不执行 -->
<tx:method name="*" propagation="SUPPORTS" read-only="true"/>
</tx:attributes>
</tx:advice>
<!-- 需要确定在什么操作下事务管理器起作用 expression="execution(* dao.*.*(..))"
针对dao方法执行事务
-->
<aop:config>
<aop:pointcut id="productServiceMethods" expression="execution(* dao.*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="productServiceMethods"/>
</aop:config>
</beans>