基於aspectJ的註解aop操作
使用註解方式實現aop操作
第一步 創建對象
<!-- 創建對象 --> <bean id="car" class="com.jia.aop.Car"></bean> <bean id="myCar" class="com.jia.aop.MyCar"></bean>
第二步 在spring核心配置文件中,開啓aop操作
<!-- 開啓aop操作 --> <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
第三步 在增強類上面使用註解完成aop操作
@Aspect public class MyCar { /** * 在方法上面使用註解完成增強配置 */ @Before(value="execution(* com.jia.aop.Car.*(..))") public void before1() { System.out.println("MyCar====before()"); } }
jdbcTemplate實現crud操作(添加 修改和刪除操作)
1 Spring框架一站式框架
- (1) 針對javaee三層,每一層都有解決技術
- (2) 在dao層,使用JDBCTemplate
2 Spring對不同的持久化層技術都進行封裝
JDBC———->JdbcTemplate
Hibernate5.0——————>HibernateTemplate
MyBatis——————–>SqlMapClientTemplate
JPA—————————–>JpaTemplate
3 jdbcTemplate 使用和dbutils使用很相似,都對數據庫進行crud操作
使用JdbcTemplate流程
- 導入jdbcTemplate使用的jar包
- spring-jdbc.RELEASE.jar
- spring-tx.RELEASE.jar
- 數據庫驅動
- 創建對象,設置數據庫信息
- 創建jdbcTemplate對象,設置數據源
- 調用jdbcTemplate對象裏面的方法實現操作
增加
/** * 添加操作 */ @Test public void add() { // 創建對象,設置數據庫信息 DriverManagerDataSource dataSource=new DriverManagerDataSource(); dataSource.setDriverClassName("com.mysql.jdbc.Driver"); dataSource.setUrl("jdbc:mysql:///tt_1"); dataSource.setUsername("root"); dataSource.setPassword("root"); // 創建jdbcTemplate對象,設置數據源 JdbcTemplate template=new JdbcTemplate(dataSource); // 調用jdbcTemplate對象裏面的方法實現操作 //創建sql語句 String sql="insert into a values(?)"; int rows = template.update(sql,"aldrich"); System.out.println(rows); }
jdbcTemplate實現 CRUD 操作
查詢實現
第一種 查詢返回某一個值
public <T> T queryForObject(String sql, Class<T> requiredType)
- (1) 第一個參數是sql語句
- (2) 第二個參數 返回類型的class
/** * JdbcTemplate實現查詢操作 查詢返回某一個值 */ @Test public void testCount() { // 創建對象,設置數據庫信息 DriverManagerDataSource dataSource=new DriverManagerDataSource(); dataSource.setDriverClassName("com.mysql.jdbc.Driver"); dataSource.setUrl("jdbc:mysql:///customer1"); dataSource.setUsername("root"); dataSource.setPassword("root"); // 創建jdbcTemplate對象,設置數據源 JdbcTemplate template=new JdbcTemplate(dataSource); // 調用jdbcTemplate對象裏面的方法實現操作 //創建sql語句 String sql="select count(*) from customer"; int count = template.queryForObject(sql, Integer.class); System.out.println(count); }
/** * JDBC 實現查詢操作 查詢返回某一個值 */ @Test public void testJDBC() { Connection conn = null; PreparedStatement psmt = null; ResultSet rs = null; try { // 加載驅動 Class.forName("com.mysql.jdbc.Driver"); // 創建連接 conn = DriverManager.getConnection("jdbc:mysql:///customer1", "root", "root"); // 創建SQL語句 String sql = "select * from customer where name=?"; // 預編譯sql psmt = conn.prepareStatement(sql); // 設置參數值 psmt.setString(1, "aldrich"); // 執行SQL rs = psmt.executeQuery(); // 遍歷結果集 while (rs.next()) { // 得到返回結果 String id = rs.getString("id"); String name = rs.getString("name"); String gender = rs.getString("gender"); String type = rs.getString("type"); Customer customer = new Customer(); customer.setId(id); customer.setName(name); customer.setGender(gender); customer.setType(type); System.out.println(customer); } } catch (Exception e) { e.printStackTrace(); } finally { try { rs.close(); psmt.close(); conn.close(); } catch (SQLException e) { e.printStackTrace(); } } }
第二種 查詢返回對象
public <T> T queryForObject(String sql, RowMapper<T> rowMapper, Object... args)
- 第一個參數是sql語句
- 第二個參數是RowMapper是接口,類似於dbutils裏面接口
- 第三個參數是 可變參數
/** * org.springframework.jdbc.core.RowMapper<>實現類 * @author hasee * */ class MyRowMapper implements RowMapper<Customer> { @Override public Customer mapRow(ResultSet rs, int rowNum) throws SQLException { // 從結果集中得到數據 String id = rs.getString("id"); String name = rs.getString("name"); String gender = rs.getString("gender"); String type = rs.getString("type"); // 把得到的數據封裝到對象裏面 Customer customer = new Customer(); customer.setId(id); customer.setName(name); customer.setGender(gender); customer.setType(type); return customer; } }
第三種 查詢返回List
public <T> List<T> query(String sql, RowMapper<T> rowMapper, Object... args)
- sql語句
- RowMapper接口,自己寫類實現數據封裝
- 可變參數
// 創建對象,設置數據庫信息 DriverManagerDataSource dataSource = new DriverManagerDataSource(); dataSource.setDriverClassName("com.mysql.jdbc.Driver"); dataSource.setUrl("jdbc:mysql:///customer1"); dataSource.setUsername("root"); dataSource.setPassword("root"); // 創建jdbcTemplate對象,設置數據源 JdbcTemplate template = new JdbcTemplate(dataSource); // 調用jdbcTemplate對象裏面的方法實現操作 // 創建sql語句 String sql = "select * from customer"; List<Customer> query = template.query(sql, new MyRowMapper()); System.out.println(query.toString());
Spring配置c3p0連接池
Spring配置連接池和dao使用jdbcTemplate
Spring配置c3p0連接池
- 第一步 導入jar包
- c3p0.jar
- mchange-commons-java.jar
- 第二步 創建Spring配置文件,配置連接池
<!-- 配置c3p0連接池 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <!-- 注入屬性值 --> <property name="driverClass" value="com.mysql.jdbc.Driver"></property> <property name="jdbcUrl" value="jdbc:mysql:///customer1"></property> <property name="user" value="root"></property> <property name="password" value="root"></property> </bean>
dao使用jdbcTemplate
- 創建service和dao,配置service和dao對象,在service注入dao對象
- 創建jdbcTemplate對象,把模板對象注入到dao裏面
- 在jdbcTemplate對象裏面注入
public class UserService { private UserDao userDao; public void setUserDao(UserDao userDao) { this.userDao = userDao; } public void add(){ userDao.add(); } } public class UserDao { /** * TODO 得到JdbcTemplate對象 */ private JdbcTemplate jdbcTemplate; public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } /** * 添加操作 */ public void add() { // TODO Auto-generated method stub } }
<!-- 創建service對象,在service注入dao對象 --> <bean id="userService" class="com.jia.c3p0.UserService"> <!-- 注入dao對象 --> <property name="userDao" ref="userDao"></property> </bean> <!-- 創建dao對象 --> <bean id="userDao" class="com.jia.c3p0.UserDao"> <!-- 注入jdbcTemplate對象 --> <property name="jdbcTemplate" ref="jdbcTemplate"></property> </bean> <!-- 創建jdbcTemplate對象 --> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <!-- 把dataSource傳遞到模板對象裏面 --> <property name="dataSource" ref="dataSource"></property> </bean>
Spring的事務Api
事務概念
- 什麼是事務
- 事務是對數據庫操作的最基本單元,指一組操作,要麼都成功,有一個失敗都失敗.
- 事務特性
- 原子性
- 一致性
- 隔離性: 多個事務之間不會產生影響
- 持久性
- 不考慮隔離性產生讀問題
- 髒讀
- 不可重複讀
- 虛讀
- 幻讀
- 解決讀問題
- 設置隔離級別
Spring事務管理api
1 Spring事務管理兩種方式
- 第一種 編程式事務管理
- 第二種 聲明式事務管理
- 基於xml配置文件實現
- 基於註解實現
2 Spring事務管理的API介紹
- PlatformTransactionManager 事務管理器
- TransactionDefinition 事務定義信息(隔離 傳播 超時 只讀)
- TransactionStatus 事務具體運行狀態
Spring的事務管理
轉賬環境搭建
1 創建數據庫,添加數據
create database transfer_spring default character set utf8 collate utf8_general_ci;
create table account (
id int(11) not null primary key auto_increment,
username varchar(100),
salary int default '0');
2 創建service和dao類,完成注入關係
- service層又叫業務邏輯層
- dao層,單純對數據庫操作層,在dao層不添加業務
配置文件實現
聲明式事務管理(XML配置)
配置文件方式使用aop 思想配置
- 第一步 配置事務管理器
<!-- 第一步 配置事務管理器 -->
<bean id="TransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- 注入dataSource -->
<property name="dataSource" ref="dataSource"></property>
</bean>
- 第二步 配置事務增強
<!-- 第二步 配置事務增強 -->
<tx:advice id="txadvice" transaction-manager="transactionManager">
<!-- 做事務操作 -->
<tx:attributes>
<!-- 設置進行事務操作的方法匹配規則 -->
<tx:method name="account*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
- 第三步 配置切面
<!-- 第三步 配置切面 -->
<aop:config>
<!-- 切入點 -->
<aop:pointcut expression="execution(* com.jia.service.OrdersService.*(..))" id="pointcut1"/>
<!-- 切面 -->
<aop:advisor advice-ref="txadvice" pointcut-ref="pointcut1"/>
</aop:config>
註解實現
聲明式事務管理(註解)
- 第一步 配置事務管理器
<!-- 第一步 配置事務管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- 注入dataSource -->
<property name="dataSource" ref="dataSource"></property>
</bean>
- 第二步 配置事務註解
<!-- 第二步 開啓事務註解 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
- 第三步 在要使用事務的方法所在類上面添加註解
@Transactional
public class OrdersService {}