Java教程 第11页 JPA 教程 – JPA 字段映射示例 当将 Java bean 字段映射到数据库列时,我们可以选择标记字段,标记 getter 方法并标记两者。 标记字段 以下代码来自 Professor.java。 它显示如何将主键列标记为 Java bean 字段标识。 package cn.w3cschool.common; import javax.persistence.Entity; import javax.persistence.Id; @Entity public class Professor { @Id private int id; private String name; private long salary; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public long getSalary() { return salary; } public void setSalary(long salary) { this.salary = salary; } public String toString() { return "Employee id: " + getId() + " name: " + getName() + " salary: " + getSalary(); } } 下面的代码来自 PersonDaoImpl.java。 package cn.w3cschool.common; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import org.springframework.transaction.annotation.Transactional;...
2024-04-01
Java 面向对象设计 – Java 终止块 try 块也可以有零个或一个 finally 块。 finally 块总是与 try 块一起使用。 语法 使用 finally 块的语法是 finally { // Code for finally block } finally 块以关键字 finally 开始,后面紧跟一对大括号。 finally 块的代码放在大括号内。 try,catch 和 finally 块有两种可能的组合: try - catch - finally 或 try - finally 。 try 块可以后跟零个或多个 catch 块。 try 块最多可以有一个 finally 块。 try 块必须有一个 catch 块,一个 finally 块,或者两者兼而有之。 try-catch-finally 块的语法是: try { // Code for try block } catch(Exception1 e1) { // Code for catch block } finally { // Code for finally block } try - finally 块的语法是: try { // Code for try block } finally { // Code for finally block } 无论在相关联的 try 和 / 或 catch 块中发生什么,finally 块都被保证被执行。 通常,我们使用 finally 块来写清理代码。 例如,我们可能获得一些资源,当我们完成它们时,必须释放。 try -...
2024-04-01
JavaFX教程 – JavaFX 菜单 菜单是桌面应用程序选择选项的标准方法。 菜单和菜单项可以具有用于选择选项的键组合,称为键盘快捷键。 创建菜单和菜单项 我们必须创建一个菜单栏 javafx.scene.control.MenuBar 对象来保存 javafx.scene.control.Menu 对象。 菜单对象可以包含 Menu 和 javafx.scene.control.MenuItem 对象。菜单可以包含其他菜单作为子菜单。MenuItems 是 Menu 对象内的子选项。 以下代码显示如何创建菜单栏并添加菜单和菜单项。 菜单类是 MenuItem 的子类,它有一个 getItems()。add() 方法,它能够添加例如其他 Menu 和 MenuItem 实例。 import javafx.application.Application; import javafx.application.Platform; import javafx.scene.Scene; import javafx.scene.control.CheckMenuItem; import javafx.scene.control.Menu; import javafx.scene.control.MenuBar; import javafx.scene.control.MenuItem; import javafx.scene.control.RadioMenuItem; import javafx.scene.control.SeparatorMenuItem; import javafx.scene.control.ToggleGroup; import javafx.scene.layout.BorderPane; import javafx.scene.paint.Color; import javafx.stage.Stage; public class Main extends Application { @Override public void start(Stage primaryStage) { BorderPane root = new BorderPane(); Scene scene = new Scene(root, 300, 250, Color.WHITE); MenuBar menuBar = new MenuBar(); menuBar.prefWidthProperty().bind(primaryStage.widthProperty()); root.setTop(menuBar); // File menu - new, save, exit Menu fileMenu = new Menu("File"); MenuItem newMenuItem = new MenuItem("New"); MenuItem saveMenuItem = new MenuItem("Save"); MenuItem exitMenuItem = new MenuItem("Exit"); exitMenuItem.setOnAction(actionEvent -> Platform.exit()); fileMenu.getItems().addAll(newMenuItem, saveMenuItem,...
2024-04-01
JavaFX教程 – JavaFX WebEngine JavaFX 提供与 HTML5 内容互操作的功能。 JavaFX 中的底层网页渲染引擎是名为 WebKit 的流行的开源API。此 API 用于 Apple 的 Safari 浏览器,Amazon 的 Kindle 设备,并在 Google 的 Chrome 浏览器中使用。 嵌入式浏览器使您能够在 JavaFX 应用程序中执行以下任务: 从本地或远程 URL 呈现 HTML 获取网络历史记录 执行 JavaScript 命令 从 JavaScript 调用 JavaFX 管理网络弹出窗口 WebEngine JavaFX 提供了一个能够加载 HTML5 内容的非 GUI 组件,称为 WebEngine API(javafx.scene.web.WebEngine)。 这个 API 基本上是一个 WebEngine 类的对象实例,用于加载包含 HTML5 内容的文件。 要加载的 HTML5 文件可以位于本地文件系统,Web 服务器或 JAR 文件中。 使用 Web 引擎对象加载文件时,将使用后台线程来加载 Web 内容,以便它不会阻止 JavaFX 应用程序线程。 从网址载入 我们可以通过使用 WebEngine的load()方法从 URL 加载 Web 内容。 WebEngine 使用后台线程,坚持基于事件的编程模型。 Web 引擎可以从远程 Web 服务器异步加载 Web 内容,并在内容加载完成时通知处理程序代码。 以下代码从后台工作线程中的远程 Web 服务器加载 HTML 内容。 要监视或确定工作线程是否已完成 javafx.beans.value.ChangeListener 添加到 state 属性。 import javafx.application.Application; import javafx.concurrent.Worker.State; import javafx.scene.Group; import javafx.scene.Scene; import javafx.scene.web.WebEngine; import javafx.stage.Stage; public class Main extends Application { public static void main(String[] args) { Application.launch(args);...
2024-04-01
协程(Coroutine)这个词其实有很多叫法,比如有的人喜欢称为纤程(Fiber),或者绿色线程(GreenThread)。其实究其本质,对于协程最直观的解释是线程的线程。虽然读上去有点拗口,但本质上就是这样。 协程的核心在于调度那块由他来负责解决,遇到阻塞操作,立刻放弃掉,并且记录当前栈上的数据,阻塞完后立刻再找一个线程恢复栈并把阻塞的结果放到这个线程上去跑,这样看上去好像跟写同步代码没有任何差别,这整个流程可以称为coroutine,而跑在由coroutine负责调度的线程称为Fiber。 java协程的实现 早期,在JVM上实现协程一般会使用kilim,不过这个工具已经很久不更新了,现在常用的工具是Quasar,而本文章会全部基于Quasar来介绍。 下面尝试通过Quasar来实现类似于go语言的coroutine以及channel。 为了能有明确的对比,这里先用go语言实现一个对于10以内自然数分别求平方的例子。 func counter(out chan<- int) { for x := 0; x < 10; x++ { out <- x } close(out) } func squarer(out chan<- int, in <-chan int) { for v := range in { out <- v * v } close(out) } func printer(in <-chan int) { for v := range in { fmt.Println(v) } } func main() { //定义两个int类型的channel naturals := make(chan int) squares := make(chan int) //产生两个Fiber,用go关键字 go counter(naturals) go squarer(squares, naturals) //获取计算结果 printer(squares) } 上面这个例子,通过channel两解耦两边的数据共享。对于这个channel,大家可以理解为Java里的SynchronousQueue。下面我直接上Quasar版JAVA代码的,几乎可以原封不动的复制go语言的代码。 public class Example { private static void printer(Channel<Integer> in) throws SuspendExecution, InterruptedException { Integer v; while ((v = in.receive()) != null) { System.out.println(v); } } public static void main(String[] args) throws ExecutionException, InterruptedException, SuspendExecution { //定义两个Channel...
2024-04-01
Java 实例 – 数组合并 Java 实例 以下实例演示了如何通过List类的Arrays.toString ()方法和List类的list.Addall(array1.asList(array2)方法将两个数组合并为一个数组: /* author by w3cschool.cn 文件名:Main.java */ import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class Main { public static void main(String args[]) { String a[] = { "A", "E", "I" }; String b[] = { "O", "U" }; List list = new ArrayList(Arrays.asList(a)); list.addAll(Arrays.asList(b)); Object[] c = list.toArray(); System.out.println(Arrays.toString(c)); } } 以上代码运行输出结果为: [A, E, I, O, U]
2024-04-01
JavaFX教程 – JavaFX表视图 我们可以使用来自 JavaFX API 的 TableView,TableColumn 和 TableCell 类以表格形式表示数据。 通过实现数据模型和应用单元工厂来填充表中的数据。 表类可以按列排序数据,并在必要时调整列大小。 创建表 表控件是通过实例化 TableView 类创建的。 TableView table = new TableView(); table.setEditable(true); 然后使用 TableColumn 类创建三个列。TableView 类的 getColumns 方法将创建的列添加到表中。 TableColumn firstNameCol = new TableColumn("First Name"); TableColumn lastNameCol = new TableColumn("Last Name"); TableColumn emailCol = new TableColumn("Email"); table.getColumns().addAll(firstNameCol, lastNameCol, emailCol); 我们可以通过调用 setVisible 方法隐藏列。 aColumn.setVisible(false). 以下代码创建一个表。 import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.control.TableColumn; import javafx.scene.control.TableView; import javafx.scene.layout.StackPane; import javafx.stage.Stage; public class Main extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage primaryStage) { TableView table = new TableView(); table.setEditable(true); TableColumn firstNameCol = new TableColumn("First Name"); TableColumn lastNameCol = new TableColumn("Last Name"); TableColumn emailCol = new TableColumn("Email"); table.getColumns().addAll(firstNameCol, lastNameCol, emailCol); emailCol.setVisible(false); StackPane root = new StackPane(); root.getChildren().add(table); primaryStage.setScene(new...
2024-04-01
Java教程 – Java字符 在Java中,char存储字符。Java使用Unicode来表示字符。Unicode可以表示在所有人类语言中找到的所有字符。 Java char是16位类型。 字符的范围是 0 到 65,536 。没有负字符。 Char文字 Java中的字符是Unicode字符集的索引。字符表示在一对单引号内。例如,'a','z'和'@'。 这里是一个程序,演示char变量: public class Main { public static void main(String args[]) { char ch1, ch2; ch1 = 88; // code for X ch2 = 'Y'; System.out.print("ch1 and ch2: "); System.out.println(ch1 + " " + ch2);//ch1 and ch2: X Y } } 上面的代码生成以下结果。 ch1 被分配值88,它是对应于字母 X 的ASCII(和Unicode)值。 例子 char 类型值可以用作整数类型和您可以执行算术运算。 public class Main { public static void main(String args[]) { char ch1; ch1 = 'X'; System.out.println("ch1 contains " + ch1);//ch1 contains X ch1 = (char)(ch1 + 1); // increment ch1 System.out.println("ch1 is now " + ch1);//ch1 is now Y } } 上面的代码生成以下结果。 例2 下面的代码显示我们可以为非字母字符赋值Java字符类型。 public class Main { public static void main(String[] argv) { char ch = 'a'; System.out.println("ch...
2024-04-01
JPA教程 – JPA ElementCollection字符串映射示例 JPA(Java Persistence API)是 Sun 官方提出的 Java 持久化规范。它为Java开发人员提供了一种对象/关系映射工具来管理Java应用中的关系数据 JPA规范要求在类路径的 META-INF 目录下放置 persistence.xml JPA 中将一个类注解成实体类 (entity class) 有两种不同的注解方式:基于属性 (property-based) 和基于字段 (field-based) 的注解 基于字段的注解, 就是直接将注解放置在实体类的字段的前面 基于属性的注解, 就是直接将注解放置在实体类相应的getter方法前面(这一点和 Spring 正好相反),但是同一个实体类中必须并且只能使用其中一种注解方式 Entity、Table、Id、GeneratedValue、Basic、Column、Temporal、Transient、Lob、Transient、SecondaryTable、Embeddable、Embedded JPA注解 (1)Entity @javax.persistence.Entity(name=”xxx”) name 指定实体Bean的名称,默认值为 bean class 的非限定类名,select o from xxx o where o.id=?1 (2)Table @javax.persistence.Table(catalog=”xx”,name=”xx”,schema=”xx”,uniqueConstraints={ @UniqueConstraint(columnNames={“xx”,”xx”})}) name:指定表的名称 catalog:指定数据库名称 schema:指定数据库的用户名 uniqueConstraints:指定唯一性字段约束,如为personid 和name 字段指定唯一性约束 uniqueConstraints={ @UniqueConstraint(columnNames={“personid”, “name”})} (3)Id @javax.persistence.Id() 映射到数据库表的主键的属性,一个实体只能有一个属性被映射为主键. (4)GeneratedValue @javax.persistence.GeneratedValue(generator=”xxx”,strategy=GenerationType.AUTO) strategy:表示主键生成策略,有 AUTO,INDENTITY,SEQUENCE 和 TABLE 4种 分别表示让 ORM 框架自动选择,根据数据库的Identity字段生成,根据数据库表的 Sequence 字段生成,以有根据一个额外的表生成主键,默认为 AUTO generator:表示主键生成器的名称,这个属性通常和 ORM 框架相关,例如,Hibernate 可以指定 uuid 等主键生成方式. Hibernate UUID @Id @GeneratedValue(generator=”system-uuid”) @GenericGenerator(name=”system-uuid”,strategy = “uuid”) (5)Basic @javax.persistence.Basic(fetch=FetchType.LAZY,optional=true) fetch:抓取策略,延时加载与立即加载 optional:指定在生成数据库结构时字段是否允许为 null (6)Column @javax.persistence.Column(length=15,nullable=false,columnDefinition=””,insertable=true,scale=10,table=””,updatable=true) @Column 注解指定字段的详细定义 name:字段的名称,默认与属性名称一致 nullable:是否允许为 null,默认为 true unique:是否唯一,默认为 false length:字段的长度,仅对 String 类型的字段有效 columnDefinition:表示该字段在数据库中的实际类型 通常 ORM 框架可以根据属性类型自动判断数据库中字段的类型, 但是对于 Date 类型仍无法确定数据库中字段类型究竟是 DATE,TIME 还是 TIMESTAMP, 此外,String 的默认映射类型为 VARCHAR,如果要将 String 类型映射到特定数据库的 BLOB...
2024-04-01
Java 8 Lambda 表达式 Java 8 新特性 Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。 Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。 使用 Lambda 表达式可以使代码变的更加简洁紧凑。 语法 lambda 表达式的语法格式如下: (parameters) -> expression 或 (parameters) ->{ statements; } 以下是lambda表达式的重要特征: 可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。 可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。 可选的大括号:如果主体包含了一个语句,就不需要使用大括号。 可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值。 lambda表达式特征 可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。 可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。 可选的大括号:如果主体包含了一个语句,就不需要使用大括号。 可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值。 示例: //入参为空 TestDemo no_param = () -> "hi, no param"; TestDemo no_param2 = () -> { return "hi, no param"; }; System.out.println(no_param.hi()); //单个参数 TestDemo2 param = name -> name; TestDemo2 param2 = name -> { return name;}; System.out.println(param.hei("hei, grils")); //多个参数 TestDemo3 multiple = (String hello, String name) -> hello + " " + name; //一条返回语句,可以省略大括号和return TestDemo3 multiple2 = (hello, name) -> hello + name; //多条处理语句,需要大括号和return TestDemo3 multiple3 = (hello, name) -> { System.out.println("进入内部"); return hello + name; }; System.out.println(multiple.greet("hello", "lambda")); 方法引用 有以下几种类型...
2024-04-01