Spring框架——JDBC

本文内容纲要:

- Spring与JDBC

- 数据库配置

- 在beans.xml配置jdbc数据库

- JdbcTemplate类

- 功能

- 用法

- 在Dao类中使用

- @Repository

- @Resource

- 在Service类中

- @Service

- @Resource

- Spring与事务

- 概念

- 原子性(Atomic)

- 一致性(Consistent)

- 隔离性(Isolated)

- 持久性(Durable)

- 编程式事务

- beans.xml

- 声明式事务

Spring与JDBC

数据库配置

在beans.xml配置jdbc数据库

<!-- 数据源 -->

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">

<property name="driverClassName">

<value>com.mysql.jdbc.Driver</value>

</property>

<property name="url">

<value>jdbc:mysql://localhost:3306/mytest_db</value>

</property>

<property name="username">

<value>root</value>

</property>

<property name="password">

<value></value>

</property>

</bean>

JdbcTemplate

功能

JdbcTemplate类是Spring对JDBC支持类库中的核心类

  • 创建和释放资源
  • 执行SQL语句、存储过程,并通过ResultSet来返回数据

在beans.xml配置

将dataSource依赖注入jdbcTemplate,指定执行操作的数据库

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">

<property name="dataSource" ref="dataSource"></property>

</bean>

用法

  1. 增删改

    this.jdbcTemplate.update("insert into book(title,price) values(?,?)", book.getTitle(),book.getPrice());

  2. 返回自增值的增删改

    final String sql = "insert into book(title,price) values(?,?)";

    KeyHolder keyHolder = new GeneratedKeyHolder();

    this.jdbcTemplate.update(new PreparedStatementCreator() {

    		@Override

    public PreparedStatement createPreparedStatement(Connection con) throws SQLException {

    PreparedStatement pstm = con.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);

    pstm.setString(1, book.getTitle());

    pstm.setInt(2, book.getPrice());

    return pstm;

    }

    }, keyHolder);

    int key = keyHolder.getKey().intValue();

    System.out.println(key);

  3. 批处理

    final String sql = "delete from book where id = ?";

    this.jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {

    		@Override

    public void setValues(PreparedStatement pstm, int index) throws SQLException {

    pstm.setInt(1, ids[index]);

    }

    @Override

    public int getBatchSize() {

    return ids.length;

    }

    });

  4. 查询

在Dao类中使用

@Repository

允许组件扫描来发现和配置自定义DAO

在类中配置该注解表示数据持久层

@Resource

持久化源,数据源DataSource

依赖注入,获取JdbcTemplate

@Repository

public class BookDaoImpl {

@Resource

private JdbcTemplate jdbcTemplate;

public List<String> find(){

return this.jdbcTemplate.queryForList("select name from menu", String.class);

}

public List<Menu> findAll(){

return this.jdbcTemplate.query("select * from menu", new RowMapper<Menu>() {

public Menu mapRow(ResultSet rs, int rowNum) throws SQLException{

Menu m = new Menu();

m.setId(rs.getInt(1));

m.setName(rs.getString(2));

m.setParentId(rs.getInt(3));

return m;

}

});

}

public Menu findById(int id) {

return this.jdbcTemplate.queryForObject("select * from menu where id = ?",

new Object[] {id},

new RowMapper<Menu>() {

public Menu mapRow(ResultSet rs, int rowNum) throws SQLException{

Menu m = new Menu();

m.setId(rs.getInt(1));

m.setName(rs.getString(2));

m.setParentId(rs.getInt(3));

return m;

}

});

}

public int countParentIdNull() {

int count = this.jdbcTemplate.queryForObject("select count(id) from menu where parentId is not null", Integer.class);

return count;

}

public void saveBook(Book book) {

this.jdbcTemplate.update("insert into book(title,price) values(?,?)",

book.getTitle(), book.getPrice());

final String sql = "insert into book(title,price) values(?,?)";

KeyHolder keyHolder = new GeneratedKeyHolder();

this.jdbcTemplate.update(new PreparedStatementCreator() {

@Override

public PreparedStatement createPreparedStatement(Connection con) throws SQLException {

PreparedStatement pstm = con.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);

pstm.setString(1, book.getTitle());

pstm.setInt(2, book.getPrice());

return pstm;

}

}, keyHolder);

int key = keyHolder.getKey().intValue();

System.out.println(key);

}

public void batchDelete(int[] ids) {

final String sql = "delete from book where id = ?";

this.jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {

@Override

public void setValues(PreparedStatement pstm, int index) throws SQLException {

pstm.setInt(1, ids[index]);

}

@Override

public int getBatchSize() {

return ids.length;

}

});

}

}

在Service类中

@Service

在类中配置该注解表示业务逻辑层

@Resource

依赖注入,将Dao依赖注入进Service,获取Dao

@Service

public class BookServiceImpl {

@Resource

private BookDaoImpl bookDaoImpl;

public void addBook(Book book) {

this.bookDaoImpl.saveBook(book);

}

public void batchDelete(int[] ids) {

this.bookDaoImpl.batchDelete(ids);

}

public int count() {

return this.bookDaoImpl.countParentIdNull();

}

public Menu findById(int id) {

return this.bookDaoImpl.findById(id);

}

public List<Menu> findAll(){

return this.bookDaoImpl.findAll();

}

public List<String> find(){

return this.bookDaoImpl.find();

}

}

Spring与事务

概念

事务是一组原子操作的工作单元

  • 原子性(Atomic)

事务由一个或多个行为捆绑在一起组成一个单独的工作单元,原子性保证事务中的所有操作要么都发生,要么都不发生

  • 一致性(Consistent)

一旦一个事务结束了(不管成功与否),系统所处的状态和它的业务规则是一致的,也就是说数据应当不会被破坏

  • 隔离性(Isolated)

事务应该允许多名用户操作同一个数据,一名用户的操作不会和其他用户的操作相混淆(隔离级别)

  • 持久性(Durable)

一旦事务完成,事务的结果应该持久化,用来保证即使系统崩溃也不会破坏事务的结果

Spring框架提供了编程式事务管理和声明式事务管理

编程式事务

  1. 可以清楚地控制事务的边界
  2. 可自行实现事务开始时间、结束时间、撤消操作的时机等
  3. 可以实现细粒度的事务控制

beans.xml

<!-- 事务 -->

<bean id="transactionManager"

class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

<property name="dataSource" ref="dataSource" />

</bean>

声明式事务

  1. 事务管理的API不介入程序,最符合一个非侵入型轻量级容器的理想
  2. Spring Framework的声明式事务管理是建立在Spring的面向切面编程(aspect-oriented programming, AOP) 上的
  3. Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource、TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分

本文内容总结:Spring与JDBC,数据库配置,在beans.xml配置jdbc数据库,JdbcTemplate类,功能,用法,在Dao类中使用,@Repository,@Resource,在Service类中,@Service,@Resource,Spring与事务,概念,原子性(Atomic),一致性(Consistent),隔离性(Isolated),持久性(Durable),编程式事务,beans.xml,声明式事务,

原文链接:https://www.cnblogs.com/occlive/p/13579527.html

以上是 Spring框架——JDBC 的全部内容, 来源链接: utcz.com/z/362669.html

回到顶部