Qing před 1 rokem
rodič
revize
635439627a

+ 11 - 4
spring-demo/pom.xml

@@ -15,6 +15,7 @@
 
     <properties>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <spring.version>6.1.2</spring.version>
     </properties>
 
     <dependencies>
@@ -35,13 +36,13 @@
         <dependency>
             <groupId>org.springframework</groupId>
             <artifactId>spring-context</artifactId>
-            <version>6.1.2</version>
+            <version>${spring.version}</version>
         </dependency>
 
         <dependency>
             <groupId>org.springframework</groupId>
             <artifactId>spring-test</artifactId>
-            <version>6.1.2</version>
+            <version>${spring.version}</version>
         </dependency>
 
         <dependency>
@@ -66,7 +67,7 @@
         <dependency>
             <groupId>org.springframework</groupId>
             <artifactId>spring-aspects</artifactId>
-            <version>6.1.2</version>
+            <version>${spring.version}</version>
         </dependency>
         <!--aspectj支持-->
         <dependency>
@@ -94,7 +95,7 @@
         <dependency>
             <groupId>org.springframework</groupId>
             <artifactId>spring-jdbc</artifactId>
-            <version>6.1.2</version>
+            <version>${spring.version}</version>
         </dependency>
         <dependency>
             <groupId>org.projectlombok</groupId>
@@ -102,6 +103,12 @@
             <version>1.18.30</version>
         </dependency>
 
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-tx</artifactId>
+            <version>${spring.version}</version>
+        </dependency>
+
     </dependencies>
 
     <!--解决IDEA中MAVEN项目总是将LANGUAGE LEVEL重置到5的问题

+ 25 - 0
spring-demo/src/main/java/com/sf/ClassPathResourceDemo.java

@@ -0,0 +1,25 @@
+package com.sf;
+
+import org.springframework.core.io.ClassPathResource;
+import java.io.InputStream;
+
+public class ClassPathResourceDemo {
+    public static void loadAndReadUrlResource(String path) throws Exception {
+        // 创建一个 Resource 对象
+        ClassPathResource resource = new ClassPathResource(path);
+        // 获取文件名
+        System.out.println("resource.getFileName = " + resource.getFilename());
+        // 获取文件描述
+        System.out.println("resource.getDescription = " + resource.getDescription());
+        //获取文件内容
+        InputStream in = resource.getInputStream();
+        byte[] b = new byte[(int) resource.contentLength()];
+        while (in.read(b) != -1) {
+            System.out.println(new String(b));
+        }
+    }
+
+    public static void main(String[] args) throws Exception {
+        loadAndReadUrlResource("test.properties");
+    }
+}

+ 2 - 1
spring-demo/src/main/java/com/sf/druid/SpringConfig.java

@@ -1,12 +1,13 @@
 package com.sf.druid;
 
+import com.sf.druid.DruidConfig;
 import org.springframework.context.annotation.ComponentScan;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.Import;
 
 // 如果想要在主配置文件中 导入其他的配置文件 可以使用注解 @Import
 // 后面使用 要导入的配置类
-@Configuration
+//@Configuration
 @ComponentScan
 @Import(DruidConfig.class)
 public class SpringConfig {

+ 16 - 0
spring-demo/src/main/java/com/sf/druid/dao/AuthorDao.java

@@ -0,0 +1,16 @@
+package com.sf.druid.dao;
+
+import com.sf.druid.entity.Author;
+
+import java.util.List;
+
+public interface AuthorDao {
+
+    List<Author> findAll();
+
+    int insert(Author author);
+
+    int delete(Author author);
+
+    int deleteById(String authorId);
+}

+ 10 - 1
spring-demo/src/main/java/com/sf/druid/dao/BookDao.java

@@ -1,9 +1,18 @@
 package com.sf.druid.dao;
 
 import com.sf.druid.entity.Book;
-
 import java.util.List;
 
 public interface BookDao {
     List<Book> findAll();
+
+    int insert(Book book);
+
+    Book findOne(String bookId);
+
+    int delete(Book book);
+
+    int deleteById(String bookId);
+
+    String findAuthorIdById(String bookId);
 }

+ 0 - 27
spring-demo/src/main/java/com/sf/druid/dao/BookDaoImpl.java

@@ -1,27 +0,0 @@
-package com.sf.druid.dao;
-
-import com.sf.druid.entity.Book;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.jdbc.core.BeanPropertyRowMapper;
-import org.springframework.jdbc.core.JdbcTemplate;
-import org.springframework.stereotype.Component;
-import org.springframework.stereotype.Repository;
-
-import java.util.List;
-
-// dao层  对数据增删改查的一层
-//@Component
-//  @Repository 是一个具体的@Component  是操作数据库的bean
-@Repository
-public class BookDaoImpl implements BookDao{
-
-    @Autowired
-    private JdbcTemplate jdbcTemplate;
-
-    @Override
-    public List<Book> findAll() {
-        List<Book> bookList = jdbcTemplate.
-                query("select * from book", new BeanPropertyRowMapper<Book>(Book.class));
-        return bookList;
-    }
-}

+ 71 - 0
spring-demo/src/main/java/com/sf/druid/dao/impl/AuthorDaoImpl.java

@@ -0,0 +1,71 @@
+package com.sf.druid.dao.impl;
+
+import com.sf.druid.dao.AuthorDao;
+import com.sf.druid.entity.Author;
+import com.sf.druid.entity.Book;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jdbc.core.BeanPropertyRowMapper;
+import org.springframework.jdbc.core.support.JdbcDaoSupport;
+import org.springframework.stereotype.Controller;
+import org.springframework.stereotype.Repository;
+import org.springframework.stereotype.Service;
+
+import javax.sql.DataSource;
+import java.util.List;
+
+// 声明一个dao实现类
+//  注入到spring容器中 选择合适的@Component
+//  @Controller
+//  @Service
+//  实现接口本身 所有dao的通用处理 可不可以抽象成父类 BaseDao  spring提供 JdbcDaoSupport
+@Repository
+public class AuthorDaoImpl extends JdbcDaoSupport implements AuthorDao {
+
+    @Autowired
+    public void setDataSourceSelf(DataSource dataSource) {
+        setDataSource(dataSource);
+    }
+
+    @Override
+    public List<Author> findAll() {
+        List<Author> authorList = this.getJdbcTemplate().query(
+                "select * FROM author",
+                new BeanPropertyRowMapper<Author>(Author.class));
+        // BeanPropertyRowMapper 将javabean实体类中的属性映射成数据库中行数据的 处理类
+        return authorList;
+    }
+
+    @Override
+    public int insert(Author author) {
+        // 文本块
+        // Illegal text block start: missing new line after opening quotes
+        // 要从第二行开始
+        String sql = """
+                insert into author(author_name,author_desc) values(?,?)
+                """;
+        Object[] args = {author.getAuthorName(), author.getAuthorDesc()};
+        int update = this.getJdbcTemplate().update(sql, args);
+        return update;
+    }
+
+    @Override
+    public int delete(Author author) {
+        String sql = """
+                delete from author where id = ?
+                """;
+        Object[] args = {author.getId()};
+        int update = this.getJdbcTemplate().update(sql, args);
+        return update;
+    }
+
+    @Override
+    public int deleteById(String authorId) {
+        String sql = """
+                delete from author where id = ?
+                """;
+        // 把string 转化成long的方式  使用包装类  long -> Long
+        // Integer.parseInt(authorId);  也可以转化成 int
+        int update = this.getJdbcTemplate().update(sql, Long.parseLong(authorId));
+        return update;
+    }
+}

+ 99 - 0
spring-demo/src/main/java/com/sf/druid/dao/impl/BookDaoImpl.java

@@ -0,0 +1,99 @@
+package com.sf.druid.dao.impl;
+
+import com.sf.druid.dao.BookDao;
+import com.sf.druid.entity.Book;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jdbc.core.*;
+import org.springframework.stereotype.Component;
+import org.springframework.stereotype.Repository;
+
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.List;
+
+// dao层  对数据增删改查的一层
+//@Component
+//  @Repository 是一个具体的@Component  是操作数据库的bean
+@Repository("bookDao")
+public class BookDaoImpl implements BookDao {
+
+    @Autowired
+    private JdbcTemplate jdbcTemplate;
+
+    @Override
+    public List<Book> findAll() {
+        List<Book> bookList = jdbcTemplate.
+                query("select * from book", new BeanPropertyRowMapper<Book>(Book.class));
+        return bookList;
+    }
+
+    @Override
+    public int insert(Book book) {
+        String sql = """
+                insert into book(book_id,book_name,type_id,author_id,author_name,book_img,book_desc) 
+                values(?,?,?,?,?,?,?)
+                """;
+        Object[] args = {book.getBookId(), book.getBookName(), book.getTypeId(),
+                book.getAuthorId(), book.getAuthorName(), book.getBookImg(), book.getBookDesc()};
+        int update = jdbcTemplate.update(sql, args);
+        return update;
+    }
+
+    @Override
+    public Book findOne(String bookId) {
+        Book book = jdbcTemplate.queryForObject("select * from book where book_id = ?",
+                new BeanPropertyRowMapper<Book>(Book.class), bookId);
+        return book;
+    }
+
+    @Override
+    public int delete(Book book) {
+        // id book_id
+        String sql = """
+                delete from book where book_id = ?
+                """;
+        Object[] args = {book.getBookId()};
+        int update = jdbcTemplate.update(sql, args);
+        return update;
+    }
+
+    @Override
+    public int deleteById(String bookId) {
+        String sql = """
+                delete from book where book_id = ?
+                """;
+        int update = jdbcTemplate.update(sql, bookId);
+        return update;
+    }
+
+    @Override
+    public String findAuthorIdById(String bookId) {
+        // 找到一行数据 或者 一个数据
+        Book book = jdbcTemplate.queryForObject(
+                "select * from book where book_id = ?",
+                new BeanPropertyRowMapper<Book>(Book.class), bookId
+        );
+        System.out.println(book);
+
+        String authorId = jdbcTemplate.queryForObject(
+                "select author_id from book where book_id = ?",
+//                new BookRowMapper(), bookId
+                new SingleColumnRowMapper<>(String.class), bookId
+        );
+        System.out.println(authorId);
+
+        return book.getAuthorId();
+    }
+
+    static class BookRowMapper implements RowMapper<String> {
+        public static final BookRowMapper INSTANCE = new BookRowMapper();
+
+        private BookRowMapper() {
+        }
+
+        @Override
+        public String mapRow(ResultSet rs, int rowNum) throws SQLException {
+            return rs.getString("author_id");
+        }
+    }
+}

+ 24 - 0
spring-demo/src/main/java/com/sf/druid/entity/Author.java

@@ -0,0 +1,24 @@
+package com.sf.druid.entity;
+
+import lombok.*;
+
+import java.io.Serializable;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class Author implements Serializable {
+
+//    private static final long serialVersionUID = 1L;
+    private static final long serialVersionUID = 1501323542349052088L;
+
+    private Long id;
+
+    private String authorId;
+
+    private String authorName;
+
+    private String authorDesc;
+
+}

+ 7 - 0
spring-demo/src/main/java/com/sf/druid/entity/Book.java

@@ -1,12 +1,19 @@
 package com.sf.druid.entity;
 
+import lombok.AllArgsConstructor;
+import lombok.Builder;
 import lombok.Data;
+import lombok.NoArgsConstructor;
 
 import java.io.Serializable;
 
 // 通过两个插件  组成一个简单的 javabean entity
 @Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
 public class Book implements Serializable {
+
     private static final long serialVersionUID = -8962182349002967026L;
 //    private static final long serialVersionUID = -544141905782858543L;
 

+ 15 - 0
spring-demo/src/main/java/com/sf/druid/service/BookService.java

@@ -0,0 +1,15 @@
+package com.sf.druid.service;
+
+import com.sf.druid.entity.Author;
+import com.sf.druid.entity.Book;
+
+public interface BookService {
+    // 通过ctrl + alt可以进入实现逻辑
+    void insert(Author author, Book book);
+
+    void delete(Author author, Book book);
+
+    void deleteById(String authorId, String bookId);
+
+    void deleteByBookId(String bookId);
+}

+ 65 - 0
spring-demo/src/main/java/com/sf/druid/service/impl/BookServiceImpl.java

@@ -0,0 +1,65 @@
+package com.sf.druid.service.impl;
+
+import com.sf.druid.dao.AuthorDao;
+import com.sf.druid.dao.BookDao;
+import com.sf.druid.entity.Author;
+import com.sf.druid.entity.Book;
+import com.sf.druid.service.BookService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+@Service
+public class BookServiceImpl implements BookService {
+
+    // 功能 - 对表的处理 - 数据库本身处理
+    // service - dao - mysql
+
+    @Autowired
+    private BookDao bookDao;
+
+    @Autowired
+    private AuthorDao authorDao;
+
+    /**
+     * @Transactional
+     * 注解的含义  是在这个方法中 增加事务处理
+     * 事务处理的本质是 切面 是高级通知(顾问)
+     */
+    @Override
+    @Transactional
+    public void insert(Author author, Book book) {
+
+        int result1 = authorDao.insert(author);
+        System.out.println("添加作者的结果: " + result1);
+//        System.out.println(1 / 0);
+        int result = bookDao.insert(book);
+        System.out.println("添加书籍的结果: " + result);
+
+    }
+
+    @Override
+    @Transactional
+    public void delete(Author author, Book book) {
+        bookDao.delete(book);
+        authorDao.delete(author);
+    }
+
+    @Override
+    public void deleteById(String authorId, String bookId) {
+        bookDao.deleteById(bookId);
+        authorDao.deleteById(authorId);
+    }
+
+    @Override
+    public void deleteByBookId(String bookId) {
+        // 只有bookId 怎么获取authorId
+        //  可以通过bookId  找到对应的author_id  然后去author表删除数据
+        //   bookDao.findAuthorIdById(bookId);
+        //   authorDao.deleteById(authorId);
+        //   bookDao.deleteById(bookId);
+        String authorId = bookDao.findAuthorIdById(bookId);
+        authorDao.deleteById(authorId);
+        bookDao.deleteById(bookId);
+    }
+}

+ 41 - 0
spring-demo/src/main/resources/bean-trans-anno.xml

@@ -0,0 +1,41 @@
+<?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:context="http://www.springframework.org/schema/context"
+       xmlns:aop="http://www.springframework.org/schema/aop"
+       xmlns:tx="http://www.springframework.org/schema/tx"
+       xsi:schemaLocation="http://www.springframework.org/schema/beans
+        https://www.springframework.org/schema/beans/spring-beans.xsd
+        http://www.springframework.org/schema/context
+        https://www.springframework.org/schema/context/spring-context.xsd
+        http://www.springframework.org/schema/aop
+        https://www.springframework.org/schema/aop/spring-aop.xsd
+        http://www.springframework.org/schema/tx
+        http://www.springframework.org/schema/tx/spring-tx.xsd">
+
+    <context:property-placeholder location="classpath:db.properties"/>
+    <!-- 从底层往上层配置 -->
+    <!-- 管理第三方的DataSource -->
+    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
+        <property name="url" value="${jdbc.url}"/>
+        <property name="username" value="${jdbc.username}"/>
+        <property name="password" value="${jdbc.password}"/>
+        <property name="driverClassName" value="${jdbc.driver}"/>
+    </bean>
+
+    <!-- 管理JdbcTemplate -->
+    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
+        <constructor-arg name="dataSource" ref="dataSource"></constructor-arg>
+    </bean>
+
+    <!--配置 AccountDao 和AccountService -->
+    <context:component-scan base-package="com.sf.druid"></context:component-scan>
+
+    <!-- 配置平台事务管理器 -->
+    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
+        <property name="dataSource" ref="dataSource"></property>
+    </bean>
+
+    <!-- 开启事务注解配置 -->
+    <tx:annotation-driven transaction-manager="transactionManager" mode="proxy"/>
+</beans>

+ 63 - 0
spring-demo/src/main/resources/bean-transaction.xml

@@ -0,0 +1,63 @@
+<?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:context="http://www.springframework.org/schema/context"
+       xmlns:aop="http://www.springframework.org/schema/aop"
+       xmlns:tx="http://www.springframework.org/schema/tx"
+       xsi:schemaLocation="http://www.springframework.org/schema/beans
+  https://www.springframework.org/schema/beans/spring-beans.xsd
+  http://www.springframework.org/schema/context
+  https://www.springframework.org/schema/context/spring-context.xsd
+  http://www.springframework.org/schema/aop
+  https://www.springframework.org/schema/aop/spring-aop.xsd
+  http://www.springframework.org/schema/tx
+  http://www.springframework.org/schema/tx/spring-tx.xsd">
+
+    <context:property-placeholder location="classpath:db.properties"/>
+    <!-- 从底层往上层配置 -->
+    <!-- 管理第三方的DataSource -->
+    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
+        <property name="url" value="${jdbc.url}"/>
+        <property name="username" value="${jdbc.username}"/>
+        <property name="password" value="${jdbc.password}"/>
+        <property name="driverClassName" value="${jdbc.driver}"/>
+    </bean>
+
+    <!-- 管理JdbcTemplate -->
+    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
+        <constructor-arg name="dataSource" ref="dataSource"></constructor-arg>
+    </bean>
+
+    <!--配置 AccountDao 和AccountService -->
+    <context:component-scan base-package="com.sf.druid"></context:component-scan>
+
+    <!-- 配置平台事务管理器 -->
+    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
+        <property name="dataSource" ref="dataSource"></property>
+    </bean>
+
+    <!-- 事务通知 -->
+    <!-- tx:advice:对应的处理器类就是TransactionInterceptor类(实现了MethodInterceptor) -->
+    <!-- TransactionInterceptor类实现事务是通过transaction-manager属性指定的值进行事务管理 -->
+    <tx:advice id="txAdvice" transaction-manager="transactionManager">
+        <!-- 设置事务管理信息 -->
+        <tx:attributes>
+            <!-- 增删改使用REQUIRED事务传播行为 -->
+            <!-- 查询使用read-only -->
+            <tx:method name="insert*" propagation="REQUIRED" isolation="DEFAULT"/>
+        </tx:attributes>
+    </tx:advice>
+
+    <!-- 基于AspectJ + XML方式实现声明式事务 -->
+    <aop:config>
+        <!-- aop:advisor标签使用的是传统spring aop开发方式实现的 -->
+        <!-- spring已经实现了该增强功能,spring使用的是实现MethodInterceptor接口的方式实现的
+          实际使用时  是把一个路径下的所有类的 所有方法都用事务管理
+          * 代表所有返回类型
+          *..* 代表所有路径
+          *ServiceImpl代表所有以 ServiceImpl结束的类  BookServiceImpl AuthorServiceImpl
+          .*(..) 代表所有方法 接收所有参数
+         -->
+        <aop:advisor advice-ref="txAdvice" pointcut="execution(* *..*.*ServiceImpl.*(..))"/>
+    </aop:config>
+</beans>

+ 0 - 23
spring-demo/src/test/java/com/sf/TestBook.java

@@ -1,23 +0,0 @@
-package com.sf;
-
-import com.sf.druid.SpringConfig;
-import com.sf.druid.dao.BookDao;
-import com.sf.druid.entity.Book;
-import org.junit.jupiter.api.Test;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
-
-import java.util.List;
-
-@SpringJUnitConfig(SpringConfig.class)
-public class TestBook {
-
-    @Autowired
-    private BookDao bookDao;
-
-    @Test
-    public void test() {
-        List<Book> books = bookDao.findAll();
-        System.out.println(books);
-    }
-}

+ 73 - 0
spring-demo/src/test/java/com/sf/druid/TestBook.java

@@ -0,0 +1,73 @@
+package com.sf.druid;
+
+import com.sf.druid.SpringConfig;
+import com.sf.druid.dao.AuthorDao;
+import com.sf.druid.dao.BookDao;
+import com.sf.druid.entity.Author;
+import com.sf.druid.entity.Book;
+import com.sf.druid.service.BookService;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
+
+import java.util.List;
+
+@SpringJUnitConfig(SpringConfig.class)
+public class TestBook {
+
+    @Autowired
+    private BookDao bookDao;
+
+    @Autowired
+    private AuthorDao authorDao;
+
+    @Autowired
+    private BookService bookService;
+    // bookService = new BookServiceImpl();
+
+    @Test
+    public void test() {
+
+//        Book book = new Book();
+//        book.setBookId("");
+//        book.setBookName("");
+
+        // 建造者模式  -- 创建对象的一种设计模式
+        //   可以通过链式编程的方法 把属性都设置进去  原理就是每个方法都返回自身
+//        Book book = Book.builder().bookId("2222").bookName("疯狂java讲义").typeId("2")
+//                .authorId("2").authorName("李刚").bookImg("/img/111111.png").bookDesc("java入门书籍")
+//                .build();
+//        int insert = bookDao.insert(book);
+//        System.out.println(insert);
+//
+//        List<Book> books = bookDao.findAll();
+//        System.out.println(books);
+
+
+        Author author = Author.builder()
+                .authorName("李刚").authorDesc("老师")
+                .build();
+        int authorInsert = authorDao.insert(author);
+//        System.out.println(authorInsert);
+//        List<Author> authors = authorDao.findAll();
+//        System.out.println(authors);
+
+    }
+
+    @Test
+    public void testService() {
+        Book book = Book.builder().bookId("2222").bookName("疯狂java讲义").typeId("2")
+                .authorId("2").authorName("李刚").bookImg("/img/111111.png").bookDesc("java入门书籍")
+                .build();
+        Author author = Author.builder()
+                .authorName("李刚").authorDesc("老师")
+                .build();
+        bookService.insert(author, book);
+
+        // 先写实体类 Book -> 再写dao -> BookDao BookDaoImpl
+        // 再写另外的实体类和dao   Author  AuthorDao  AuthorDaoImpl
+        // 在这个过程中 写一点测一点  测试的最小单元是方法
+        // 实现功能  Service -> 组装dao的调用 以及dao返回的数据
+
+    }
+}

+ 1 - 1
spring-demo/src/test/java/com/sf/TestDruid.java → spring-demo/src/test/java/com/sf/druid/TestDruid.java

@@ -1,4 +1,4 @@
-package com.sf;
+package com.sf.druid;
 
 import com.alibaba.druid.pool.DruidDataSource;
 import org.junit.jupiter.api.Test;

+ 33 - 0
spring-demo/src/test/java/com/sf/druid/TestMain.java

@@ -0,0 +1,33 @@
+package com.sf.druid;
+
+import com.sf.druid.dao.BookDao;
+import com.sf.druid.entity.Book;
+import com.sf.druid.service.BookService;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.annotation.AnnotationConfigApplicationContext;
+
+import java.util.List;
+import java.util.Scanner;
+
+public class TestMain {
+
+    private static ApplicationContext context;
+    private static BookService bookService;
+    private static BookDao bookDao;
+    static {
+        context = new AnnotationConfigApplicationContext(SpringConfig.class);
+        bookService = context.getBean(BookService.class);
+        bookDao = context.getBean(BookDao.class);
+    }
+
+    public static void main(String[] args) {
+        Scanner scanner = new Scanner(System.in);
+        int num = scanner.nextInt();
+        System.out.println(num);
+
+        List<Book> all = bookDao.findAll();
+        System.out.println(all);
+    }
+}

+ 77 - 0
spring-demo/src/test/java/com/sf/druid/TestTransAnno.java

@@ -0,0 +1,77 @@
+package com.sf.druid;
+
+import com.sf.druid.dao.AuthorDao;
+import com.sf.druid.dao.BookDao;
+import com.sf.druid.entity.Author;
+import com.sf.druid.entity.Book;
+import com.sf.druid.service.BookService;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
+
+import java.util.Scanner;
+
+@SpringJUnitConfig(locations = "classpath:bean-trans-anno.xml")
+public class TestTransAnno {
+
+    @Autowired
+    private BookService bookService;
+
+    @Test
+    public void test() {
+
+        Book book = Book.builder().bookId("4444").bookName("深入分析Java Web技术内幕").typeId("2")
+                .authorId("4").authorName("许令波").bookImg("/img/111111.png").bookDesc("java进阶书籍")
+                .build();
+        Author author = Author.builder()
+                .authorName("许令波").authorDesc("程序员")
+                .build();
+        bookService.insert(author, book);
+    }
+
+    @Autowired
+    private BookDao bookDao;
+    @Autowired
+    private AuthorDao authorDao;
+
+    @Test
+    public void testDao() {
+//        Book book = bookDao.findOne("11111");
+//        System.out.println(book);
+//        Book book = Book.builder().bookId("11112").build();
+//        System.out.println(bookDao.delete(book));
+//
+//        Author author = Author.builder().id(16L).build();
+//        System.out.println(authorDao.delete(author));
+
+//        bookDao.findAuthorIdById("3333");
+        System.out.println(authorDao.findAll());
+    }
+
+    // 需求 通过删除作者和书籍 来使用声明式事务
+    // insert(Book book,Author author);
+    // delete(Book book,Author author);
+    @Test
+    public void testService() {
+        Book book = Book.builder().bookId("11112").build();
+        Author author = Author.builder().id(16L).build();
+        bookService.delete(author, book);
+    }
+
+    @Test
+    public void testServiceById() {
+//        bookService.deleteById("1", "11111");
+        bookService.deleteByBookId("2222");
+    }
+
+
+    @Test
+    public void testAll(){
+        System.out.println("输出所有书籍列表:");
+        // <bookId,bookName>
+        System.out.println("是否查看具体书籍信息");
+//        Scanner scanner = new Scanner(System.in);
+//
+    }
+
+}

+ 59 - 0
spring-demo/src/test/java/com/sf/druid/TestTransaction.java

@@ -0,0 +1,59 @@
+package com.sf.druid;
+
+
+import com.sf.druid.dao.AuthorDao;
+import com.sf.druid.entity.Author;
+import com.sf.druid.entity.Book;
+import com.sf.druid.dao.BookDao;
+import com.sf.druid.service.BookService;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
+
+import java.util.List;
+
+//@SpringJUnitConfig(SpringConfig.class)
+@SpringJUnitConfig(locations = "classpath:bean-transaction.xml")
+public class TestTransaction {
+
+    @Autowired
+    private BookDao bookDao;
+
+    @Autowired
+    private AuthorDao authorDao;
+
+    @Autowired
+    private BookService bookService;
+
+    @Test
+    public void test() {
+        List<Book> books = bookDao.findAll();
+        System.out.println(books);
+
+//        Book book = Book.builder().bookId("2222").bookName("疯狂java讲义").typeId("2")
+//                .authorId("2").authorName("李刚").bookImg("/img/111111.png").bookDesc("java入门书籍")
+//                .build();
+//        int insert = bookDao.insert(book);
+//        System.out.println(insert);
+
+//        List<Author> authors = authorDao.findAll();
+//        System.out.println(authors);
+        Author author = Author.builder()
+                .authorName("李刚").authorDesc("老师")
+                .build();
+        int authorInsert = authorDao.insert(author);
+        System.out.println(authorInsert);
+    }
+
+    @Test
+    public void testService() {
+        Book book = Book.builder().bookId("3333").bookName("深入理解java虚拟机").typeId("2")
+                .authorId("3").authorName("周志明").bookImg("/img/111111.png").bookDesc("java进阶书籍")
+                .build();
+        Author author = Author.builder()
+                .authorName("周志明").authorDesc("程序员")
+                .build();
+        bookService.insert(author, book);
+    }
+}
+