JPA基本使用

2023-11-17

JPA的基本使用

这段时间看了下JPA,简单的做个笔记吧。

1、搭建环境

1.1、application.yaml

我用的是Mysql,需要数据库连接驱动,数据源看你心情吧,系统也有默认的数据源。

spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/examinedb?useSSL=false&allowPublicKeyRetrieval=true
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver
  jpa:
    database: MYSQL
    show-sql: true
    open-in-view: true
    properties:
      hibernate:
        enable_lazy_load_no_trans: true #使用延时加载时控制Session的生命周期
        dialect: org.hibernate.dialect.MySQL5Dialect
        ddl-auto: update

  thymeleaf:
    cache: false

secure:
  ignored:
    urls:
      - /swagger-resources/**
      - /v2/api-docs/**
      - /swagger-ui.html
      - /*.html
      - /**/*.html
      - /**/*.css
      - /**/*.js
      - /**/*.png
      - /**/*.jpg
server:
  port: 81

1.2、构建ORM关系映射模型

@Entity标注是JPA的实体,@Table和数据库哪一个表做的映射。@ManyToMany(targetEntity = Role.class)标识多对多,同理一对多,一对一也是基本这个套路。不同点在于,多对多要把中间表描述出来,把支撑三表连接的连接列表明出来。

package com.cbf.pojo;

import lombok.Data;

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

/**
 * @Description  
 * @Author  wangnaixing
 * @Date 2021-12-25 12:27:03 
 */
@Data
@Entity
@Table ( name ="t_user" , schema = "")
public class User  implements Serializable {

	private static final long serialVersionUID =  5450815487641580632L;

	/**
	 * 自增主键
	 */
	@Id
   	@Column(name = "id" )
	@GeneratedValue(strategy=GenerationType.AUTO)
	private Long id;

	/**
	 * 用户名
	 */
   	@Column(name = "username" )
	private String username;

	/**
	 * 密码
	 */
   	@Column(name = "pwd" )
	private String pwd;

	/**
	 * 角色集合
 	 */
	@ManyToMany(targetEntity = Role.class)
	@JoinTable(name = "t_user_role_relation",joinColumns = {@JoinColumn(name = "user_id")},inverseJoinColumns = {@JoinColumn(name="role_id")})
	private List<Role> roleList;
	

}

1.3、实现接口

啥都不用写了,太爽了。人家会在你启动SpringBoot项目的时候,自动的生成实现类。

package com.cbf.repo;

import com.cbf.pojo.Role;
import org.springframework.data.repository.CrudRepository;

/**
 * @author by wangnaixing
 * @Description
 * @Date 2021/12/25 13:26
 */
public interface RoleDao extends CrudRepository<Role,Long> {
}

2、增删改查实现

在Controller层,本人直接注入的JPA的Dao.来操作CRUD,可看出增删改查都有现成的方法,用就可以了。唯独分页,需要Pageable对象,了解到你的分页信息。在查询方法中,只要带上这个参数执行查询的集合出来就会分页,你可以使用org.springframework.data.domain.Page(SpringBoot)自带的分页结果容器接受到这些分页信息,比如当前页,总页码,分页记录,之类的这些。

1、添加

  /**
     * 新增学生
     * @param entity
     * @return
     */
    @PostMapping("/save")
    public void save(Student entity){
        log.info("==系统正在新增学生==");
        studentDao.save(entity);
        log.info("==系统成功新增学生!==");

    }

2、修改

   /**
     * 修改学生
     */
    @GetMapping("/update/{id}")
    public void update(Student entity){
        log.info("==系统正在修改学生==");
        studentDao.save(entity);
        log.info("==系统成功修改学生!==");
    }

3、删除

 /**
     * 删除学生
     * @param id
     */
    @GetMapping("/delete/{id}")
    public void delete(@PathVariable(name = "id") Long id){
        log.info("==系统正在删除学生==");
        studentDao.deleteById(id);
        log.info("==系统成功删除学生!==");
    }

4、根据ID查询

 /**
     * 根据Id查询学生信息
     * @param id
     */
    @GetMapping("/findById/{id}")
    public String findById(@PathVariable(name = "id") Long id, Model model){
        log.info("==系统正在查询学生==");
        Student student = studentDao.findById(id).orElse(null);
        model.addAttribute("student",student);
        log.info("==系统成功查询学生!==");
        return "forward:/toEditStudentPage";
    }

4、分页

因为本人角色,使用SpringBoot的分页信息对象直接返回前端不合理,其理由在于有太多不必要的参数了,我通常会定义一个分页交互模型,把需要的数据抽离,从Page抽离出来,再给到前端。

    /**
     * 分页查询
     * @param pageNo
     * @param pageSize
     * @return
     */
    @RequestMapping("/findByPage")
    public String findByPage(
            @RequestParam(name = "pageNo",defaultValue = "0") Integer pageNo,
            @RequestParam(name = "pageSize",defaultValue = "5") Integer pageSize, Model model){
        log.info("==系统查询学生==");
        //分页查询
        List<Student> studentList = new ArrayList<>();
        Pageable pageable = PageRequest.of(pageNo, pageSize);
        CommonPage<Student> page = CommonPage.restPage(studentDao.findAll(pageable));
        //结果存入请求域
        model.addAttribute("page",page);
        //结果存入请求域
        model.addAttribute("studentList",studentList);

        //转发的学生list页面
        log.info("==系统成功查询学生!==");
        return "/student/student_list";
    }
package com.cbf.repo;

import com.cbf.pojo.Student;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.repository.CrudRepository;

/**
 * @author by wangnaixing
 * @Description
 * @Date 2021/12/25 10:07
 */
public interface StudentDao extends CrudRepository<Student,Long> {

    /**
     * 分页查询
     * @param pageable
     * @return
     */
    Page<Student> findAll(Pageable pageable);
}

package com.cbf.common;

import org.springframework.data.domain.Page;

import java.util.List;


/**
 * 分页数据封装类
 * @author wangnaixing
 * @param <T>
 */
 @Data
public class CommonPage<T> {
    private Integer pageNum;
    private Integer pageSize;
    private Integer totalPage;
    private Long total;
    private List<T> list;


    /**
     * 将SpringData分页后的list转为分页信息
     */
    public static <T> CommonPage<T> restPage(Page<T> pageInfo) {
        CommonPage<T> result = new CommonPage<T>();
        result.setTotalPage(pageInfo.getTotalPages());
        result.setPageNum(pageInfo.getNumber());
        result.setPageSize(pageInfo.getSize());
        result.setTotal(pageInfo.getTotalElements());
        result.setList(pageInfo.getContent());
        return result;
    }


}

3、生成实体类的插件

比较头疼的事情是什么,就是ORM模型构建,这个表创建好了,一个一个创建对象,再加注解,简直是搞自己心态吧。其实呢,IDEA已经给我们提供了插件。

两步就能自动生成Model模型了。

3.1、第一步:配置

找到表,右键到序号3的编辑器中,覆盖文件内容。文件内容如下。仔细看配置,你就能明白这个脚本,做一些自己的调整,和MyBatis Genernate MyBatis Plus 那种生成针对的方面也差不多,啥包位置了,作者啦,去表前缀了。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LHop7Ohz-1640484782622)(D:\my_notebook\typora笔记图片统一管理处\image-20211226100411122.png)]

import com.intellij.database.model.DasTable
import com.intellij.database.model.ObjectKind
import com.intellij.database.util.Case
import com.intellij.database.util.DasUtil

import java.text.SimpleDateFormat

/*
 * Available context bindings:
 *   SELECTION   Iterable<DasObject>
 *   PROJECT     project
 *   FILES       files helper
 */
packageName = ""
typeMapping = [
        (~/(?i)tinyint|smallint|mediumint/)      : "Integer",
        (~/(?i)int/)                             : "Long",
        (~/(?i)bool|bit/)                        : "Boolean",
        (~/(?i)float|double|decimal|real/)       : "BigDecimal",
        (~/(?i)datetime|timestamp|date|time/)    : "Date",
        (~/(?i)blob|binary|bfile|clob|raw|image/): "InputStream",
        (~/(?i)/)                                : "String"
]


FILES.chooseDirectoryAndSave("Choose directory", "Choose where to store generated files") { dir ->
    SELECTION.filter { it instanceof DasTable && it.getKind() == ObjectKind.TABLE }.each { generate(it, dir) }
}

def generate(table, dir) {
    def className = javaClassName(table.getName(), true)
    def fields = calcFields(table)
    packageName = getPackageName(dir)
    PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(new FileOutputStream(new File(dir, className + ".java")), "UTF-8"))
    printWriter.withPrintWriter { out -> generate(out, className, fields, table) }

//    new File(dir, className + ".java").withPrintWriter { out -> generate(out, className, fields,table) }
}

// 获取包所在文件夹路径
def getPackageName(dir) {
    return dir.toString().replaceAll("\\\\", ".").replaceAll("/", ".").replaceAll("^.*src(\\.main\\.java\\.)?", "") + ";"
}

def generate(out, className, fields, table) {
    out.println "package $packageName"
    out.println ""
    out.println "import javax.persistence.Column;"
    out.println "import javax.persistence.Entity;"
    out.println "import javax.persistence.Table;"
    out.println "import javax.persistence.Id;"
    out.println "import javax.persistence.GeneratedValue;"
    out.println "import java.io.Serializable;"
    Set types = new HashSet()

    fields.each() {
        types.add(it.type)
    }

    if (types.contains("Date")) {
        out.println "import java.util.Date;"
    }

    if (types.contains("BigDecimal")) {
        out.println "import java.math.BigDecimal;"
    }

    if (types.contains("InputStream")) {
        out.println "import java.io.InputStream;"
    }
    out.println ""
    out.println "/**\n" +
            " * @Description  \n" +
            " * @Author  wangnaixing\n" + //1. 修改idea为自己名字
            " * @Date " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + " \n" +
            " */"
    out.println ""
    out.println "@Entity"
    out.println "@Table ( name =\"" + table.getName() + "\" , schema = \"\")" //2. schema = \"后面添加自己的表空间名称(mysql可以不添加, 不用这个schema属性也行)
    out.println "public class $className  implements Serializable {"
    out.println ""
    out.println genSerialID()
    fields.each() {
        out.println ""
        // 输出注释
        if (isNotEmpty(it.commoent)) {
            out.println "\t/**"
            out.println "\t * ${it.commoent.toString()}"
            out.println "\t */"
        }

        if ((it.annos+"").indexOf("[@Id]") >= 0) out.println "\t@Id"

        if (it.annos != "") out.println "   ${it.annos.replace("[@Id]", "")}"


        // 输出成员变量
        out.println "\tprivate ${it.type} ${it.name};"
    }

    // 输出get/set方法
    fields.each() {
        out.println ""
        out.println "\tpublic ${it.type} get${it.name.capitalize()}() {"
        out.println "\t\treturn this.${it.name};"
        out.println "\t}"
        out.println ""

        out.println "\tpublic void set${it.name.capitalize()}(${it.type} ${it.name}) {"
        out.println "\t\tthis.${it.name} = ${it.name};"
        out.println "\t}"
    }

    // 输出toString方法
    out.println ""
    out.println "\t@Override"
    out.println "\tpublic String toString() {"
    out.println "\t\treturn \"{\" +"
    fields.each() {
        out.println "\t\t\t\t\t\"${it.name}='\" + ${it.name} + '\\'' +"
    }
    out.println "\t\t\t\t'}';"
    out.println "\t}"

    out.println ""
    out.println "}"
}

def calcFields(table) {
    DasUtil.getColumns(table).reduce([]) { fields, col ->
        def spec = Case.LOWER.apply(col.getDataType().getSpecification())

        def typeStr = typeMapping.find { p, t -> p.matcher(spec).find() }.value
        def comm = [
                colName : col.getName(),
                name    : javaName(col.getName(), false),
                type    : typeStr,
                commoent: col.getComment(),
                annos   : "\t@Column(name = \"" + col.getName() + "\" )"]
        if ("id".equals(Case.LOWER.apply(col.getName())))
            comm.annos += ["@Id"]
        fields += [comm]
    }
}

// 这里是处理数据库表前缀的方法,这里处理的是t_xxx命名的表
// 已经修改为使用javaName, 如果有需要可以在def className = javaName(table.getName(), true)中修改为javaClassName
// 处理类名(这里是因为我的表都是以t_命名的,所以需要处理去掉生成类名时的开头的T,
// 如果你不需要去掉表的前缀,那么请查找用到了 javaClassName这个方法的地方修改为 javaName 即可)
def javaClassName(str, capitalize) {
    def s = com.intellij.psi.codeStyle.NameUtil.splitNameIntoWords(str)
            .collect { Case.LOWER.apply(it).capitalize() }
            .join("")
            .replaceAll(/[^\p{javaJavaIdentifierPart}[_]]/, "_")
    // 去除开头的T  http://developer.51cto.com/art/200906/129168.htm
    s = s[1..s.size() - 1]
    capitalize || s.length() == 1 ? s : Case.LOWER.apply(s[0]) + s[1..-1]
}

def javaName(str, capitalize) {
//    def s = str.split(/(?<=[^\p{IsLetter}])/).collect { Case.LOWER.apply(it).capitalize() }
//            .join("").replaceAll(/[^\p{javaJavaIdentifierPart}]/, "_")
//    capitalize || s.length() == 1? s : Case.LOWER.apply(s[0]) + s[1..-1]
    def s = com.intellij.psi.codeStyle.NameUtil.splitNameIntoWords(str)
            .collect { Case.LOWER.apply(it).capitalize() }
            .join("")
            .replaceAll(/[^\p{javaJavaIdentifierPart}[_]]/, "_")
    capitalize || s.length() == 1 ? s : Case.LOWER.apply(s[0]) + s[1..-1]
}

def isNotEmpty(content) {
    return content != null && content.toString().trim().length() > 0
}

static String changeStyle(String str, boolean toCamel) {
    if (!str || str.size() <= 1)
        return str

    if (toCamel) {
        String r = str.toLowerCase().split('_').collect { cc -> Case.LOWER.apply(cc).capitalize() }.join('')
        return r[0].toLowerCase() + r[1..-1]
    } else {
        str = str[0].toLowerCase() + str[1..-1]
        return str.collect { cc -> ((char) cc).isUpperCase() ? '_' + cc.toLowerCase() : cc }.join('')
    }
}

//生成序列化的serialVersionUID
static String genSerialID() {
    return "\tprivate static final long serialVersionUID =  " + Math.abs(new Random().nextLong()) + "L;"
}


3.2、第二步:生成POJO到指定位置

一张图,自己摸索吧。

在这里插入图片描述

项目文件在我提供的资源可以下载看到源码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JPA基本使用 的相关文章

  • MySQL - 通过部分单词匹配和相关性评分进行高效搜索(全文)

    如何进行 MySQL 搜索 既匹配部分单词 又提供准确的相关性排序 SELECT name MATCH name AGAINST math IN BOOLEAN MODE AS relevance FROM subjects WHERE M
  • 从 MySQL 返回结果时的数字顺序

    我的数据库表中有以下类型的标题 Topic 1 blah blah Topic 2 blah blah Topic 3 blah blah Topic 10 blah blah Topic 11 blah blah etc 选择查询将始终返
  • Cassandra 与 ZooKeeper 的事务 - 这有效吗?

    我正在尝试在 ZooKeeper 的帮助下为 Cassandra 实现一个事务系统 由于我认为我在数据库实现方面没有足够的经验 所以我想知道我的想法原则上是否可行 或者是否有任何重大缺陷 以下是步骤的高级描述 识别所有要编辑的行 键 和列
  • 将“选票”存储在数据库中

    我正在编写一个 Intranet 应用程序 其功能之一大致类似于内容投票 与 SO Amazon 和许多其他网站的做法不同 假设每个可投票的内容都有一个唯一的 ID 并且每个用户 他们经过身份验证 都有一个唯一的 ID 最简单的方法似乎是有
  • 开发 WordPress 管理链接重定向到实时站点

    我正在尝试对我拥有的 WordPress 网站进行新的更改 所以我复制了所有文件并导出到新的开发子域 为子域创建新数据库并从实时站点导入数据库 直播站点 http mysite com http mysite com 开发站点 http d
  • 如何在 BigQuery/SQL 中将行转置为包含大量数据的列?

    我在将 BigQuery 中的大量数据表 15 亿行 从行转置为列时遇到问题 我可以弄清楚如何在硬编码时使用少量数据来完成此操作 但是对于如此大量的数据 该表的快照如下所示 CustomerID Feature Value 1 A123 3
  • 需要 SQL 选择查询帮助

    我的问题类似于SQL选择组查询 https stackoverflow com questions 11407601 sql select group query 但模式发生了变化 我想要不同的结果 如下所述 给定链接的解决方案没有给我正确
  • 如何将UTF-8编码的汉字从MySql正确导出到SQL

    过去三天我们正在与严重的问题作斗争 我们从PhpmyAdmin导出MySql数据库文件 数据库条目中写入的数据是带有UTF 8字符集的中文 导出后将其转换为拉丁字符集 现在我们正在将此数据库SQl文件导入到其他主机 我们在UTF 8和排序规
  • Android spinner 将多列(连接)Sqlite 数据库加载到表中

    我正在学习如何创建一个从 SQLite 加载下拉列表的微调器 我有一个由旋转器和表格组成的用户界面 如果用户单击微调器 表的内容将根据微调器上选定的 ID 根据数据库加载 如果未选择名称 它将加载表中的所有内容 但是我找不到如何根据微调器上
  • 使用 Hibernate 用瞬态对象更新持久对象

    每天 数据都是通过网络服务导入的 我创建一个新的 暂时的 实例我通过 JPA 注释在 hibernate 中映射的 pojo 的 我将数据从 Web 服务填充到瞬态实例中 我从数据库加载持久对象 我想用瞬态实例中的数据更新该持久对象 我以某
  • mysql - 选择日期时间和组中的小时

    我有一个 ShoppingDates 的日期时间列 假设我有 1000 行 2012 年 7 月 18 日 5 33 39 下午 2012 年 7 月 16 日 6 64 39 下午 2012 年 7 月 14 日 7 34 39 下午 2
  • 如何在同一列中选择多个值?

    我正在尝试在单个列中选择多个值 基本上我希望查询选择列下的所有内容family有价值观Software 1Y XI 1Y and P1 1Y 我正在运行这个查询 SELECT salesorder masterproduct family
  • SELECT COUNT() 与 mysql_num_rows();

    我有一个大表 60 数百万条记录 我正在使用 PHP 脚本来浏览该表 PHP 脚本 带分页 加载速度非常快 因为 表引擎是InnoDB因此SELECT COUNT 非常慢并且mysql num rows 不是一个选项 所以我将总行数 我用来
  • 检测 MySQL 中的 utf8 损坏字符

    我有一个数据库 其中有一堆损坏的 utf8 字符分散在多个表中 字符列表不是很广泛 AFAIK 修复给定的表非常简单 update orderItem set itemName replace itemName 但我无法找到检测损坏字符的方
  • Mysql使用触发器建表

    我尝试在 Mysql 触发器内创建表 但没有创建 如何使用触发器创建表 这里传递的表的名称是动态的 据我所知 在触发器内创建表是不可能的 看这里 http forums mysql com read php 99 121849 122609
  • Java 日期和 MySQL 时间戳时区

    我正在编辑一段代码 其基本功能是 timestamp new Date 然后坚持下去timestamp中的变量TIMESTAMPMySQL 表列 然而 通过调试我看到Date显示在正确时区的对象 GMT 1 当持久化在数据库上时 它是GMT
  • MySQL 错误 1264:列的值超出范围

    As I SETMySQL 中的 cust fax 表如下所示 cust fax integer 10 NOT NULL 然后我插入这样的值 INSERT INTO database values 3172978990 但随后它说 错误 1
  • Laravel Eloquent with()-> 返回 null

    我正在尝试使用 Eloquent 来获取具有以下功能的特定产品 brand id映射到a的列brands表 该brand数组返回空 这里有什么明显需要改变的地方吗 product Product with images gt with br
  • 如何检测数据库类型?

    我需要确保我连接的数据库是 MySQL 而不是 PostgreSQL 或 Microsoft SQL Server 我怎样才能知道正在使用哪种类型的数据库 第一个提示可能是如果您尝试使用 mySQL 数据库驱动程序连接到 PostgreSQ
  • 学说 - 获取下一个和上一个记录

    这样我就已经获取了一些记录 我已创建日期字段 现在我想按日期获取下一条和上一条记录 通过以下方式让它工作 qb this gt createQueryBuilder a next qb gt expr gt gt a created dat

随机推荐

  • Liunx下pip3换源(最详细)

    在使用python时我们经常会安装各种包 我们一般安装的方式都是pip3 install xx模块 但是pip3默认源https pypi org 安装的过程非常慢 可能都是几k几k的 有时安装这安装着 直接error了 还有一种情况是直接
  • 微信公众号订阅消息

    1 官网介绍 功能介绍 微信开放文档 订阅通知是一个用户主动订阅 服务号按需下发的通知能力 使用过程请遵守 微信公众平台服务协议 微信公众平台运营规范 如有疑问 可在微信开放社区反馈 设置订阅功能 服务号可以在图文消息 网页等场景设置订阅功
  • iOS基本内存管理:autorelease和autoreleasepool

    在内存管理的Objective C代码里 一个Cocoa对象存在于一个生命周期 有明确的阶段 它被创建 初始化 并使用 也就是 其它对象发送消息给它 它还可能会被保留 拷贝 或压缩 并最终被释放和销毁 AD 1 autorelease 基本
  • ChatGPT 和爬虫有什么区别?

    ChatGPT是一种基于人工智能的对话模型 它通过训练大量的文本数据来生成自然语言回复 它可以用于实现智能对话系统 能够理解用户的输入并生成相应的回复 ChatGPT的目标是模拟人类对话 使得对话更加流畅和自然 而爬虫是一种用于自动化地从互
  • 算法 - 基数排序(Radix Sort)

    基数排序非常适合用于整数排序 尤其是非负整数 因此只演示对非负整数进行基数排序 执行流程 一次对个位数 十位数 百位数 千位数 万位数 进行排序 从低位到高位 个位数 十位数 百位数的取值范围都是固定的0 9 可以使用计数排序对它们进行排序
  • QT_6(信号连接信号、Lambda表达式)

    信号连接信号 运行代码 修改mywidget cpp文件如下 这是窗口界面 include mywidget h include
  • 关于建筑物半自动化提取方法的总结

    基于边界 基于边界的交互式提取方法要求用户指定目标边界的少量关键点或大概位置 然后基于目标边界强度和连续性等特征 对目标的边界进行准确跟踪 常见的基于边界方法是Snake算法和智能剪刀 Intelligent Scissors 基于边界方法
  • [附源码]计算机毕业设计社区生活废品回收APPSpringboot程序

    项目运行 环境配置 Jdk1 8 Tomcat7 0 Mysql HBuilderX Webstorm也行 Eclispe IntelliJ IDEA Eclispe MyEclispe Sts都支持 项目技术 SSM mybatis Ma
  • 微信支付 api v3 支付通知 异步 验签失败 PHP

    微信支付v3 异步验签失败 此处我们接收参数 报文主体 一般是通过框架 自带的request接收 例如TP6 this gt request gt param 这里如果使用此接收方式在进行json转换验签会失败 我们需要用原生的接收方式 f
  • python之pandas简单介绍及使用(一)

    一 Pandas简介 1 Python Data Analysis Library 或 pandas 是基于NumPy 的一种工具 该工具是为了解决数据分析任务而创建的 Pandas 纳入了大量库和一些标准的数据模型 提供了高效地操作大型数
  • JVM系列(三) JVM垃圾判断及强引用关系

    1 判断垃圾对象 如何判断该对象是垃圾 或者该对象要被回收 引用计数法 在对象中添加一个引用计数器 每当有一个地方引用它时 计数器值就 1 当引用失效时 计数器值就 1 任何时刻计数器为 0 的对象就是没人用的 那么就要被回收 优点是原理简
  • Game101课程笔记_lecture10_几何

    Game101课程笔记 lecture10 几何 1 纹理应用 1 环境光 环境贴图 2 凹凸贴图 法线贴图 1 Bump Mapping 3 位移贴图 4 三维纹理 5 环境光遮蔽 6 体渲染3D Texture and Volume R
  • Bookface(中位数,保序回归)

    include
  • int 和 Integer 作为接收参数类型,参数长度不能大于10?

    今天的博客主题 Java开发路上的小坑坑 int 和 Integer 作为接收参数类型 参数长度不能大于10 int 和 Integer 作为接收参数类型 参数长度不能大于10 What 就问问小菜鸟惊讶不惊讶 大佬略过 public st
  • Shell中的$0、$1、$2的含义

    0 就是编写的shell脚本本身的名字 1 是在运行shell脚本传的第一个参数 2 是在运行shell脚本传的第二个参数 如 新建了一个shell脚本 test sh bin sh echo shell脚本名称 0 echo 传到shel
  • three.js引用FontLoader()报错Unexpected token < in JSON at position 1

    使用three js的FontLoader 时 总是报错 文件也是正常的引入的json文件 但是还是报错 后来各自百度发现是文件路径的问题 报错时我使用的是相对路径 const loader new THREE FontLoader con
  • background 背景属性详解

    background 背景属性 我们知道元素有前景色color 与之对应的还有背景色 通过background我们可以为元素添加实色 background color 和任意多个背景图片 background image css 背景常见属
  • 计算机网络(二):TCP篇

    文章目录 1 TCP头部包含哪些内容 2 为什么需要 TCP 协议 TCP 工作在哪一层 3 什么是 TCP 4 什么是 TCP 连接 5 如何唯一确定一个 TCP 连接呢 6 UDP头部大小是多少 包含哪些内容 7 TCP与UDP的区别
  • nvidia训练深度学习模型利器apex使用解读

    本文参考 英伟达 NVIDIA 训练深度学习模型神器APEX使用指南 咆哮的阿杰的博客 CSDN博客 apex 英伟达 Pytorch混合精度 FP16 FP32 AMP 半精度 训练 二 代码示例 apex pytorch hxxjxw的
  • JPA基本使用

    JPA的基本使用 这段时间看了下JPA 简单的做个笔记吧 1 搭建环境 1 1 application yaml 我用的是Mysql 需要数据库连接驱动 数据源看你心情吧 系统也有默认的数据源 spring datasource url j