洋洋洒洒之四,体系之3

上1篇大家讲了spring boot
整合JdbcTemplate来实行数量的持久化,

前方两篇文章大家讲了两件工作:

澳门葡京备用网址, spring-data-jpa官方使用验证文书档案:洋洋洒洒之四,体系之3。https://docs.spring.io/spring-data/jpa/docs/current/reference/html/

前边小说整合过了ssm的,是相对spring的,可是在前些天微服务流行之际,为了往背后的springcloud发展学习,先读书一下springboot,在学习的进度中用spring
boot+spring mvc+mybatis举行搭建接口平台。

那篇大家的话下怎么通过spring boot 整合JPA来兑现多少的长久化。

  1. 经过2个简易实例进行spring boot
    入门
  2. 修改spring boot 默许的服务端口号和暗许context
    path

 spring-data-jpa的选择表达:https://www.cnblogs.com/WangJinYang/p/4257383.html

spring boot:Spring
Boot是由Pivotal共青团和少先队提供的斩新框架,其安顿指标是用来简化新Spring应用的开首搭建以及支付进度。该框架使用了一定的法子来开始展览安顿,从而使开辟人士不再须要定义样板化的布置。通过这种情势,Spring
Boot致力于在旭日初升的快速利用开辟领域(rapid application
development)成为领导者。。

壹、代码实现 

那篇小说我们来看下怎么通过JdbcTemplate举行数量的长久化。

spring-data-jpa
API地址:https://docs.spring.io/spring-data/data-jpa/docs/current/api/

  1. 创设独立的Spring应用程序
  2. 放置的汤姆cat,无需安排WA奥迪Q五文件
  3. 开箱即用,提供种种暗中认可配置来简化项目布局
  4. 未曾冗余代码生成和XML配置的要求
  1. 修改pom,引进依赖

      <!-- 引入jpa 依赖 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-jpa</artifactId>
            </dependency>
    
  2. 修改application.properties,配置相关新闻

    #修改tomcat默认端口号
    server.port=8090
    #修改context path
    server.context-path=/test
    
    #配置数据源信息
    spring.datasource.driver-class-name=com.mysql.jdbc.Driver
    spring.datasource.url=jdbc:mysql://localhost:3306/test
    spring.datasource.username=root
    spring.datasource.password=root
    #配置jpa
    spring.jpa.hibernate.ddl-auto=update
    spring.jpa.show-sql=true
    spring.jackson.serialization.indent_output=true
    
  3. 创造实体类

    package com.study.entity;
    
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    import javax.persistence.Table;
    
    @Entity
    @Table(name="t_user")
    public class User {
    
        @Id @GeneratedValue(strategy=GenerationType.AUTO)
        private Integer id;
        private String userName;
        private String password;
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getUserName() {
            return userName;
        }
    
        public void setUserName(String userName) {
            this.userName = userName;
        }
    
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    
    }
    
  4. 创建repository接口并一而再CrudRepository

    package com.study.repository;
    
    import org.springframework.data.jpa.repository.Query;
    import org.springframework.data.repository.CrudRepository;
    import org.springframework.data.repository.query.Param;
    
    import com.study.entity.User;
    
    /**
     * 注意:
     * 1.这里这里是interface,不是class
     * 
     * 2.CrudRepository里面的泛型,第一个是实体类,第二个是主键的类型
     * 
     * 3.由于crudRepository 里面已经有一些接口了,如deleteAll,findOne等, 我们直接调用即可
     * 
     * 4.当然,我们也可以根据自己的情况来实现自己的接口,如下面的getUser()方法,jpql语句和hql语句差不多
     * 
     * */
    public interface UserRepository extends CrudRepository<User, Integer> {
    
        /**
         * 我们这里只需要写接口,不需要写实现,spring boot会帮忙自动实现
         * 
         * */
    
        @Query("from User where id =:id ")
        public User getUser(@Param("id") Integer id);
    }
    
  5. 创建service

    1. 接口

      package com.study.service;
      
      import com.study.entity.User;
      

废话不多说,直接上干货。

参谋地址:http://blog.didispace.com/springbootdata2/

以笔者之见,spring
boot并不是什么样新的框架,它只是默许配置了大多框架的行使方法;类似于maven整合了jar,而spring
boot整合了广大的框架。从本质上来说,spring
boot正是spring,它做了那几个你需求去做的纵横交错配置。它采纳“习贯优于配备”的意见令你的项目长足运转起来。

        public interface UserService {
            public User getUser(Integer id);
        }

2.  实现
        package com.study.service.impl;

        import org.springframework.beans.factory.annotation.Autowired;
        import org.springframework.stereotype.Service;

        import com.study.entity.User;
        import com.study.repository.UserRepository;
        import com.study.service.UserService;

        @Service
        public class UserServiceImpl implements UserService {

            @Autowired
            UserRepository repository;

            @Override
            public User getUser(Integer id) {
                //有两种方式:
                //1.调用crudRepository的接口
        //        return repository.findOne(id);
                //2.调用我们自己写的接口
                return repository.getUser(id);
            }


        }

一、代码达成

 ===============================================================================================

  1. 配置web.xml,加载spring和spring mvc
  2. 配备数据库连接、配置spring事务
  3. 安插加载配置文件的读取,开启表明
  4. 配置日志文件……配置达成后布署tomcat调节和测试…
  1. 创建controller

    package com.study.controller;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    import com.study.entity.User;
    import com.study.service.UserService;
    
    @RestController
    public class UserController {
        @Autowired
        UserService service;
    
        @RequestMapping("/getUser/{id}")
        public User getUser(@PathVariable("id") Integer id){
    
            return service.getUser(id);
        }
    }
    
  2. 测试,页面以json格式显示数据库值

  1. 修改pom文件,引进相关注重

    <!-- 引入jdbc 依赖 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-jdbc</artifactId>
            </dependency>
            <!-- 引入 mysql 数据库连接依赖-->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
            </dependency>
    
  2. 配备数据库信息,在application.properties中增加如下内容:

    spring.datasource.driver-class-name=com.mysql.jdbc.Driver
    spring.datasource.url=jdbc:mysql://localhost:3306/test
    spring.datasource.username=root
    spring.datasource.password=root
    
  3. 创制实体类并创制数据库

    1. 实体类
      澳门葡京备用网址 1澳门葡京备用网址 2

      package com.study.entity;
      
      public class User {
      
          private Integer id;
          private String userName;
          private String password;
      
          public Integer getId() {
              return id;
          }
      
          public void setId(Integer id) {
              this.id = id;
          }
      
          public String getUserName() {
              return userName;
          }
      
          public void setUserName(String userName) {
              this.userName = userName;
          }
      
          public String getPassword() {
              return password;
          }
      
          public void setPassword(String password) {
              this.password = password;
          }
      
      }
      

      View Code

    2. 数据库

      1. 澳门葡京备用网址 3
  4. 实现dao层

    @Repository
    public class UserDao {
    
        @Autowired
        JdbcTemplate jdbcTemplate;
    
        public void save(User user) {
            String sql = "insert into t_user(user_name, password) values(?,?)";
            jdbcTemplate.update(sql, user.getUserName(), user.getPassword());
        }
    }
    
  5. 实现service层

    1. 接口

      public interface UserService {
      
          public void save(User user);
      }
      
    2. 实现类

      @Service
      public class UserServiceImpl implements UserService {
      
          @Autowired
          UserDao userDao;
      
          public void save(User user){
              userDao.save(user);
          }
      
      }
      
  6. 实现controller层

    @RestController
    public class UserController {
        @Autowired
        UserService service;
    
        @RequestMapping("/saveUser")
        public String saveUser(User user) {
    
            service.save(user);
            return "save user successful";
        }
    }
    
  7. 测试

    1. 页面正确重回新闻澳门葡京备用网址 4
    2. 数据库精确保存澳门葡京备用网址 5

spring
boot搭建项目后,想要数据举行长久化操作,更进一步的一应俱全项目以来,就要动用到3个有血有肉的O酷威M了。而spring
boot中全面包车型客车支撑了spring-data-jpa。

只需求非常少的多少个布局就能够快速方便的搭建起来壹套web项目仍旧是创设二个微服务!下边就让我们1块来驾驭spring
boot的魔力

    澳门葡京备用网址 6

二、总结

那壹篇就采纳spring-data-jpa实行入门的多少长久化管理

全套项目选择maven营造,有关idea集成maven、jdk、tomcat等可翻自家上1篇小说。

二、知识点引申

通过大家开掘,spring boot
只是简化了xml的布局部麻醉烦,并从未减掉大家java代码的编写量。

===============================================================================================

  1. 访问 :
  2. 选料营造筑工程具maven、语言java、版本一.五.10

有关Repository知识点,能够去看下上面这篇小说

spring boot 不是spring 成效的增高,而是提供了1种高效利用spring
的方法:开箱即用,未有代码生成,也没有需求XML配置。

本篇数据库使用mysql,所以pom参预依赖须要多少个

澳门葡京备用网址 7initializr.png

澳门葡京备用网址 8澳门葡京备用网址 9

  1. 点击Generate Project下载项目压缩包
  2. 解压项目,导入进idea,说一下粗略步骤

 

<!--jpa  hibernate-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <!--mysql连接架包-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
  1. File -> New -> Project from Existing Sources
  2. 选料你解压的品种文件夹
  3. 点击OK
  4. 采用Import project from external
    model并接纳Maven,点击Next到底得了。

View Code

若在项目编写翻译进度中,境遇[Information:java: javacTask: 源发行版 壹.八须要目的发行版 一.八]本条颠倒是非,可遵从如下改造,这里本人联合改为了壹.柒

 

一,Project Structure里确认五个地点:Project sdk以及project language
level二,Project Structure->Modules里Sources里的Language
level三,Preferences->java Compiler->Per-module bytecode Version

协会如下:

至此基础项目打算达成,运维一下品类

【entity与domain,dao与repository的差别是何许,看附录2】

澳门葡京备用网址 10image.png

 澳门葡京备用网址 11

眼见Spring Boot这一个图案表达基础项目搭建成功。

计划文件application.properties

澳门葡京备用网址 12类型结构.png

【在首次运行之后,将spring.jpa.hibernate.ddl-auto=create
修改为spring.jpa.hibernate.ddl-auto=update,以防后一次运维重新创造全部的数据表】

系统总体架构为springboot+springmvc+mybatis,restful的接口风格。只是二个演示项目,也从没实行模块分包。整个结构的话依旧controller、service、dao的三层构造。在那其间dao层多写了叁个接口和落到实处。对于service层未有写接口,因为自身觉着简单的事体没要求写接口(包蕴这里的dao也是)。笔者也一贯在思量,对于service和dao层,到底需无需接口和贯彻。英特网查了1部分,有些是乱说了一批“接口和落到实处分离”、“面向接口编制程序”、“设计方式”、“解耦”等,不过也没说出个所以然;有些是说没要求分离,只怕看系统架构。自个儿也是涉世不多,不知情确切的区分或许说有哪些效用上的分裂。这些待作者今后逐步储存,有机遇咨询长者学习,或许争论区静待大神的解答。

【或然直接将值设置为update,也是足以兑现第贰次创造表,且之后实体字段变化或新增添实体,都会活动在数据库中创新且不会去除原来的表和数据,所以提议直接采纳update,可是不会打字与印刷成立表的sql语句】

springboot 遵守”习贯优于配备”原则,使用Spirng
Boot只需很少的配备,大部分时候能够采纳私下认可配置。使用INITIALIZ奥迪Q7工具创立的springboot项目,暗中同意会在resource目录下开创application.properties文件,别的也得以应用yml类型的布局文件取代properties文件。在此处本身是运用的是yml文件。

【application.properties字段详解请看:http://www.cnblogs.com/sxdcgaq8080/p/7890218.html】

spring: datasource: # 驱动配置信息 url: jdbc:mysql://localhost:3306/spring_boot?useUnicode=true&characterEncoding=utf8 username: root password: root type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.jdbc.Driver # 连接池的配置信息 filters: stat maxActive: 20 initialSize: 1 maxWait: 60000 minIdle: 1 timeBetweenEvictionRunsMillis: 60000 minEvictableIdleTimeMillis: 300000 validationQuery: select 'x' testWhileIdle: true testOnBorrow: false testOnReturn: false poolPreparedStatements: true maxOpenPreparedStatements: 20

澳门葡京备用网址 13澳门葡京备用网址 14

此地关键便是陈设了Ali的druid连接池音信。上边的即是项目和驱动那个,然后正是mysql数据库的url、用户名和密码,相应改成本身的就行。上边的是druid的参数配置项,这里随意设置了有的,具体可详查Druid。

#view
spring.mvc.view.prefix = /WEB-INF/views/
spring.mvc.view.suffix = .jsp


#datasource
spring.datasource.continue-on-error=false 
spring.datasource.url=jdbc:mysql://localhost:3306/orderdiscount
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

spring.jpa.database=mysql
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=create
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD SQL Map Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration> <settings> <setting name="cacheEnabled" value="true" /><!-- 全局映射器启用缓存 --> <setting name="useGeneratedKeys" value="true" /> <!--把新增加的主键赋值到自己定义的keyProperty中--> <setting name="defaultExecutorType" value="REUSE" /> <!--配置和设定执行器--> <setting name="logImpl" value="STDOUT_LOGGING"/> <!--打印sql语句在控制台--> </settings> <typeAliases> <package name="com.bgy.springboot.model"/> </typeAliases></configuration>

View Code

其壹布局首要正是有关mybatis的配备了,这里就提两点,3个是setting里面包车型大巴logImpl配置,能够把实施的sql语句打字与印刷在调节台,便于排查sql错误;三个是行使typeAliases标签成分来对品种实行外号调整,也正是给现实的实体类多个别称,不用写完整路线。具体行使在末端mapper中会讲到。

日记配置文件 logback-spring.xml

如上正是其一类型近来应用的三个布局了,是否比起spring来讲省事多了。

【日志文件详解请看:http://www.cnblogs.com/sxdcgaq8080/p/7852858.html】

<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.bgy</groupId> <artifactId>springboot</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>springboot</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.10.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.7</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!--自己添加的包--> <dependency> <!-- spring boot 引入Web模块。自动配置:tomcat、springmvc、jackson等 --> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <artifactId>spring-boot-starter-logging</artifactId> <groupId>org.springframework.boot</groupId> </exclusion> </exclusions> </dependency> <!-- log4j2 依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency> <!-- springboot 依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>1.3.6.RELEASE</version> </dependency> <!-- 阿里druid连接池依赖 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.0.11</version> </dependency> <!-- mysql 依赖--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <!--mybatis依赖--> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.0</version> </dependency> <!--redis--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-redis</artifactId> <version>1.3.8.RELEASE</version> </dependency> <!-- fastJson --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.1.27</version> </dependency> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> </dependency> <!--aop--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> <dependency> <groupId>net.minidev</groupId> <artifactId>json-smart</artifactId> <version>RELEASE</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build></project>

澳门葡京备用网址 15澳门葡京备用网址 16

那几个正是近些日子项目中用到的有些maven注重了。

<?xml version="1.0" encoding="UTF-8"?>

<configuration scan="true" scanPeriod="60 seconds" debug="false">

    <contextName>logback</contextName>
    <!--定义日志文件的存储地址目录-->
    <property name="LOG_HOME" value="E:/log/"/>


    <!--输出到控制台-->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>
        <withJansi>true</withJansi>
        <encoder>
            <!--<pattern>%d %p (%file:%line\)- %m%n</pattern>-->
            <!--格式化输出:%d:表示日期    %thread:表示线程名     %-5level:级别从左显示5个字符宽度  %msg:日志消息    %n:是换行符-->
            <pattern>%black(控制台-) %red(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger) - %cyan(%msg%n)</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!--输出到文件-->
    <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">

        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}logback.%d{yyyy-MM-dd-HH-mm}[%i].log</fileNamePattern>
            <maxFileSize>10kb</maxFileSize>
            <maxHistory>30</maxHistory>
            <totalSizeCap>1GB</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <!--格式化输出:%d:表示日期    %thread:表示线程名     %-5level:级别从左显示5个字符宽度  %msg:日志消息    %n:是换行符-->
            <pattern>文件记录-%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger - %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <root level="info">
        <appender-ref ref="console" />
        <appender-ref ref="file" />
    </root>

    <logger name="com.sxd.controller"/>
    <logger name="com.sxd.util.LogTestController" level="WARN" additivity="false">
        <appender-ref ref="console" />
    </logger>



</configuration>
@Configuration@MapperScan(basePackages = "com.bgy.springboot.dao",sqlSessionTemplateRef = "dbSqlSessionTemplate")public class DbDataSource { @Bean(name="dbData") @ConfigurationProperties(prefix = "spring.datasource") public DataSource dbDataSource() { return DataSourceBuilder.create; } @Bean(name = "dbSqlSessionFactory") public SqlSessionFactory dbSqlSessionFactory(@Qualifier DataSource dataSource) throws Exception { SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); sqlSessionFactoryBean.setDataSource(dataSource); sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/*.xml")); sqlSessionFactoryBean.setConfigLocation( new ClassPathResource("mybatis-config.xml")); return sqlSessionFactoryBean.getObject(); } @Bean(name="dbSqlSessionTemplate") public SqlSessionTemplate dbSqlSessionTemplate(@Qualifier("dbSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception{ return new SqlSessionTemplate(sqlSessionFactory); } @Bean(name = "dbTransactionManager") public DataSourceTransactionManager dataSourceTransactionManager(@Qualifier DataSource dataSource) throws Exception { return new DataSourceTransactionManager(dataSource); }}

View Code

SqlSessionTemplate是MyBatis提供的持久层访问模板化的工具,那么些类担任管理MyBatis的SqlSession,用于调用MyBatis的SQL方法。因为SqlSessionTemplate是线程安全的,能够被四个DAO所共享应用,所以项目中只建构了1个SqlSessionTemplate。

 

在那边运用的是mybatis注脚需求的布局。mybatis三方始协理java注脚,使用java声明能够替代xml配置文件,简化代码。上边的代码中,使用@MapperScan来围观注册mybatis数据库接口类,在那之中basePackages属性注解接口类所在的包,sqlSessionTemplateRef声明接口类使用的SqlSessionTemplate。

要想和数据库打交道,这里还是关系型数据库,那就来个实体和数据库的表对应起来

@Configuration
表明那是一个布署类约等于xml配置文件,@Bean表示这是二个Spring管理的bean。@ConfigurationProperties用于装载yml的配置音信

实体User.java

那其间其余有关SqlSessionTemplate的用法和细节就不壹壹讲了,不精晓的可百度学习一下SqlSessionTemplate。提一下setMapperLocations是用以加载以xml结尾的mapper配置文件,这里注意路线就行了,根路线是resources。setConfigLocation是加载mybatis的安顿文件mybatis-config.xml。

澳门葡京备用网址 17澳门葡京备用网址 18

以此在上篇著作已经介绍过成效,正是有利于对sql语句的查阅和修改。

package com.sxd.entity;



import org.hibernate.annotations.GenericGenerator;

import javax.persistence.*;

@Entity
@GenericGenerator(name = "uuid2", strategy = "org.hibernate.id.UUIDGenerator" )
public class User {
    private String id;
    private String username;
    private String password;
    private Integer age;

    @Id
    @GeneratedValue(generator = "uuid2")
    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    @Column(nullable = false)
    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    @Column(nullable = false)
    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Column(nullable = false)
    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public User() {

    }

    public User(String id, String username, String password, Integer age) {
        this.id = id;
        this.username = username;
        this.password = password;
        this.age = age;
    }
}
DROP TABLE IF EXISTS `user`;CREATE TABLE `user` ( `id` VARCHAR  NOT NULL , `user_name` VARCHAR  , `nick_name` VARCHAR , `password` CHAR , `email` VARCHAR , `phone` VARCHAR , `sex` ENUM('S_MALE','S_FEMALE','S_BM'), `status` ENUM('S_OFF','S_NORMAL'), `avatar` VARCHAR , `remarks` VARCHAR , `add_at` BIGINT, `update_at` BIGINT, PRIMARY KEY  DEFAULT CHARSET=utf8;

View Code

此处表名和字段与上一篇小说相比较修改了部分,因为看了《AlibabaJava开垦手册》中写道:

spring-data-jpa的优势显示正是底下这一个接口啦!!

表名、字段名必须使用小写字母或数字,禁止现身数字开始,禁止四个下划线中间只出现数字。数据库字段名的更换代价非常的大,因为无法进展预透露,所以字段名称要求慎重思量。
表明:MYSQL在Windows下不区分轻重缓急写,但在Linux上暗许区分轻重缓急写。因而,数据库名、表名、字段名都不允许出现别的大写字母,幸免大惊小怪。

【spring-data-jpa的详尽介绍和复杂性使用http://www.cnblogs.com/sxdcgaq8080/p/7894828.html】

确立一个MUser的实体类

Dao层放在repository目录下  接口UserRepository.java

public class MUser { private String id; private String userName; private String nickName; private String password; private String email; private String phone; private String sex; private String status; private String avatar; private String remarks; private Long addAt; public MUser(){} public String getId() { return id; } public void setId(String id) { this.id = id; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getNickName() { return nickName; } public void setNickName(String nickName) { this.nickName = nickName; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getStatus() { return status; } public void setStatus(String status) { this.status = status; } public String getAvatar() { return avatar; } public void setAvatar(String avatar) { this.avatar = avatar; } public String getRemarks() { return remarks; } public void setRemarks(String remarks) { this.remarks = remarks; } public Long getAddAt() { return addAt; } public void setAddAt(Long addAt) { this.addAt = addAt; }}

澳门葡京备用网址 19澳门葡京备用网址 20

4.5.1 BaseController
public class BaseController { private static final long serialVersionUID = 6357869213649815390L; /** * @param fastJson */ protected JSONObject json = new JSONObject(); /** * fastjson JSONArray */ protected JSONArray jsonArray = new JSONArray(); /** * fastjson用法 * 对象转json字符串 String json = json.toJSONString; * 字符串转json对象 json =json.parseObject; * 字符串转java对象 Object object = JSON.parseObject(jsonStr, Object.class); * 字符串转list List<Object> list = JSON.parseArray(jsonStr, Object.class); */}

在此间收取了八个BaseController的父类,可停放多少个Controller都会用到的1部分指标或措施,那一个父类被子类Controller承继。如今此项目中的BaseController只放置了fastjson的四个目的,日常项目中毫无疑问会有不中国少年共产党有的对象或方法都可放置那中间。

package com.sxd.repository;

import com.sxd.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

public interface UserRepository extends JpaRepository<User,String>{

    User findByUsername(String username);

    User findByUsernameAndPassword(String username,String password);

    User findById(String id);

    @Query("select u from User u where u.username = :name")
    User findUser(@Param("name")String username);

    User findTop3ByAge(Integer age);
}
4.5.2 UserController
@Controller@RequestMappingpublic class UserController extends BaseController { @Resource(name = "userService") private UserService userService; /** * 添加用户 * * @param mUserJson * @return * @throws Exception */ @RequestMapping(value = "", method = RequestMethod.POST) @ResponseBody public String addUser(@RequestBody String mUserJson) throws Exception { String resultInfo = ""; try { resultInfo = userService.addUser(mUserJson); } catch (Exception e) { e.printStackTrace(); } return resultInfo; } /** * 通过用户名称获取用户 * * @param userName * @return * @throws Exception */ @RequestMapping(value = "/{userName}", method = RequestMethod.GET) @ResponseBody public String getUserByName(@PathVariable String userName) throws Exception { String resultInfo = ""; try { resultInfo = userService.getUserByName; } catch (Exception e) { e.printStackTrace(); } return resultInfo; } /** * 修改用户 * * @param mUserJson * @return * @throws Exception */ @RequestMapping(value = "/{id}", method = RequestMethod.PUT) @ResponseBody public String updateUser(@PathVariable String id, @RequestBody String mUserJson) throws Exception { String resultInfo = ""; try { resultInfo = userService.updateUser(id, mUserJson); } catch (Exception e) { e.printStackTrace(); } return resultInfo; } /** * 删除用户 * * @param id * @return * @throws Exception */ @RequestMapping(value = "/{id}", method = RequestMethod.DELETE) @ResponseBody public String deleteUser(@PathVariable String id) throws Exception { String resultInfo = ""; try { resultInfo = userService.deleteUser; } catch (Exception e) { e.printStackTrace(); } return resultInfo; }}

此地运用springmvc
相关切解,集成restful风格的接口,具体注脚和含义、及restful风格的知情可翻上1篇文章。与上1篇略有差别的本项目应用的是@Resource注脚注入bean。

关于@Resource和@Autowired:

  • 互相都得以写在字段和setter方法上。两者若是都写在字段上,那么就不须求再写setter方法。
  • @Autowired私下认可按类型装配(那么些评释属于spring的),暗中认可情形下必须要求依赖对象必须存在,借使要允许null值,能够设置它的required属性为false,如:@Autowired(required=false)
  • @Resource暗中认可安装名称进行李装运配(这些申明属于J二EE的),名称能够透过name属性进行点名,借使没有一点名name属性,当表明写在字段上时,暗中同意取字段名举办设置名称查找。
  • 在自己个人推举用@Resource,因为这么些评释是属于J二EE的,收缩了与spring的耦合,并且代码看起更优雅。若有高见,招待指教。

这一个示例代码达成了增加和删除改查多少个基础作用,前后端完全以JSON字符串实行互相。(这里上下端以JSON字符串交互的章程有待商榷,以前认知是用JSON字符串便于统一风格;可是近期一年以来的上学和行事,今后会直接行使实体类举办收纳指标,免去JSON转对象的手续。)

View Code

4.6.1 BaseService
public class BaseService { private static final long serialVersionUID = 6357869213649815390L; /** * 得到32位的uuid * * @return */ public String get32UUID() { String uuid = UUID.randomUUID().toString.replaceAll; return uuid; } /** * @param fastJson */ protected JSONObject json = new JSONObject(); /** * fastjson JSONArray */ protected JSONArray jsonArray = new JSONArray(); /** * fastjson用法 * 对象转json字符串 String json = json.toJSONString; * 字符串转json对象 json =json.parseObject; * 字符串转java对象 Object object = JSON.parseObject(jsonStr, Object.class); * 字符串转list List<Object> list = JSON.parseArray(jsonStr, Object.class); */}

也是抽取了1个父类BaseService,放置共用的指标或措施。这里固然与BashController内容类同,然则未有与BaseController共用,因为想到纵然项目复杂的话,Controller与Service层共用的东西会有比较大差异。

 

4.6.2 UserService
@Service("userService")public class UserService extends BaseService { @Resource(name = "userDaoImpl") private IUserDao iUserDao; /** * 添加用户 * * @param mUserJson * @return */ public String addUser(String mUserJson) { BgyResult br = new BgyResult(); MUser mUser = json.parseObject(mUserJson, MUser.class); int count = iUserDao.countUserName; if (count > 0) { br.setCode; br.setMsg; return json.toJSONString; } mUser.setId(get32UUID; boolean result = iUserDao.addUser; if  { br.setCode; br.setMsg; br.setData; } else { br.setCode; br.setMsg; } return json.toJSONString; } /** * 通过用户名获取用户 * * @param userName * @return */ public String getUserByName(String userName) { BgyResult br = new BgyResult(); MUser mUser = iUserDao.getUserByName; br.setCode; br.setMsg; br.setData; return json.toJSONString; } /** * 编辑用户 * * @param mUserJson * @return */ public String updateUser(String id, String mUserJson) { BgyResult br = new BgyResult(); MUser mUser = json.parseObject(mUserJson, MUser.class); MUser myMUser = iUserDao.getUserById; if (myMUser == null) { br.setCode; br.setMsg; return json.toJSONString; } boolean result = iUserDao.updateUser; if  { br.setCode; br.setMsg; } else { br.setCode; br.setMsg; } return json.toJSONString; } /** * 删除用户 * * @param id * @return */ public String deleteUser(String id) { BgyResult br = new BgyResult(); MUser myMUser = iUserDao.getUserById; if (myMUser == null) { br.setCode; br.setMsg; return json.toJSONString; } boolean result = iUserDao.deleteUser; if  { br.setCode; br.setMsg; } else { br.setCode; br.setMsg; } return json.toJSONString; }}

那1层首要正是拍卖业务逻辑了,没什么特别的位置,也是利用@Resource注入Bean。这里运用了BgyResult类作为重回类。

public class BgyResult implements Serializable { private static final long serialVersionUID = 4832771715671880043L; private String code; private String msg; private Object data; public BgyResult(){ this.code = "200"; this.msg = "SUCCESS"; this.data = null; } public BgyResult(String msg) { this.code = "400"; this.msg = msg; this.data = null; } public BgyResult(String code, String msg, Object data) { this.code = code; this.msg = msg; this.data = data; } public String getCode() { return this.code; } public void setCode(String code) { this.code = code; } public String getMsg() { return this.msg; } public void setMsg(String msg) { this.msg = msg; } public Object getData() { return this.data; } public void setData(Object data) { this.data = data; }}

为了统1与前者的并行,定义了BgyResult类实行正规再次来到,统一再次来到格式code、msg、data的json字符串。

就这么几步,就会拓展数据的长久化操作了。

4.8.1 IUserDao
public interface IUserDao { int countUserName(MUser mUser); boolean addUser(MUser mUser); MUser getUserByName(String userName); MUser getUserById(String id); boolean updateUser(MUser mUser); boolean deleteUser(String id);}

那边就是dao的接口层,用于访问数据库,实现数量的悠久化。这里提一下,《阿里Baba(Alibaba)Java开拓手册》中写道:

接口类中的方法和属性不要加任何修饰符号(public也毫不加),保持代码的简洁性。

开发银行创建数据表如下,实行的sql语句如下:

4.8.2 UserDaoImpl
@Repository("userDaoImpl")public class UserDaoImpl implements IUserDao { @Resource(name = "dbSqlSessionTemplate") private SqlSessionTemplate sqlSessionTemplate; @Override public int countUserName(MUser mUser) { return sqlSessionTemplate.selectOne("UserMapper.countUserName", mUser); } @Override public boolean addUser(MUser mUser) { int num = sqlSessionTemplate.insert("UserMapper.addUser", mUser); boolean result = false; if (num > 0) { result = true; } return result; } @Override public MUser getUserByName(String userName) { MUser mUser = sqlSessionTemplate.selectOne("UserMapper.getUserByName", userName); return mUser; } @Override public MUser getUserById(String id) { MUser mUser = sqlSessionTemplate.selectOne("UserMapper.getUserById", id); return mUser; } @Override public boolean updateUser(MUser mUser) { int num = sqlSessionTemplate.update("UserMapper.updateUser", mUser); boolean result = false; if (num > 0) { result = true; } return result; } @Override public boolean deleteUser(String id){ int num = sqlSessionTemplate.update("UserMapper.deleteUser", id); boolean result = false; if (num > 0) { result = true; } return result; }}

其1类正是dao接口的切切实实贯彻类了,没什么非常的。使用的是眼下配置的SqlSessionTemplate模板化学工业具,与mapper.xml结合贯彻操作数据库。可是这里把全部再次来到int的操作做了须臾间boolean转变,便于service层管理。

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="UserMapper"> <resultMap type="MUser"> <id column="id" property="id"/> <result column="user_name" property="userName"/> <result column="nick_name" property="nickName"/> <result column="password" property="password"/> <result column="email" property="email"/> <result column="phone" property="phone"/> <result column="sex" property="sex"/> <result column="status" property="status"/> <result column="avatar" property="avatar"/> <result column="remarks" property="remarks"/> <result column="add_at" property="addAt"/> </resultMap> <select parameterType="MUser" resultType="int"> SELECT COUNT FROM `user` WHERE user_name = #{userName} </select> <insert parameterType="MUser"> INSERT INTO `user` (id,user_name,nick_name,password,email,phone,sex,status,avatar,remarks,add_at) VALUES (#{id},#{userName},#{nickName},#{password},#{email},#{phone},#{sex},#{status},#{avatar},#{remarks},unix_timestamp,unix_timestamp </insert> <select resultMap="userMap"> SELECT * FROM `user` WHERE user_name = #{userName} </select> <select resultMap="userMap"> SELECT * FROM `user` WHERE id = #{id} </select> <update parameterType="MUser"> UPDATE `user` SET <if test="nickName != null and nickName != ''"> nick_name = #{nickName}, </if> <if test="password != null and password != ''"> password = #{password}, </if> <if test="email != null and email != ''"> email = #{email}, </if> <if test="phone != null and phone != ''"> phone = #{phone}, </if> <if test="sex != null and sex != ''"> sex = #{sex}, </if> <if test="status != null and status != ''"> status = #{status}, </if> <if test="avatar != null and avatar != ''"> avatar = #{avatar}, </if> <if test="remarks != null and remarks != ''"> remarks = #{remarks}, </if> update_at = unix_timestamp WHERE id = #{id} </update> <delete parameterType="string"> DELETE FROM `user` WHERE <if test="_parameter!= null"> id = #{id} AND </if> 1=1 </delete></mapper>

其壹是mybatis中sql的炫丽文件。命名空间即是sqlSessionTemplate.insert(“UserMapper.addUser”,
mUser)
中的UserMapper

上面还涉嫌了运用typeAliases标签成分来对品种进行别称调整,相当于给现实的实体类2个外号,不用写完整路线。在那边的type大概parameterType里写的MUser正是我们的实体类,假若不利用typeAliases,这里则应写完整路线,即com.bgy.springboot.model.MUser

运维品种,测试一下探寻。由于springboot内置了tomcat,所以不用单独放在tomcat中布置。间接运维SpringbootApplication类,就能够运维项目。看见那些即表示运营成功:

澳门葡京备用网址 21run.png

上边以postman测试接口

澳门葡京备用网址 22post.png

澳门葡京备用网址 23put.png

澳门葡京备用网址 24get.png

澳门葡京备用网址 25delete.png

由来,基于springboot+springmvc+mybatis框架的类型早就完全结合与测试通过。那个类型组成上多少个类别的部分事物,当然也改革了部分东西。项目中关系到的本领都未曾困难,固然对于新手也很轻易搞懂,也可能有整机的代码,已测试编写翻译通过。

编辑水平有限,若有错误只怕更优的提出招待建议。

现阶段1切稿子列表:idea整合restful风格的ssm框架idea整合restful风格的ssm框架idea整合spring
boot+spring
mvc+mybatis框架idea整合springboot+redisJVM学习之—Java内部存储器区域JVM学习之—垃圾回收与内存分配政策专项论题整理之—不可变对象与String的不可变专题整理之—String的字符串常量池

【若是spring.jpa.hibernate.ddl-auto=update,也会创立数据表,然而不会有SQL语句打字与印刷出来】

澳门葡京备用网址 26

 

 

好了树立二个单元测试类,使用一下温馨写的Repository层的章程和曾经封装好的有的艺术:

澳门葡京备用网址 27

JunitTest.java是放在test目录下的

澳门葡京备用网址 28澳门葡京备用网址 29

package com.sxd.logexample;

import com.sxd.LogExampleApplication;
import com.sxd.entity.User;
import com.sxd.repository.UserRepository;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import java.util.List;
import java.util.Objects;
import java.util.UUID;

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = LogExampleApplication.class)
public class JunitTest {

    @Autowired
    private UserRepository userRepository;

    @Test
    public void dealUser(){

        //插入新的数据
        for (int i = 0; i < 10; i++) {
            User user = new User();
            user.setId(UUID.randomUUID().toString());
            user.setUsername("用户名"+i);
            user.setPassword("123"+i);
            user.setAge(i+1);

            userRepository.saveAndFlush(user);
        }

        //根据ID查询
//        User user = userRepository.findById("03d99bf3-a171-4986-a75f-92cadc3aa75b");
//        System.out.println(user);//重写了user的toString()方法即可打印出

        //根据userRepository中自写方法查询
//          User user = userRepository.findByUsernameAndPassword("用户名1","1231");
//          System.out.println(user);

        //查询所有
//        List<User> list = userRepository.findAll();
//        if(Objects.nonNull(list)){
//            list.forEach(i->{
//                System.out.println(i);
//            });
//        }

        //删除所有
        userRepository.deleteAll();

    }
}

View Code

 

 然后右键在单元测试方法上
运转起来就能够。【单元测试,具体看:http://www.cnblogs.com/sxdcgaq8080/p/7894444.html】

澳门葡京备用网址 30

 

实践完sava方法之后,就能够进行插入,sql语句如下:

 澳门葡京备用网址 31

数据库中也插入成功:

澳门葡京备用网址 32

 

 上面包车型客车方法  本身多少个多少个测试就能够。

==========================================结束语====================================================

那章正是轻松的行使spring-data-jpa进行和数据库交互的操作。数据持久化得以落到实处,那就化解了项目一个很重视的主题材料了。但那边只是最最开首的有些,前边会把spring-data-jpa的头眼昏花使用解开面纱。

===========================================附录1:===================================================

假如有人对spring-data-jpa和hibernate是什么关系存在难点,可以看看那1部分:

  一JPA先是得介绍一下,他只是1套标准和标准,也等于一群堆的接口,并没有达成;

  2hibernate是对JPA的1种达成,正是您实际实践长久化操作调用的点子内实际干了怎么,都以Hibernate达成的;

  叁spring-data-jpa则是对hibernate举行了再装进,大大的简化了原来DAO层的兑现,也正是现行反革命的repository层。因为本章便是用的spring-data-jpa,假设您前边运用的是3大框架照旧怎么样巴拉巴拉之类的,肯定是上来先把项目标目录框架,entity,dao,daoimpl,service,serviceimpl,controller层搭建好,才开采的。

  4spring
 spring-boot官方对hibernate是一贯都有支撑的,而对mybatis则未有,但并不意味它不能够与mybatis集成。【这一点有一点点废话,然而却是想发挥】

 

===========================================附录2:===================================================

参考自:

entity:和数据库数据表绝对相应的实业,放在entity下

model:前台需倘使哪些,model就被拍卖成什么

domain:代表1个对象模块。

 

分离的话:

壹entity【实体】习于旧贯性使用这么些,作为实体的包名。entity中有几个属性,对应的数据表中就有多少个字段。并且字段类型都保持相对同样。

贰model【模型】的运用,比如User对象实体中有12个字段,可是前台仅供给username和age的话,那把全路实体传给前台无疑多传输了无数无用的多寡。又例如User的sex字段,数据库中贮存为男的1,女的2。如若把User对象传给前台,前台js还亟需判断一下,而要是sex存款和储蓄改造了,2为男,一为女,那样js还索要开始展览更改。所以能够将前台须要的数额封装为model传给前台。而model对象都放在model包下。

3domain【域】是三个订单,一个用户消息等概念的分割。举个例子贰个招聘网址的类型,最根本的对象正是简历了,那么简历是怎么存到数据库的吧,不可能用一张表就会存的,因为简历包罗基本新闻和行事经验,项目经验,学习经历等。基本信息方可存在简历表,可是涉及到多条的就极其,因为没人知道有微微条工作经历,项目经验,所以必供给单独建筑工程作经验表和类型经验表关联到简历基本新闻表。但是前台页面是不关怀这一个的,前台要求的多少正是一个简历全数音信,那时就足以用到domain来拍卖,domain里面包车型大巴类就是二个简历对象,包罗了简历基本音信以及list的办事经验,项目经验等。那样前端只要求获得二个目的就行了,无需同时即要获取基本音信,还要从基本音信里面获得职业经验关联的简历编号,然后再去赢得相应的干活经验了。

 

===================================================================================================

 

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website