Spring的数据库编程
Spring框架提供了JDBC模板模式------>JdbcTemplate
简化了开发,在开发中并不经常是使用
实际开发更多使用的是Hibernate和MyBatis
1).Spring JDBCp配置
如果使用Spring JDBC操作数据库,要有如下的配置:
在xml配置文件
"dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" > "driverClassName" value="com.mysql.jdbc.Driver" /> "url" value="jdbc:mysql://127.0.0.1:3306/tx" /> "username" value="root" /> "password" value="1234" /> "jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> "dataSource" ref="dataSource">
配置JDBC模板需要将dataSource注入到jdbcTemplate
有时候也需要将JdbcTemplate注入到相应的Bean中可以使用:
@Autowired
private JdbcTemplate jdbcTemplate ;
2).JdbcTemplate 常用方法
--->public int update(String sql,Object args []):l=可以对数据库进行增加、修改、删除等操作...
--->public List
相关jar:
-logging
-mysql-connector-java-
-aop
-beans
-context
-core
-expression
-jdbc
tx
注:在dao方法中的操作可以使用@Componment、@Respository、@Service、@controller进行对包扫描,使用@Autowire进行自动注入!
3).测试:
新建数据库
数据库对应的实体类:
User.java
public class User { private Integer id; private String name; private String pw; //.... }
tx.xml
"dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" > "driverClassName" value="com.mysql.jdbc.Driver" /> "url" value="jdbc:mysql://127.0.0.1:3306/tx" /> "username" value="root" /> "password" value="1234" /> "jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> "dataSource" ref="dataSource">
测试:
public ApplicationContext getapp(){ return new ClassPathXmlApplicationContext("tx.xml"); } //增删改.... @Test public void test1(){ JdbcTemplate jdbcTemplate = (JdbcTemplate) getapp().getBean("jdbcTemplate"); System.out.println(jdbcTemplate); Object a [] = {4,"user4","pwd4"}; Object b [] = {5,"user5","pwd5"}; String sql = "insert into user values(?,?,?)"; //添加用户 jdbcTemplate.update(sql, a); jdbcTemplate.update(sql, b); //查询 sql = "select * from user"; RowMapperrowMapper = new BeanPropertyRowMapper ); List(User.class users = jdbcTemplate.query(sql, rowMapper, null); for(User user : users){ System.out.println(user); } }
编程式事务管理
1).基于底层API的编程式事务管理
基于底层API的编程式事务管理就是根据PlatformTransactionManager、TransactionDefinition和
TransactionStatus几个核心接口,通过编程的方式解决来进行事务处理。
需要在spring的配置文件中:
"dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" > "driverClassName" value="com.mysql.jdbc.Driver" /> "url" value="jdbc:mysql://127.0.0.1:3306/tx" /> "username" value="root" /> "password" value="1234" /> "jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> "dataSource" ref="dataSource"> "dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> "dataSource" ref="dataSource">
test
//事务管理... @Test public void test2(){ JdbcTemplate jdbcTemplate = (JdbcTemplate) getapp().getBean("jdbcTemplate"); //事物管理器 DataSourceTransactionManager tx = (DataSourceTransactionManager) getapp().getBean("dataSourceTransactionManager"); //默认事物定义,隔离级别、传播行为.... TransactionDefinition tf = new DefaultTransactionDefinition(); //开启事物 TransactionStatus ts = tx.getTransaction(tf);
String res = tx(jdbcTemplate, tx, tf, ts); System.out.println(res); } public String tx(JdbcTemplate jdbcTemplate,DataSourceTransactionManager tx, TransactionDefinition tf,TransactionStatus ts){ String msg = "执行成功,没有事物回滚!"; try{ Object a [] = {2,"user2","pwd2"}; String sql = "insert into user values(?,?,?)"; //添加用户 //主键重复 jdbcTemplate.update(sql, a); //提交事务 tx.commit(ts); }catch(Exception e){ //出现异常,事物回滚 tx.rollback(ts); msg= "主键重复!!!"; e.printStackTrace(); } return msg; }
以上的这种操作会让事物处理的代码散落在业务逻辑代码中,破坏了原有代码的条理性,并且让每一个业务方法都包含了
类似启动事物、提交以及回滚事务的样板式代码。
TransactionTemplate的execute方法有一个TransactionCallback接口类型的参数,该接口定义了doInTransaction方法、通常
以匿名内部类的方式实现TransactionCallback接口,在doInTransaction方法中写业务逻辑代码
public T doInTransaction(TransactionStatus arg0)
TransactionStatus类型参数、可以在方法的任何位置调用该参数方法的setRollbackOnly方法将事务标识为回滚、以执行事务回滚
根据默认规则:
如果在执行回调方法过程中如果抛出未检查异常或者显示调用setRollbackOnly方法,则回滚事物
如果事务执行完成或抛出了checked类型的异常,则提交事务
代码待完成......