Spring5之JdbcTemplate

阅读: 评论:0

Spring5之JdbcTemplate

Spring5之JdbcTemplate

Spring5 之 JdbcTemplate

  • 概念
  • 如何使用?
    • 环境搭建
      • 搭建步骤
      • 具体实现
    • 新增操作
    • 修改操作 & 删除操作
    • 查询操作(返回某个值)
    • 查询操作(返回对象)
    • 查询操作(返回集合)
    • 批量新增操作
    • 批量修改 & 批量删除

概念

  • JdbcTemplate:JdbcTemplate 是 Spring 框架对 JDBC 进行的封装,使用 JdbcTemplate 方便实现对数据库的相关操作。

如何使用?

环境搭建

搭建步骤

  1. 引入相关 jar 包
  2. 在 Spring 配置文件中配置数据库连接池
  3. 配置 JdbcTemplate 对象,注入 DataSource
  4. 创建 service 类,创建 dao 类,在 dao 类中注入 jdbcTemplate 对象

具体实现

  • 1、引入相关 jar 包

  • 2、在 Spring 配置文件中配置数据库连接池

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns=""xmlns:xsi=""xmlns:context=""xsi:schemaLocation=" .xsd .xsd
    "><!-- 数据库连接池 --><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="clone"><property name="url" value="jdbc:mysql:///spring_test" /><property name="username" value="root" /><property name="password" value="123456" /><property name="driverClassName" value=&#sql.jdbc.Driver" /></bean>
    </beans>
    
  • 3、配置 JdbcTemplate 对象,注入 DataSource

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns=""xmlns:xsi=""xmlns:context=""xsi:schemaLocation=" .xsd .xsd
    "><!-- 数据库连接池 --><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="clone"><property name="url" value="jdbc:mysql:///spring_test" /><property name="username" value="root" /><property name="password" value="123456" /><property name="driverClassName" value=&#sql.jdbc.Driver" /></bean><!-- 创建 JdbcTemplate 对象 --><bean id="jdbcTemplate" class="org.JdbcTemplate"><!-- 注入 dataSource --><property name="dataSource" ref="dataSource" /></bean>
    </beans>
    
  • 4、创建 service 和 dao 类,在 dao 类中注入 JdbcTemplate 对象

    在配置文件中开启组件扫描(也可以使用配置类代替)

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns=""xmlns:xsi=""xmlns:context=""xsi:schemaLocation=" .xsd .xsd
    "><!-- 数据库连接池 --><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="clone"><property name="url" value="jdbc:mysql:///spring_test" /><property name="username" value="root" /><property name="password" value="123456" /><property name="driverClassName" value=&#sql.jdbc.Driver" /></bean><!-- 开启组件扫描 --><context:component-scan base-package="com.laoyang.spring" /><!-- 创建 JdbcTemplate 对象 --><bean id="jdbcTemplate" class="org.JdbcTemplate"><!-- 注入 dataSource --><property name="dataSource" ref="dataSource" /></bean>
    </beans>
    

    一定要记得引入 context 名称空间

    service类

    package com.laoyang.spring.service;import com.laoyang.spring.dao.BookDao;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;@Service
    public class BookService {/*** 注入 Dao*/@Autowiredprivate BookDao bookDao;
    }
    

    dao类(接口 & 实现类)

    package com.laoyang.spring.dao;public interface BookDao {
    }
    
    package com.laoyang.spring.dao;import org.springframework.beans.factory.annotation.Autowired;
    import org.JdbcTemplate;
    import org.springframework.stereotype.Repository;@Repository
    public class BookDaoImpl implements BookDao {/*** 注入 JdbcTemplate 对象*/@Autowiredprivate JdbcTemplate jdbcTemplate;
    }
    

新增操作

先提前准备好对应的数据库表t_book

虽然表名的意思是 “图书”,但是这里大伙可以理解为 “用户”,就当作是用户表来使用就好了,实在看不下去的可以将表名和实体类这些都改成 user

  • 1、对数据库表创建实体类

    package com.ity;/*** @ClassName Book* @Description: 用户类* @Author Laoyang* @Date 2021/12/20 20:04*/
    public class Book {/*** 用户id*/private String userId;/*** 用户名称*/private String username;/*** 用户状态*/private String ustatus;public String getUserId() {return userId;}public void setUserId(String userId) {this.userId = userId;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getUstatus() {return ustatus;}public void setUstatus(String ustatus) {this.ustatus = ustatus;}
    }
    
  • 2、编写 service 和 dao(在 dao 进行数据库添加操作)

    BookService 类:

    package com.laoyang.spring.service;import com.laoyang.spring.dao.BookDao;
    import com.ity.Book;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;@Service
    public class BookService {/*** 注入 Dao*/@Autowiredprivate BookDao bookDao;/*** 新增方法*/public void addUser(Book book) {bookDao.add(book);}
    }
    

    BookDao 接口:

    package com.laoyang.spring.dao;import com.ity.Book;public interface BookDao {/*** 添加用户* @param book*/void add(Book book);
    }
    

    BookDaoImpl 类:

    package com.laoyang.spring.dao;import com.ity.Book;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.JdbcTemplate;
    import org.springframework.stereotype.Repository;@Repository
    public class BookDaoImpl implements BookDao {/*** 注入 JdbcTemplate 对象*/@Autowiredprivate JdbcTemplate jdbcTemplate;/*** 添加用户* @param book*/@Overridepublic void add(Book book) {/*调用 jdbcTemplate 对象里面的 update(String sql,  args) 方法实现添加操作参数一:SQL 语句参数二:可变参数,设置 sql 中的语句值*/// 1、创建 sqlString sql = "insert into t_book values(?, ?, ?)";// 2、调用 update 方法实现Object[] books = {UserId(), Username(), Ustatus()};int insert = jdbcTemplate.update(sql, books);// 可以将可变参数封装到数组里面在传到方法中,也可以直接将参数传到方法中
    //        int insert = jdbcTemplate.update(sql, UserId(), Username(), Ustatus());if (insert > 0) {System.out.println("新增成功!");return;}System.out.println("新增失败!");}
    }
    
  • 3、测试效果

    package com.st;import com.laoyang.spring.dao.BookDao;
    import com.ity.Book;
    import com.laoyang.spring.service.BookService;
    import org.junit.Test;
    import t.ApplicationContext;
    import t.support.ClassPathXmlApplicationContext;public class JdbcTest {@Testpublic void testAddUser() {ApplicationContext context = new ClassPathXmlApplicationContext(&#l");BookService bookService = Bean("bookService", BookService.class);Book book = new Book();book.setUserId("1001");book.setUsername("Tom");book.setUstatus("A");bookService.addUser(book);}
    }
    

    添加成功后就可以查看数据库表中的数据了

修改操作 & 删除操作

说明:因为增删改的方式都差不多,就是修改一下语句就好了,所以这里直接把修改和删除一起演示

基于上面的实体类完成这两个操作

  • 编写 service 和 dao(在 dao 进行数据库添加操作)

    BookService类

    package com.laoyang.spring.service;import com.laoyang.spring.dao.BookDao;
    import com.ity.Book;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;@Service
    public class BookService {/*** 注入 Dao*/@Autowiredprivate BookDao bookDao;/*** 新增方法*/public void addBook(Book book) {bookDao.add(book);}/*** 修改方法*/public void updateBook(Book book) {bookDao.update(book);}/*** 删除方法*/public void deleteBook(String userId) {bookDao.delete(userId);}
    }
    

    BookDao 接口

    package com.laoyang.spring.dao;import com.ity.Book;public interface BookDao {/*** 添加用户* @param book*/void add(Book book);/*** 修改用户* @param book*/void update(Book book);/*** 删除用户* @param userId*/void delete(String userId);
    }
    

    BookDaoImpl 类

    package com.laoyang.spring.dao;import com.ity.Book;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.JdbcTemplate;
    import org.springframework.stereotype.Repository;@Repository
    public class BookDaoImpl implements BookDao {/*** 注入 JdbcTemplate 对象*/@Autowiredprivate JdbcTemplate jdbcTemplate;/*** 添加用户* @param book*/@Overridepublic void add(Book book) {/*调用 jdbcTemplate 对象里面的 update(String sql,  args) 方法实现添加操作参数一:SQL 语句参数二:可变参数,设置 sql 中的语句值*/// 1、创建 sqlString sql = "insert into t_book values(?, ?, ?)";// 2、调用 update 方法实现Object[] books = {UserId(), Username(), Ustatus()};int insert = jdbcTemplate.update(sql, books);// 可以将可变参数封装到数组里面在传到方法中,也可以直接将参数传到方法中
    //        int insert = jdbcTemplate.update(sql, UserId(), Username(), Ustatus());if (insert > 0) {System.out.println("新增成功!");return;}System.out.println("新增失败!");}/*** 修改用户* @param book*/@Overridepublic void update(Book book) {String sql = "update t_book set username=?, ustatus=? where user_id=?";Object[] books = {Username(), Ustatus(), UserId()};int update = jdbcTemplate.update(sql, books);if (update > 0) {System.out.println("修改成功!");return;}System.out.println("修改失败!");}/*** 删除用户* @param userId*/@Overridepublic void delete(String userId) {String sql = "delete from t_book where user_id = ?";int delet = jdbcTemplate.update(sql, userId);if (delet > 0) {System.out.println("删除成功!");return;}System.out.println("删除失败!");}
    }
    
  • 测试效果

    package com.st;import com.laoyang.spring.dao.BookDao;
    import com.ity.Book;
    import com.laoyang.spring.service.BookService;
    import org.junit.Test;
    import t.ApplicationContext;
    import t.support.ClassPathXmlApplicationContext;public class JdbcTest {// 修改操作@Testpublic void testUpdateUser() {ApplicationContext context = new ClassPathXmlApplicationContext(&#l");BookService bookService = Bean("bookService", BookService.class);Book book = new Book();book.setUserId("1001");book.setUsername("Jerry");book.setUstatus("C");bookService.updateBook(book);}// 删除操作@Testpublic void testDeleteUser() {ApplicationContext context = new ClassPathXmlApplicationContext(&#l");BookService bookService = Bean("bookService", BookService.class);bookService.deleteBook("1001");}
    }
    

查询操作(返回某个值)

案例:查询表中有多少个用户,返回的是某个值

  • 编写 service 和 dao(在 dao 进行数据库添加操作)
    BookService 类

    package com.laoyang.spring.service;import com.laoyang.spring.dao.BookDao;
    import com.ity.Book;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;@Service
    public class BookService {/*** 注入 Dao*/@Autowiredprivate BookDao bookDao;/*** 查询表中的用户总数*/public int findCount() {return bookDao.selectCount();}
    }
    

    BookDao 接口

    package com.laoyang.spring.dao;import com.ity.Book;public interface BookDao {/*** 查询表中的用户总数*/int selectCount();
    }
    

    BookDaoImpl 类

    package com.laoyang.spring.dao;import com.ity.Book;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.JdbcTemplate;
    import org.springframework.stereotype.Repository;@Repository
    public class BookDaoImpl implements BookDao {/*** 注入 JdbcTemplate 对象*/@Autowiredprivate JdbcTemplate jdbcTemplate;/*** 查询表中的用户总数*/@Overridepublic int selectCount() {/*调用 jdbcTemplate 对象里面的 queryForObject(String sql, Class<T> requiredType) 方法实现该操作参数一:sql 语句参数二:返回类型的 Class*/String sql = "select count(user_id) from t_book";Integer count = jdbcTemplate.queryForObject(sql, Integer.class);return count;}
    }
    
  • 测试效果

    package com.st;import com.laoyang.spring.dao.BookDao;
    import com.ity.Book;
    import com.laoyang.spring.service.BookService;
    import org.junit.Test;
    import t.ApplicationContext;
    import t.support.ClassPathXmlApplicationContext;public class JdbcTest {@Testpublic void testCount() {ApplicationContext context = new ClassPathXmlApplicationContext(&#l");BookService bookService = Bean("bookService", BookService.class);int count = bookService.findCount();System.out.println("当前表中还有" + count + "个用户。");}
    }
    

查询操作(返回对象)

案例:查询 id 为 1001 的用户详情

  • 因为需要查看对象数据,所以我们先给 Book 实体类编写一个 toString 方法

    package com.ity;/*** @ClassName Book* @Description: 用户类* @Author Laoyang* @Date 2021/12/20 20:04*/
    public class Book {//...此处为了简便省略前面的配置@Overridepublic String toString() {return "Book{" +"userId='" + userId + ''' +", username='" + username + ''' +", ustatus='" + ustatus + ''' +'}';}
    }
    
  • 编写 service 和 dao(在 dao 进行数据库添加操作)
    BookService 类

    package com.laoyang.spring.service;import com.laoyang.spring.dao.BookDao;
    import com.ity.Book;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;@Service
    public class BookService {/*** 注入 Dao*/@Autowiredprivate BookDao bookDao;/*** 查询 id 为 1001 的用户详情*/public Book findBookByUserId(String userId) {return bookDao.findBookByUserId(userId);}
    }
    

    BookDao 接口

    package com.laoyang.spring.dao;import com.ity.Book;public interface BookDao {/*** 查询 id 为 1001 的用户详情*/Book findBookByUserId(String userId);
    }
    

    BookDaoImpl 类

    package com.laoyang.spring.dao;import com.ity.Book;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.BeanPropertyRowMapper;
    import org.JdbcTemplate;
    import org.springframework.stereotype.Repository;@Repository
    public class BookDaoImpl implements BookDao {/*** 查询 id 为 1001 的用户详情*/@Overridepublic Book findBookByUserId(String userId) {/*调用 jdbcTemplate 对象里面的 queryForObject(String sql, RowMapper<T> rowMapper,  args) 方法实现该操作参数一:sql 语句参数二:rowMapper 是一个接口,针对返回不同类型的数据,使用这个接口里面的实现类完成数据封装参数三:可变参数*/String sql = "select user_id, username, ustatus from t_book where user_id=?";Book book = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<Book>(Book.class), userId);if (book != null) {return book;}return null;}
    }
    
  • 测试效果

    package com.st;import com.laoyang.spring.dao.BookDao;
    import com.ity.Book;
    import com.laoyang.spring.service.BookService;
    import org.junit.Test;
    import t.ApplicationContext;
    import t.support.ClassPathXmlApplicationContext;public class JdbcTest {@Testpublic void testBook() {ApplicationContext context = new ClassPathXmlApplicationContext(&#l");BookService bookService = Bean("bookService", BookService.class);Book book = bookService.findBookByUserId("1001");System.out.println(book);}
    }
    

查询操作(返回集合)

案例:查询所有用户信息

  • 编写 service 和 dao(在 dao 进行数据库添加操作)
    BookService 类

    package com.laoyang.spring.service;import com.laoyang.spring.dao.BookDao;
    import com.ity.Book;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import java.util.List;@Service
    public class BookService {/*** 注入 Dao*/@Autowiredprivate BookDao bookDao;/*** 查询所有用户信息*/public List<Book> findBookByAll() {return bookDao.findBookByAll();}
    }
    

    BookDao 接口

    package com.laoyang.spring.dao;import com.ity.Book;
    import java.util.List;public interface BookDao {/*** 查询所有用户信息*/List<Book> findBookByAll();
    }
    

    BookDaoImpl 类

    package com.laoyang.spring.dao;import com.ity.Book;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.BeanPropertyRowMapper;
    import org.JdbcTemplate;
    import org.springframework.stereotype.Repository;
    import java.util.ArrayList;
    import java.util.List;@Repository
    public class BookDaoImpl implements BookDao {/*** 注入 JdbcTemplate 对象*/@Autowiredprivate JdbcTemplate jdbcTemplate;/*** 查询所有用户信息*/@Overridepublic List<Book> findBookByAll() {/*调用 jdbcTemplate 对象里面的 query(String sql, RowMapper<T> rowMapper,  args) 方法实现该操作参数一:sql 语句参数二:rowMapper 是一个接口,针对返回不同类型的数据,使用这个接口里面的实现类完成数据封装参数三:可变参数,可选*/String sql = "select user_id, username, ustatus from t_book";List<Book> books = jdbcTemplate.query(sql, new BeanPropertyRowMapper<Book>(Book.class));if (!books.isEmpty()) {return books;}return null;}
    }
    
  • 测试效果

    package com.st;import com.laoyang.spring.dao.BookDao;
    import com.ity.Book;
    import com.laoyang.spring.service.BookService;
    import org.junit.Test;
    import t.ApplicationContext;
    import t.support.ClassPathXmlApplicationContext;
    import java.util.Arrays;
    import java.util.List;public class JdbcTest {@Testpublic void testBookAll() {ApplicationContext context = new ClassPathXmlApplicationContext(&#l");BookService bookService = Bean("bookService", BookService.class);List<Book> books = bookService.findBookByAll();System.out.println(books);}
    }
    

批量新增操作

批量操作:操作表里面的多条记录

  • 编写 service 和 dao(在 dao 进行数据库添加操作)
    BookService 类

    package com.laoyang.spring.service;import com.laoyang.spring.dao.BookDao;
    import com.ity.Book;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import java.util.List;@Service
    public class BookService {/*** 注入 Dao*/@Autowiredprivate BookDao bookDao;/*** 批量新增用户*/public void addBooksInBulk(List<Object[]> books) {bookDao.addBooksInBulk(books);}
    }
    

    BookDao 接口

    package com.laoyang.spring.dao;import com.ity.Book;
    import java.util.List;public interface BookDao {/*** 批量新增用户* @param books*/void addBooksInBulk(List<Object[]> books);
    }
    

    BookDaoImpl 类

    package com.laoyang.spring.dao;import com.ity.Book;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.BeanPropertyRowMapper;
    import org.JdbcTemplate;
    import org.springframework.stereotype.Repository;
    import java.util.ArrayList;
    import java.util.List;@Repository
    public class BookDaoImpl implements BookDao {/*** 注入 JdbcTemplate 对象*/@Autowiredprivate JdbcTemplate jdbcTemplate;/*** 批量新增用户* @param books*/@Overridepublic void addBooksInBulk(List<Object[]> books) {/*调用 jdbcTemplate 对象里面的 batchUpdate(String sql, List<Object[]> batchArgs) 方法实现该操作参数一:sql语句参数二:List集合,添加多条的数据*/String sql = "insert into t_book values(?, ?, ?)";int[] adds = jdbcTemplate.batchUpdate(sql, books);if (adds != null && adds.length > 0) {System.out.println("批量添加成功!");return;}System.out.println("批量添加失败!");}
    }
    
  • 测试效果

    package com.st;import com.laoyang.spring.dao.BookDao;
    import com.ity.Book;
    import com.laoyang.spring.service.BookService;
    import org.junit.Test;
    import t.ApplicationContext;
    import t.support.ClassPathXmlApplicationContext;
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;public class JdbcTest {@Testpublic void testAddBooks() {ApplicationContext context = new ClassPathXmlApplicationContext(&#l");BookService bookService = Bean("bookService", BookService.class);List<Object[]> bookList = new ArrayList<>();Object[] bookArray1 = {"1003", "Mel", "C"};Object[] bookArray2 = {"1004", "Jack", "B"};bookList.add(bookArray1);bookList.add(bookArray2);bookService.addBooksInBulk(bookList);}
    }
    

批量修改 & 批量删除

  • 编写 service 和 dao(在 dao 进行数据库添加操作)
    BookService 类

    package com.laoyang.spring.service;import com.laoyang.spring.dao.BookDao;
    import com.ity.Book;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import java.util.List;@Service
    public class BookService {/*** 注入 Dao*/@Autowiredprivate BookDao bookDao;/*** 批量修改用户*/public void updateBooksInBulk(List<Object[]> books) {bookDao.updateBooksInBulk(books);}/*** 批量删除用户*/public void deleteBooksInBulk(List<Object[]> userIds) {bookDao.deleteBooksInBulk(userIds);}
    }
    

    BookDao 接口

    package com.laoyang.spring.dao;import com.ity.Book;
    import java.util.List;public interface BookDao {/*** 批量修改用户*/void updateBooksInBulk(List<Object[]> books);/*** 批量删除用户*/void deleteBooksInBulk(List<Object[]> userIds);
    }
    

    BookDaoImpl 类

    package com.laoyang.spring.dao;import com.ity.Book;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.BeanPropertyRowMapper;
    import org.JdbcTemplate;
    import org.springframework.stereotype.Repository;
    import java.util.ArrayList;
    import java.util.List;@Repository
    public class BookDaoImpl implements BookDao {/*** 注入 JdbcTemplate 对象*/@Autowiredprivate JdbcTemplate jdbcTemplate;/*** 批量修改用户*/@Overridepublic void updateBooksInBulk(List<Object[]> books) {String sql = "update t_book set username = ?, ustatus = ? where user_id = ?";int[] updates = jdbcTemplate.batchUpdate(sql, books);if (updates != null && updates.length > 0) {System.out.println("批量修改成功!");return;}System.out.println("批量修改失败!");}/*** 批量删除用户*/@Overridepublic void deleteBooksInBulk(List<Object[]> userIds) {String sql = "delete from t_book where user_id = ?";int[] deletes = jdbcTemplate.batchUpdate(sql, userIds);if (deletes != null && deletes.length > 0) {System.out.println("批量删除成功!");return;}System.out.println("批量删除失败!");}
    }
    
  • 测试效果

    package com.st;import com.laoyang.spring.dao.BookDao;
    import com.ity.Book;
    import com.laoyang.spring.service.BookService;
    import org.junit.Test;
    import t.ApplicationContext;
    import t.support.ClassPathXmlApplicationContext;
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;public class JdbcTest {@Testpublic void testUpdateBooks() {ApplicationContext context = new ClassPathXmlApplicationContext(&#l");BookService bookService = Bean("bookService", BookService.class);List<Object[]> bookList = new ArrayList<>();Object[] bookArray1 = {"Ronaldinho", "A", "1003"};Object[] bookArray2 = {"lamb", "A", "1004"};bookList.add(bookArray1);bookList.add(bookArray2);bookService.updateBooksInBulk(bookList);}@Testpublic void testDeleteBooks() {ApplicationContext context = new ClassPathXmlApplicationContext(&#l");BookService bookService = Bean("bookService", BookService.class);List<Object[]> bookList = new ArrayList<>();Object[] bookArray1 = {"1003"};Object[] bookArray2 = {"1004"};bookList.add(bookArray1);bookList.add(bookArray2);bookService.deleteBooksInBulk(bookList);}
    }
    

本文发布于:2024-02-04 22:13:34,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170717592760072.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:JdbcTemplate
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23