JdbcTemplate ialah satu set rangka kerja templat JDBC yang disediakan oleh Spring, yang menggunakan teknologi AOP untuk menyelesaikan masalah sejumlah besar kod berulang apabila menggunakan JDBC secara langsung. Walaupun JdbcTemplate tidak sefleksibel seperti Mybatis, ia lebih mudah daripada menggunakan JDBC secara langsung. Penggunaan JdbcTemplate dalam Spring Boot menyediakan kelas konfigurasi automatik JdbcTemplateAutoConfiguration Bahagian kod sumber adalah seperti berikut:
@Configuration @ConditionalOnClass({DataSource.class, JdbcTemplate.class}) @ConditionalOnSingleCandidate(DataSource.class) @AutoConfigureAfter({DataSourceAutoConfiguration.class}) @EnableConfigurationProperties({JdbcProperties.class}) public class JdbcTemplateAutoConfiguration { public JdbcTemplateAutoConfiguration() { } @Configuration @Import({JdbcTemplateAutoConfiguration.JdbcTemplateConfiguration.class}) static class NamedParameterJdbcTemplateConfiguration { NamedParameterJdbcTemplateConfiguration() { } @Bean @Primary @ConditionalOnSingleCandidate(JdbcTemplate.class) @ConditionalOnMissingBean({NamedParameterJdbcOperations.class}) public NamedParameterJdbcTemplate namedParameterJdbcTemplate(JdbcTemplate jdbcTemplate) { return new NamedParameterJdbcTemplate(jdbcTemplate); } } @Configuration static class JdbcTemplateConfiguration { private final DataSource dataSource; private final JdbcProperties properties; JdbcTemplateConfiguration(DataSource dataSource, JdbcProperties properties) { this.dataSource = dataSource; this.properties = properties; } @Bean @Primary @ConditionalOnMissingBean({JdbcOperations.class}) public JdbcTemplate jdbcTemplate() { JdbcTemplate jdbcTemplate = new JdbcTemplate(this.dataSource); Template template = this.properties.getTemplate(); jdbcTemplate.setFetchSize(template.getFetchSize()); jdbcTemplate.setMaxRows(template.getMaxRows()); if (template.getQueryTimeout() != null) { jdbcTemplate.setQueryTimeout((int)template.getQueryTimeout().getSeconds()); } return jdbcTemplate; } } }
Daripada kod sumber, ia boleh dilihat bahawa apabila DataSource dan JdbcTemplate wujud di bawah classpath dan di sana. hanyalah satu contoh DataSource, konfigurasi automatik akan berkuat kuasa , jika pembangun tidak menyediakan JdbcOperations, Spring Boot akan secara automatik menyuntik JdbcTemplate ke dalam bekas (JdbcTemplate ialah subkelas JdbcOperations). Oleh itu, pembangun yang ingin menggunakan JdbcTemplate hanya perlu menyediakan kebergantungan JdbcTemplate dan kebergantungan DataSource
Buat jadual dalam pangkalan data, seperti berikut:
CREATE TABLE `book` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(128) DEFAULT NULL, `author` varchar(128) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; INSERT INTO `chapter05`(`id`, `name`, `author`) VALUES (1, '斗罗大陆Ⅰ', '唐家三少'); INSERT INTO `chapter05`(`id`, `name`, `author`) VALUES (2, '斗罗大陆Ⅱ', '唐家三少');
Buat projek Spring Boot dan tambah kebergantungan
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.9</version> </dependency>
spring-boot-starter-jdbc menyediakan spring-jdbc, dan juga menambah kebergantungan pemacu pangkalan data dan kebergantungan kolam sambungan pangkalan data
Konfigurasikan maklumat sambungan pangkalan data asas dalam application.properties
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring =jdbc:mysql://localhost:3306/weirdo
spring.datasource.username=root
spring.datasource.password=root
Buat kelas entiti Buku, kodnya adalah seperti berikut:
public class Book { private int id; private String name; private String author; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } }
Buat BookDao, kodnya adalah seperti berikut:
@Repository public class BookDao { @Autowired JdbcTemplate jdbcTemplate; public int addBook(Book book) { return jdbcTemplate.update("INSERT INTO book(name,author) VALUES (?,?)", book.getName(), book.getAuthor()); } public int updateBook(Book book) { return jdbcTemplate.update("UPDATE book SET name=?,author=? WHERE id=?", book.getName(), book.getAuthor(), book.getId()); } public int deleteBookById(Integer id) { return jdbcTemplate.update("DELETE FROM book WHERE id=?", id); } public Book getBookById(Integer id) { return jdbcTemplate.queryForObject("select * from book where id=?", new BeanPropertyRowMapper<>(Book.class), id); } public List<Book> getAllBooks() { return jdbcTemplate.query("select * from book", new BeanPropertyRowMapper<>(Book.class)); } }
Penjelasan kod:
Buat BookDao dan suntikan jdbcTemplate. Memandangkan kebergantungan berkaitan spring-jdbc telah ditambahkan, JdbcTemplate akan didaftarkan secara automatik dalam bekas Spring, jadi JdbcTemplate boleh disuntik terus di sini Gunakan
dalam JdbcTemplate untuk melaksanakan tiga jenis operasi: penambahan, pemadaman, dan pengubahsuaian digunakan terutamanya untuk melengkapkan kaedah kemas kini dan batchUpdate, kaedah pertanyaan dan queryForObject digunakan terutamanya untuk melengkapkan fungsi pertanyaan. Selain itu, terdapat juga kaedah laksana yang boleh digunakan untuk melaksanakan sql arbitrary, kaedah panggilan yang digunakan untuk memanggil prosedur tersimpan, dsb.
Apabila melaksanakan operasi pertanyaan, a RowMapper diperlukan untuk menggabungkan lajur yang ditanya dan Terdapat surat-menyurat satu dengan satu antara atribut dalam kelas entiti. Jika nama lajur dan nama atribut adalah sama, anda boleh menggunakan BeanPropertyRowMapper secara langsung jika nama lajur dan nama atribut berbeza, pembangun perlu melaksanakan antara muka RowMapper untuk memetakan lajur dan atribut kelas entiti satu-ke-satu
Buat BookService dan BooKController
@Service public class BookService { @Autowired BookDao bookDao; public int addBook(Book book) { return bookDao.addBook(book); } public int updateBook(Book book) { return bookDao.updateBook(book); } public int deleteBookById(Integer id) { return bookDao.deleteBookById(id); } public Book getBookById(Integer id) { return bookDao.getBookById(id); } public List<Book> getAllBooks() { return bookDao.getAllBooks(); } }
@RestController public class BookController { @Autowired BookService bookService; @GetMapping("/bookOps") public void bookOps() { Book b1 = new Book(); b1.setId(99); b1.setName("西厢记"); b1.setAuthor("王实甫"); int i = bookService.addBook(b1); System.out.println("addBook>>>" + i); Book b2 = new Book(); b2.setId(1); b2.setName("朝花夕拾"); b2.setAuthor("鲁迅"); int updateBook = bookService.updateBook(b2); System.out.println("updateBook>>>"+updateBook); Book b3 = bookService.getBookById(1); System.out.println("getBookById>>>"+b3); int delete = bookService.deleteBookById(2); System.out.println("deleteBookById>>>"+delete); List<Book> allBooks = bookService.getAllBooks(); System.out.println("getAllBooks>>>"+allBooks); } }
Akhir sekali lawati alamat http://localhost:8081/bookOps dalam penyemak imbas, cetakan konsol log adalah seperti berikut:
Data berikut dalam pangkalan data :addBook>>>1
updateBook>>>1
getBookById>>>com.sang.Book@35deleteBookById>>>1
getAllBooks>>>[com.sang.Book@2f7c2d6d, com.sang.Book@32db4b36]
Atas ialah kandungan terperinci Bagaimana Spring Boot menyepadukan JdbcTemplate. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!