idea+Springboot+hibernateJPA+lombok学习笔记

3 篇文章 0 订阅
1 篇文章 0 订阅

今日特使用此结构进行demo开发

一、目录结构:

在这里插入图片描述
在这里插入图片描述

二、实现代码

1、首先创建dean:

import lombok.Data;
import org.springframework.stereotype.Component;

import javax.persistence.*;
import java.io.Serializable;

/**
 * @program: springbootdemo
 * @description:demo版本练习boot+hibernate的练习,这个是一个【实体类】
 * @author: Feng_Lei
 * @create: 2020-04-15 23:14
 **/
 //这个是为了lombok的注解实现getter、setter
@Data
//这个注解代表这个时一个对应数据库的实体类
@Entity
//这个注解映射数据库的表名称
@Table(name="WebData")
//将此实体类交予spring管理
@Component
public class WebData implements Serializable {
//    @EmbeddedId  是一个嵌入式主键的注解,表示结合内部类等生成主键
//数据库的id属性
    @Id
    private Integer id;
    @Column
    private String userName    ;
    @Column
    private String password    ;
    @Column
    private String createTime  ;
    @Column
    private String remarks     ;
}
3、JPA的编写:

import com.uflinux.demo.bean.WebData;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;

import javax.persistence.Id;
import javax.transaction.Transactional;
import java.util.List;

/**
* @Description: 这个是WebData的jpa接口,继承于hibernate
* @Param: 
* @return: 
* @Author: Mr.Feng
* @Date: 2020/4/16
*/
public interface WebDataRepository extends JpaRepository<WebData, Id> {
    //通过名字找到所有
    List<WebData> findAllByUserName(String name );
    //通过id得到一个用户
    WebData findById(Integer id);
    //查询到数据库中所有的对象
    @Override
    List<WebData> findAll();
    //通过名字找到所有
    WebData findTopByUserName(String name );
    //查询ID最大一条数据
    WebData findTopByOrderByIdDesc();
    //查询ID最小一条数据
    WebData findTopByOrderById();
    //查询倒叙的前10条数据
    List<WebData>findTop10ByOrderById();
    /*
    1、请注意以下的3个注解,第一个未知意思,但是不添加的话无法修改数据库的数据
    2、第二个是jpa的update时需要使用
    3、第3个,代表修改数据时使用,
     */
    @Transactional//若缺少此注解可能不能提交到数据库
    @Modifying    // 声明这个是update类型语句
    @Query(value = "update WebData  set remarks=?3 where userName=?2 and id=?1 ", nativeQuery = true)
    void saveOne(Integer id , String userName ,String remarks );

    /*
    插入数据
    目前这个方法没有写,到了dao 层时采用的是原装的
     */

}
4、创建dao

import com.uflinux.demo.bean.WebData;

import java.util.List;

public interface WebDataDao {
  //通过用户名得到对象的集合
    List<WebData> findAllByUserName(String name );
    //根据用户名得到一个账户
    WebData findOneByUserName(String name);
    //通过id得到一个用户
    WebData findById(Integer id);
    //查询到所有的用户
    List<WebData> findAll();
    //得到第一个用户desc
    WebData findFirst();
    //得到第一个用户    asc
    WebData findFirstAsc();
    //得到前十条的
    List<WebData> findTOP10();
    //根据3个参数进行update
    void saveRemarkes(Integer id , String userName , String remarks);
    //为了insert
    void saveObject(WebData webData);
}

5、创建dao的实现类:
import com.uflinux.demo.bean.WebData;
import com.uflinux.demo.dao.jpa.WebDataRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * @program: springbootdemo
 * @description: JPA-dao的实现类,注入jpa对象,实现dao接口并重写方法
 * @author: Feng_Lei
 * @create: 2020-04-16 12:51
 **/
//@Repository
@Component
public class WebDataDaoImplJPA implements  WebDataDao{
    //注入hrebriate的尸体对象
    @Autowired
    private WebDataRepository webDataRepository;
    @Override
    public List<WebData> findAllByUserName(String name) {
        return webDataRepository.findAllByUserName(name);
    }
    @Override
    public WebData findOneByUserName(String name) {
        return webDataRepository.findTopByUserName(name);
    }
    @Override
    public WebData findById(Integer id) {
        return webDataRepository.findById(id);
    }
    @Override
    public List<WebData> findAll() {
        return webDataRepository.findAll();
    }
    @Override
    public WebData findFirst() {
        return webDataRepository.findTopByOrderByIdDesc();
    }

    @Override
    public WebData findFirstAsc() {
        return webDataRepository.findTopByOrderById();
    }

    @Override
    public List<WebData> findTOP10() {
        return webDataRepository.findTop10ByOrderById();
    }

    @Override
    public void saveRemarkes(Integer id, String userName, String remarks) {
         webDataRepository.saveOne(id,userName,remarks);
    }

    @Override
    public void saveObject(WebData webData) {
        webDataRepository.save(webData);
    }

}
6、创建service

import java.util.List;

public interface WebDataService {
     WebData getUnUserdAccount(String name) ;
     void updateRemarksByWebData(WebData webData);
     List<WebData> findAll();
     WebData getUserById(Integer id);
     WebData getFirst();
     WebData getFirstAsc();
     List<WebData>getTop10();
}
7、service的实现类

import com.uflinux.demo.bean.WebData;
import com.uflinux.demo.dao.WebDataDao;
import com.uflinux.demo.service.WebDataService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;

import static java.lang.Boolean.FALSE;

/**
 * @program: springbootdemo
 * @description: WebDataService的实现类,将重写接口的
 * @author: Feng_Lei
 * @create: 2020-04-15 23:17
 **/
@Service
public class WebDataServiceImpl implements WebDataService {
    private static final Boolean AA = FALSE;

@Resource
    private WebDataDao webDataDao ;
    @Override
    public WebData getUnUserdAccount(String name) {
        return webDataDao.findOneByUserName(name);
    }
    @Override
    public void updateRemarksByWebData(WebData webData) {
      //  return AA;
    }
    @Override
    public List<WebData> findAll() {
        return webDataDao.findAll();
    }
//通过id得到一个用户的信息
    @Override
    public WebData getUserById(Integer id) {
        return webDataDao.findById(id);
    }
    @Override
    public WebData getFirst() {
        return webDataDao.findFirst();
    }

    @Override
    public WebData getFirstAsc() {
        return webDataDao.findFirstAsc();
    }

    @Override
    public List<WebData> getTop10() {
        return webDataDao.findTOP10();
    }


}
8、controller(略)根据自己需求编写
9、junit-springboot测试类

@RunWith(SpringRunner.class)
@SpringBootTest
public  class DemoApplicationTests {
    private Logger logger = LoggerFactory.getLogger(DemoApplicationTests.class);
    @Resource
    private WebDataDao webDataDao;//注入dao
    @Resource
    private WebDataService webDataService;//注入service
    @Test//默认的测试1
    public void contextLoads() {
        System.out.println("asdasdasd");
    }
    /**
     * @Description: findAllUser这个方法主要是为了测试dao层的联通性
     * @Param: []
     * @return: void
     * @Author: Mr.Feng
     * @Date: 2020/4/17
     */
    @Test
    public void findAllUser() {
        logger.info("查询到的数据=", webDataDao.findById(1));
        System.out.println("----------------------------------------");
        System.out.println("----------------------------------------");
        System.out.println(webDataDao.findById(1));
        System.out.println("----------------------------------------");
        System.out.println("----------------------------------------");
    }
    //测试service层的到曾的而联通性
    @Test
    public void GetServcieDataSource() {
        System.out.println("----------------------------------------");
        System.out.println("----------------------------------------");
        System.out.println(webDataService.getUserById(2));
        System.out.println("----------------------------------------");
        System.out.println("----------------------------------------");
    }
    @Test//测试得到的是一个集合,然后进行拆分得到对象若干
    public void GetServcieDataAll() {
        System.out.println("----------------------------------------");
        //List<WebData> list1 = webDataService.findAll();//查序所有数据集合
        List<WebData> list1 = webDataService.getTop10();//查询前10条数据

        System.out.println(list1);
        for (WebData map1 : list1) {
            Integer id = map1.getId();
            String userName = map1.getUserName();
            String password = map1.getPassword();
            String createTime = map1.getCreateTime();
            String remarks = map1.getRemarks();
            System.out.println(id);
            System.out.println(userName);
            System.out.println(password);
            System.out.println(createTime);
            System.out.println(remarks);

        }
    }
    @Test
    public void getFirst() {
        WebData map1 = webDataDao.findFirstAsc();// webDataDao.findFirst();
        String userName = map1.getUserName();
        String password = map1.getPassword();
        String createTime = map1.getCreateTime();
        String remarks = map1.getRemarks();
        System.out.println("用户名:" + userName);
        System.out.println("密码:" + password);
        System.out.println("创建时间:" + createTime);
        System.out.println("备注:" + remarks);
    }
    //这个是测试修改方法的
    @Autowired
    WebData webData;
    @Test
    public void saveRemars() {
        webData = webDataDao.findById(2);
        if (webData != null) {
            System.out.println(webData);
            Integer id = webData.getId();
            System.out.println(id);
            String remarks = "台湾岛";
            String userName = "李四";
            webDataDao.saveRemarkes(id, userName, remarks);


        } else {
            System.out.println("WebData这个对象是空的");
        }
        System.out.println( webDataDao.findById(2));
    }
  //这个测试的是利用自带jpa制造insert
    @Test
    public void saveObject(){
        webData.setId(15);
        webData.setUserName("风斯托洛夫斯基");
        webData.setPassword("13800138000");
        webDataDao.saveObject(webData);
    }


}
10、application.yml 配置文件
spring:
  mvc:
    static-path-pattern: /static/**
    view:
      suffix: .ftl
      #prefix: /
  freemarker:
    thymeleaf:
      cache: false
    settings:
         template_update_delay: 0

    #template-loader-path:classpath: templates
    charset: UTF-8
    check-template-location: true
    content-type: text/html
    expose-request-attributes: true
    expose-session-attributes: true
    request-context-attribute: request
    suffix: .ftl

  datasource:
  #    MySQL
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/databaseName?useSSL=false
    username: root
    password: root
    type: com.alibaba.druid.pool.DruidDataSource

    initialSize: 50
    minIdle: 10
    maxActive: 300
    maxWait: 60000
    timeBetweenEvictionRunsMillis: 60000
    minEvictableIdleTimeMillis: 300000
    validationQuery: SELECT 1
    testWhileIdle: true
    testOnBorrow: false
    testOnReturn: false
    poolPreparedStatements: true
    maxPoolPreparedStatementPerConnectionSize: 20
    filters: stat,wall,log4j
    connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000



  jpa:
    database: mysql
    show-sql: true
    hibernate:
      naming:
        physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
    properties:
      hibernate:
        dialect: org.hibernate.dialect.MySQL5Dialect


    devtools:
      restart:
        additional-paths: src/main/java
        enabled: true
        exclude: test/**


11、pom.xml
<!--Springbootde parent 依赖-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <!-- <version>2.2.6.RELEASE</version> -->
        <version>2.0.5.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.uflinux</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo</name>
    <description>Demo project for Spring Boot</description>
<!--jdk 1.8-->
    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
    <!--单元测试  -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
   <!--MySQL驱动 -->
        <dependency>
            <groupId>MySQL</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.6</version>
        </dependency>
   <!--线程池驱动 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.10</version>
        </dependency>
  <!-- 服务于@ConfigurationProperties注解的-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <version>2.0.5.RELEASE</version>
            <optional>true</optional>
        </dependency>

  <!--Freemarker-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-freemarker</artifactId>
        </dependency>
<!--lombok插件-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.20</version>
        </dependency>
<!--添加热部署-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional>
            <scope>true</scope>
        </dependency>
<!--视图引擎-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
 <!--前台视图插件 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
 <!-- SpringBootText注解依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
<!-- hibernate注解-->
        <!-- https://mvnrepository.com/artifact/org.springframework.data/spring-data-jpa -->
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-jpa</artifactId>
            <version>2.0.10.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
</dependencies>

    <build>
        <plugins>
            <plugin>
                <!--热部署配置与上面的devtools一起存在,并最后在idea进行配置即可-->
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <!--fork:如果没有该项配置,整个devtools不会起作用-->
                    <fork>true</fork>
                </configuration>
            </plugin>
            <!--<plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>-->
        </plugins>
    </build>

</project>

三、总结及问题汇总

1、yml配置文件需要注意yml文件格式

(
1、注意MySQL驱动,在导入包错误或者没有此包时,会标红;
2、注意层级缩进关系
)

2、注意maven仓库地址配置是否正确,尽量要避免造成脱机查询,而无法正常导入包依赖或者导入的zip时有错误的
3、注解
注解分析
1、实体类
@data这个是lombok的体现,使用后免去编写get/set 方法,也比较号内存
@Entity映射数据库的实体类
@Table也是告诉数据库这个是实体类
@Componentspring的一版注解,若bean五此可能造成无法注入
@Id主键字段
@Column在bean的属性字段添加,当作数据库的额类
2、dao层
dao的接口不需要注解
dao的实现类@Component于类,重写接口方法,注入jpa对象
@Repository@Repository用于标注数据访问组件,即DAO组件
@Autowired /@Resource自动注入对象,若实体类无@Component注解,可能会导致注入失败【例如:Could not autowire. No beans of ‘xxxx’ type found的错误提示】
3、Service层
service接口不需要注解,编写因为实现方法即可
serviceImpl实现类@Service注解于类,代表是service层
属性声明@Autowired注解于dao层接口对象
然后重写接口的方法,dao.方法,调用dao的方法来实现业务
4、Controller
@Controller注解此注解可返回视图页面ftl可以直接获取返回的key得到值
@RestController此注解仅返回字符串格式无法返回一个页面
@GetMapping等同于@RequestMapping(get方法)
@GetMapping({"/", “/list”, “datasheet.ftl”})此种标记表示任何一个都可以调用这个方法
@PostMapping等同于@RequestMapping(post)方法
5、JPA
JPA接口继承于JpaRepository享有其所有方法
若新接口没有写任何方法则全部使用JpaRepository的反之则使用新编写的
@Transactional开启事务参见于 注解描述详解
@Modifying于@Query一起使用,进行编写sql语句
@Query中编写sql语句,注意占位

上述就是项目当前使用的注解了

4、本文涉及的 hibernate 的hsql语法
语法描述
List findAllByUserName(String name )通过用户名得到对象集合
WebData findById(Integer id);通过主键id得到一个用户对象
List findAll();直接查询到所有用户这个是来自继承的方法
WebData findTopByUserName(String name );自带语法支持找到仅一条数据
WebData findTopByOrderByIdDesc();自带语法支持倒序找到仅一条数据
WebData findTopByOrderById();自带语法支持正序找到仅一条数据
ListfindTop10ByOrderById();自带语法支持找到正序10条数据
5、整体开发流程

除建项目外

1、bean
2、JPA > dao >daoImpl (进行junit单元测试,若没有问题在下一百)
3、service > serviceImpl (进行junit单元测试,若没有问题在下一百)
4、controller

项目开始
配置pom导入依赖
配置yml文件
编写bean类
编写JPA接口
编写dao
编写daoImpl
对于dao层进行junit单元测试
编写service
编写serviceImpl
对于Service层进行junit单元测试
编写controller并进行测试
反复测试然后完毕
6、语法链接

SpringData系列四 @Query注解及@Modifying注解
事务注解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值