java technology --SpringBoot visit with JdbcTemplates Mysql (05)

1. Initialize mysql: database creation, data sheets, database preparation
2. Create Project

(1)引入数据库操作相关依赖:
          <!--引入spring-boot-starter-jdbc的依赖-->
          <dependency>
	   		  <groupId>org.springframework.boot</groupId>
			  <artifactId>spring-boot-starter-jdbc</artifactId>
		  </dependency>
          <!--引入MySQL Driver驱动包-->		
          <dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<scope>runtime</scope>
		</dependency>
		<!-- 阿里系的Druid连接池依赖包 -->
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>druid</artifactId>
			<version>1.0.29</version>
		</dependency>
(2)配置相关文件
   <1>在application.properties文件配置mysql相关信息
      1.驱动配置信息
        # mysql的驱动类
        spring.datasource.driver-class-name=com.mysql.jdbc.Driver
        # 数据库地址
        spring.datasource.url=jdbc:mysql://localhost:3306/test
        # 数据库账号
        spring.datasource.username=root
        #数据库密码
        spring.datasource.password=123456
      2.连接池的配置信息
       # 初始化大小,最小,最大
       spring.datasource.initialSize=5
       spring.datasource.minIdle=5
       spring.datasource.maxActive=20
       # 配置获取连接等待超时的时间
       spring.datasource.maxWait=60000
       # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
       spring.datasource.timeBetweenEvictionRunsMillis=60000
       # 配置一个连接在池中最小生存的时间,单位是毫秒
       spring.datasource.minEvictableIdleTimeMillis=300000
       spring.datasource.validationQuery=SELECT 1 FROM DUAL
       spring.datasource.testWhileIdle=true
       spring.datasource.testOnBorrow=false
       spring.datasource.testOnReturn=false
       # 打开PSCache,并且指定每个连接上PSCache的大小
       spring.datasource.poolPreparedStatements=true
       spring.datasource.maxPoolPreparedStatementPerConnectionSize=20
       # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
       spring.datasource.filters=stat,wall,log4j
       # 通过connectProperties属性来打开mergeSql功能;慢SQL记录
       spring.datasource.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
   <2>通过引入这些依赖和配置一些基本信息,springboot就可以访问数据库类   	

3. Specific coding

1)实体类:
    public class Student {
       private int id ;
       private String name ;
      ....省略了getter. setter}2)dao层
    <1>dao层接口:
      public interface StudentDAO {
         int add(Student student );
         int update(Student student );
         int delete(int id);
         Student findStudentById(int id);
         List<Student > findStudentList();}
    <2>dao层接口的实现类:
         @Repository
         public class AccountDaoImpl implements IAccountDAO {
         @Autowired
         private JdbcTemplate jdbcTemplate;
         @Override
         public int add(Student student ) {
             return jdbcTemplate.update("insert into account(name) values(?)",
              account.getName(),account.getMoney());}
         @Override
         public int update(Student student) {
             return jdbcTemplate.update("UPDATE student SET NAME=? WHERE id=?",
                student.getName(),student.getId());}
         @Override
         public int delete(int id) {
             return jdbcTemplate.update("DELETE from TABLE student where id=?",id);}
         @Override
         public Student findStudentById(int id) {
            List<Student > list = jdbcTemplate.query("select * from student where id = ?", new Object[]{id}, new BeanPropertyRowMapper(Student.class));
            if(list!=null && list.size()>0){
                Student student = list.get(0);
                return student;}else{return null;}}
         @Override
         public List<Student> findStudentList() {
        List<Student> list = jdbcTemplate.query("select * from student", new Object[]{}, new   BeanPropertyRowMapper(Student.class));
        if(list!=null && list.size()>0){return list;}else{return null;}}}3)service层
    <1>service层接口:
    public interface StudentService {
       int add(Student student );
       int update(Student student);
       int delete(int id);
       Student findStudentById(int id);
       List<Student > findStudentList();}
    <2>service层接口的实现类:
    @Service
    public class StudentServiceImpl implements StudentService {
       @Autowired
       StudentDAO studentDAO ;
       @Override
       public int add(Student student) {
          return studentDAO.add(student);}
       @Override
       public int update(Student student) {
          return studentDAO.update(student);}
       @Override
       public int delete(int id) {
          return studentDAO.delete(id);}
       @Override
       public Student findStudentById(int id) {
          return studentDAO.findStudentById(id);}
       @Override
       public List<Student> findStudentList() {
          return studentDAO.findStudentList();}}4)controller层:构建一组restful api来展示
       @RestController
       @RequestMapping("/student")
       public class StudentController {
           @Autowired
           StudentService studentService;
       @RequestMapping(value = "/list",method = RequestMethod.GET)
       public  List<Student> getStudents(){
       return studentService.findStudentList();}
       @RequestMapping(value = "/{id}",method = RequestMethod.GET)
       public  Account getStudentById(@PathVariable("id") int id){
          return studentService.findStudentById(id);}

       @RequestMapping(value = "/{id}",method = RequestMethod.PUT)
       public  String updateStudent(@PathVariable("id")int id , 
            @RequestParam(value = "name",required = true)String name){
        Student student=new Student();
            student.setId(id);
            student.setName(name);
        int t=studentService.update(student);
        if(t==1){return student.toString();}else {return "fail";}}
        
      @RequestMapping(value = "",method = RequestMethod.POST)
      public String postStudent( @PathVariable("id")int id ,
                                 @RequestParam(value = "name")String name){
        Student student=new Student();
        student.setMoney(money);
        student.setName(name);
        int t= accountService.add(account);
        if(t==1){return student.toString();}else {return "fail";}}}

4. can be tested by postman, attention restful api style building
5. Springboot2.X version, the official database connection pool of recommended HikariCP (the default database connection pool)

(1)HikariCP的性能和并发性。如果有HikariCP,总是选择它
(2)否则,如果Tomcat池数据源可用,将使用它
(3)如果HikariCP和Tomcat池数据源都不可用,如果Commons DBCP2可用,将使用它
(4)如果springboot版本是2.X,当使用spring-boot-starter-jdbc依赖,springboot就会自动引入HikariCP的依赖了
(5)如果需要使用指定的数据库连接池
   5.1.需要在application.properties中配置:spring.datasource.type
   5.2.引入第三方数据库连接池依赖
Published 143 original articles · won praise 10 · views 7518

Guess you like

Origin blog.csdn.net/qq591009234/article/details/104016762