Hướng dẫn thêm local JAR vào Maven Dependency trong Maven project

Leave a Comment

Link Source: Hướng dẫn thêm local JAR vào Maven Dependency trong Maven project
Thể loại: Java, Lập trình
Tags: Học hành, Lập trình, Spring Framework

Cách thêm thư viện JAR vào Maven Dependency Maven project


thêm local JAR vào Maven Dependency


Add local jar to maven project


Sau đây mình sẽ hướng dẫn 2 cách thêm file jar vào Maven Dependency trong Maven project. Thông thường bạn chỉ cần tìm tên thư viện trên website mvnrepository.com là có thể copy vào file pom.xml. Nhưng nếu thư viện đó không có trên website đó thì sao? Bạn phải thêm bằng tay trên local máy tính bạn.


1- Cài đặt bằng tay file JAR vào local Maven repository


Các giải quyết đầu tiên là cài đặt bằng tay file JAR vào local Maven repository sử dụng lệnh install:install-file


Để dùng được lệnh mvn install bạn phải cài đặt maven trên máy tính của bạn. Xem Hướng dẫn cài đặt Maven trên Windows


Cách dùng đơn giản như sau:


mvn install:install-file -Dfile=<path-to-file>

Chú ý là chúng ta chưa thiết lập cụ thể groupIdartifactIdversion và packaging của file JAR cần cài đặt. Để có thể dùng được thư viện JAR trong pom.xml chúng ta nên khai báo chúng.


mvn install:install-file -Dfile=<path-to-file> -DgroupId=<group-id> -DartifactId=<artifact-id> -Dversion=<version>

Cụ thể là:


  • <path-to-file>: Đường dẫn tới file JAR để cài đặt

  • <group-id>: Group id của file JAR

  • <artifact-id>: Artifact id của file JAR

  • <version>:  Version của file JAR

Ví dụ cụ thể:


thêm local JAR vào Maven Dependency


mvn install:install-file -Dfile=D:\Java_Project\lib\CKFinder-2.6.2.1.jar -DgroupId=com.finder
-DartifactId=ckfinder -Dversion=2.6.2.1 -Dpackaging=jar

Bước 1: Với dòng lệnh trên chúng ta đã thêm file JAR vào Maven Dependency trong Project của bạn.


Bước 2: Sau đó thêm dependency tới Maven project của bạn bởi thêm các dòng lệnh sau trong file pom.xml


<dependency>
<groupId>com.finder</groupId>
<artifactId>ckfinder</artifactId>
<version>2.6.2.1</version>
</dependency>

thêm local JAR vào Maven Dependency


Xong rồi! cách Cài đặt bằng tay file JAR vào local Maven repository có 1 số nhược điểm như sau:


  • Không được nhanh do phải làm tới 2 bước mỗi file JAR.

  • Vào ngày đẹp trời bạn đổi local Maven repository thì bạn phải cài đặt lại file JAR đó.

  • Nếu có nhiều người cùng làm việc trong Project này thì mỗi người phải cài đặt file JAR vào local Maven repository của họ.

2- Thêm trực tiếp dependency bằng cách dùng system scope


Hướng giải quyết khác, thêm trực tiếp dependency bằng cách dùng system scope. Tức bạn chỉ cần làm bước 2 trong cách Cài đặt bằng tay file JAR vào local Maven repository đồng thời tham chiếu tới đuờng dẫn đầy đủ file JAR đó.


Cân nhắc là file JAR được đặt trong <PROJECT_ROOT_FOLDER>/lib. Sau đó thêm các lệnh sau vào file pom.xml


<dependency>
<groupId>com.finder</groupId>
<artifactId>ckfinder</artifactId>
<version>2.6.2.1</version>
<scope>system</scope>
<systemPath>$basedir/lib/CKFinder-2.6.2.1.jar</systemPath>
</dependency>

$basedir đại diện cho thư mục gốc của project nơi có file pom.xml


Xong rồi! Cách này có vẻ nhanh hơn cách Cài đặt bằng tay file JAR vào local Maven repository nhỉ 🙂


Trên đây là 2 cách thêm file jar vào Dependency trong Maven project mà mình thấy đơn giản. Ngoài ra có thể có nhiều cách khác nữa, bạn có thể tự tìm hiểu thêm!



Link Source: Hướng dẫn thêm local JAR vào Maven Dependency trong Maven project
Xem Tiếp

Tìm hiểu Spring MVC và Spring Boot trong Java Web

Leave a Comment

Link Source: Tìm hiểu Spring MVC và Spring Boot trong Java Web
Thể loại: Java, Lập trình
Tags: Học hành, Kiến thức, Lập trình, Spring Framework

Tìm hiểu Spring MVC và Spring Boot trong Java Web


springlogo


Bài viết này chúng ta sẽ tìm hiểu về Spring MVCSpring Boot thuộc Spring Framework trong dự án java web.


Spring là một open source framework dành cho Java Enterprise(bạn hiểu mùa xuân cũng được 🙂 ). Core feature của Spring có thể dùng để xây dựng bất cứ Java application nào, các extensions của Spring có thể được sử dụng cho việc xây dựng web application trên nền tảng Java EE. Spring framework cũng hướng tới mục tiêu làm cho việc phát triển các ứng dụng trên nền tảng Java EE dễ dàng hơn và thúc đẩy việc lập trình tốt hơn bằng model POJO-based.


Tại sao dùng Spring Framework? Lợi ích Spring Framework là gì?


Spring framework mang lại cho chúng ta sự gọn nhẹ (lightweight), sử dụng Inversion of control (IoC) để giúp loose coupling, sử dụng Aspect oriented programming để tách biệt các thành phần business, có container với quản lý tất cả life cycle và config của các object trong application, phát triển ứng dụng đơn giản với MVC, có transaction management, cung cấp các API tiện lợi cho việc handling exception.


Spring MVC là gì?


Spring có xây dựng một cơ chế có tên Spring MVC mà ở đó có các API cho phép việc xây dựng ứng dụng web được dễ dàng hơn và chuẩn hơn. Chuẩn hơn thể hiện ở chỗ mọi thành phần được tạo ra, cài đặt và vận hành tuân theo một chuẩn thiết kế thống nhất.


spring framework


Chắc các bạn thắc mắc MVC là viết tắt từ gì ?. MVC lần lượt là ba chữ cái đầu tiên của ba từ ModelView và Controller. MVC là một mô hình ứng dụng mà ở đó các thành phần được phân tách ra thành các lớp riêng biệt với các nhiệm vụ đặc trưng.


  • View sẽ là lớp cho các thành phần có chức năng hiển thị, giao tiếp trực tiếp với người dùng. Nhiệm vụ của các thành phần trong View là trình bày các dữ liệu từ Model đến người dùng cuối.

  • Model là các thành phần có khả năng lưu trữ và vận chuyển thông tin. Quá trình gửi dữ liệu vào Model sẽ được thực hiện bởi Controller.

  • Controller là các thành phần giúp cho việc xử lý logic các thao tác nghiệp vụ. Nhiệm vụ của Controller là lấy dữ liệu từ Model, xử lý dữ liệu, và cập nhật lại dữ liệu vào Model.

Ta cụ thể hóa ý tưởng trên vào trong trường hợp của Spring MVC. Ở đây View sẽ là các trang html hay jsp giúp cho việc hiển thị dữ liệu lên trình duyệt. Dữ liệu được lấy ra từ Model là các POJO (Plain Old Java Object) hay ta còn gọi là các Domain Object. Cụ thể hơn, nó là các đối tượng có các thuộc tính có khả năng truyền dữ liệu trong các luồng nghiệp vụ của ứng dụng. Cuối cùng là Controller, là các lớp đặc biệt, có chứa các phương thức có khả năng nhận yêu cầu, xử lý yêu cầu, cập nhật dữ liệu, và chuyển tiếp dữ liệu trong ứng dụng.


Hình ảnh dự án Spring MVC trong bài Lập trình Spring Boot CRUD đơn giản MyEmployee


springcrud (6)


Spring Boot là gì?


Spring Boot là một dự án phát triển bởi JAV (ngôn ngữ java) trong hệ sinh thái Spring framework. Nó giúp cho các lập trình viên chúng ta đơn giản hóa quá trình lập trình một ứng dụng với Spring, chỉ tập trung vào việc phát triển business cho ứng dụng.


spring-boot


Để phát triển một ứng dụng web cơ bản HelloWorld sử dụng Spring framework bạn sẽ cần ít nhất 5 công đoạn sau:


  • Tạo một project sử dụng Maven với các dependency cần thiết của Spring MVC và Servlet API.

  • Một tập tin web.xml hoặc application.properties để khai báo DispatcherServlet của Spring MVC.

  • Một tập tin cấu hình của Spring MVC.

  • Một class Controller trả về một trang “Hello World” khi có request đến.

  • Cuối cùng là phải có một web server dùng để triển khai ứng dụng lên chạy.

Trong các công đoạn này, chỉ có công đoạn tạo một class Controller thì có thể khác cho các ứng dụng khác nhau vì mỗi ứng dụng có một yêu cầu khác nhau. Còn các công đoạn khác thì như nhau.


Giờ đây với Spring Boot, chúng ta có thể tạo dự án Spring một cách nhanh chóng và cấu hình cũng đơn giản với Elipse + Plugin spring suite tool


Hướng dẫn Lập trình Hello World trong Spring boot với JSP View


Lập trình Hello World trong Spring boot với JSP View



Các bài hướng dẫn lập trình java spring framework trên ShareEverythings.com


Lập trình Spring Boot CRUD đơn giản MyEmployee


Quan hệ Many To Many Hibernate với Spring Boot


Quan hệ Many To Many cột mở rộng Hibernate với Spring Boot



Link Source: Tìm hiểu Spring MVC và Spring Boot trong Java Web
Xem Tiếp

Zeus Master of Olympus and Poseidon Master of Atlantis

Leave a Comment

Link Source: Zeus Master of Olympus and Poseidon Master of Atlantis
Thể loại: Game PC
Tags: Chiến thuật, Games, Mô phỏng, Quản lí


Zeus Master of Olympus and Poseidon Master of Atlantis



[Cũ mà hay] Zeus Master of Olympus and Poseidon Master of Atlantis là hai bản game chiến thuật rất nổi tiếng của Impression sau thành công Ceasar và Pharaoh. 


Đầu tiên, để chơi được bản mở rộng Poseidon Master of Atlantis, yêu cầu trong máy bạn phải có cài sẵn phiên bản Zeus cũ. Bạn sẽ có thể chọn chơi phiên bản Zeus hay Poseidon khi đã vào game. Tải 2 bản Link ở dưới.
poseidon-1poseidon-4
poseidon-2Theo truyền thuyết kể lại thì ngoài khơi Đại Tây Dương trước đây tồn tại một lục địa to lớn có tên là Atlantis. Do phạm phải tội vô lễ, thần Poseidon nổi giận vùi sâu Atlantic xuống lòng đại dương. Chuyến hành trình của chúng ta sẽ xoay quanh lục địa Atlantic, bắt đầu từ nơi lục địa bí ẩn này được sinh ra, phát triển hưng thịnh và suy tàn. Xây dựng một thành phố hoa lệ, thu hút một lượng lớn dân cư tứ xứ, triệu hồi thần linh, anh hùng bảo vệ lãnh thổ và tiêu diệt quái vật là những trọng trách to lớn mà bạn phải gánh vác khi hóa thân thành đại đế trong trò chơi. Bên cạnh đó, Poseidon còn có thêm rất nhiều chi tiết thú vị khi bạn tham gia vào trò chơi khám phá một trong ba cái nôi thần thoại của nhân loại (Hy Lạp, Ai Cập và Trung Quốc). poseidon-5 Trăm công nghìn việc Có nhiều lý do khiến Poseidon đứng tách biệt với hai đàn anh của nó. Điều làm tôi ưng ý nhất là Zeus và Poseidon đã bỏ đi những thao tác điều khiển phức tạp có từ thời Caesar 3. Rõ ràng nhất là game đã giảm các cấp nhà cửa từ 20 xuống còn 6 cấp để tránh những mâu thuẫn phát sinh khi nâng cấp nhà, tiện cho việc phát triển những khu dân cư mới mà vẫn đảm bảo sự phát triển cho khu phố chính. poseidon-6


Cách chơi không khác trò Caesar 3 hay Emperor Kingdom. Trước hết, để cho dân chúng “an cư lạc nghiệp” giúp bạn rảnh tay quản lý những việc khác, cơ bản chỉ cần cung cấp cho người dân ba nguồn thiết yếu: lương thực để ăn, lông cừu để giữ ấm và dầu ôliu để thắp sáng. poseidon-7Văn hoá trong Poseidon cũng có nhiều điểm khác biệt so với Zeus. Nhà sản xuất đã bỏ qua những công trình như nhà hát kịch nghệ, sân vận động mà thay vào đó là những công trình mang đậm tính khoa học như phòng thí nghiệm, viện bảo tàng… Như vậy cũng khá hợp lý vì theo những câu chuyện truyền thuyết thì người dân của lục địa Atlantic là những người say mê khoa học. poseidon-8Riêng về giải trí, thành phố của bạn sẽ có một môn thể thao hấp dẫn là đua ngựa. Ngựa bây giờ không chỉ được cung cấp để trở thành ngựa chiến trên sa trường mà còn được huấn luyện thành những con tuấn mã trên đường đua. poseidon-3
Sức mạnh thần thánh vô biên

Nếu so sánh với Caesar 3 hay Pharaoh thì quả thật Zeus đã tạo một bước ngoặt lớn khi sinh ra hình ảnh những vị thần sống động. Trong Caesar, bạn chỉ đơn giản xây một đền thờ nhỏ xíu và làm vui lòng thần linh bằng cách tổ chức lễ hội linh đình và thần linh sẽ thể hiện sự ban phước hoặc phẫn nộ qua những tia sét vô cảm. Trong Pharaoh, bạn mất hàng giờ để xây dựng những toà kim tự tháp vĩ đại, đẹp thật đấy nhưng nhìn chung không xứng đáng với công sức và thời gian bạn bỏ ra. Với Poseidon thì khác, hệ thống thần linh trở nên linh hoạt và quan trọng không chỉ trong đời sống tín ngưỡng mà còn ảnh hưởng sâu sắc đến mọi mặt của thành phố, từ giao thương, trồng trọt chăn nuôi đến những chuyện đại sự như chống xâm lăng hay hành quân chinh phạt. Do đó, trước khi quyết định một việc gì, khôn ngoan nhất là bạn nên tham khảo ý kiến của thần linh hay nếu phải xây dựng từ đầu, bạn nên chừa chỗ để xây cho các thần một đền thờ thật nguy nga, lộng lẫy, còn hiệu quả ra sao thì hãy tự mình khám phá nhé.
poseidon-9

Việc lựa chọn thần linh cho mình cũng không phải là điều dễ dàng. Chỉ riêng bản Zeus số lượng thần linh trong game đã là 11. Khi bước qua bản Poseidon, trò chơi được bổ sung thêm hai vị thần mới là Hera và Atlas nâng tổng số lên 13. Bạn thấy đấy, con số này hơn gấp đôi con số 5 vị thần trong Caesar và Pharaoh. Mỗi một thành phố chỉ có thể thờ phụng tối đa là ba vị thần cho nên hãy khéo léo xây dựng vừa đủ không gây lãng phí tài nguyên và nhân lực. Chọn lựa như thế nào? Ví dụ, thành phố bạn có nhiều đất nông nghiệp thì nên chọn Demeter, bà ta sẽ phù phép cho sản lượng lương thực tăng vọt. Nếu thành phố có nhiều mối giao thương thì chọn Hermes để tăng tốc độ và chu kỳ di chuyển của thương nhân, và nếu bạn có biển thì xây thêm đền thờ thần Poseidon để phù hộ cho tàu thuyền không bị đắm cũng như tiêu diệt quân xâm lăng bằng đường biển. Bạn có thể tham khảo thêm chức năng của mỗi vị thần trong mục Helps của trò chơi.
Kết Luận

Tóm lại, Poseidon là một game xây dựng rất hay với đủ mọi thứ có thể để bạn “động não”: nhà cửa, lương thực, dân chúng, thần thánh và quái vật… Không biết các bạn nghĩ sao còn bản thân tôi thấy Zeus và Poseidon là trò chơi xây dựng hay nhất trong số seri game xây dựng thành phố của hãng Impression Games.


Cấu hình


Minimum System Requirements

OS: Windows 2000/XP/7/8

Processor: 1.3 GHz

Memory: 256 Mb

Hard Drive: 2 Gb free

Video Memory: 64 Mb

Sound Card: DirectX Compatible

DirectX: 9.0


Nguồn: Sưu tầm


Video hướng dẫn



Download Zeus Master of Olympus and Poseidon Master of Atlantis 


Link mega ~ 1.12 GB. Bạn muốn tải an toàn và nhanh hơn => Cách bắt link mega với idm 


Mega

Link Mega



Link Source: Zeus Master of Olympus and Poseidon Master of Atlantis
Xem Tiếp

Quan hệ Many To Many cột mở rộng Hibernate với Spring Boot

Leave a Comment

Link Source: Quan hệ Many To Many cột mở rộng Hibernate với Spring Boot
Thể loại: Java, Lập trình
Tags: Hibernate Framework, Học hành, Lập trình, Spring Framework

Hướng dẫn tạo quan hệ liên kết nhiều nhiều (many to many) tạo bản phụ trong hibernate spring boot


many-to-many-extracolumns (3)


Many To Many Join Extra Column Relationship Mapping with Spring Boot


Trong bài này mình sẽ hướng dẫn dùng annotation manytomany thêm bảng phụ (trung gian) trong hibernate + spring boot + mysql


Lưu ý bài này mở rộng từ bài hướng dẫn dùng annotation manytomany không thêm bảng phụ (trung gian) trong hibernate + spring boot + mysql. Nếu bạn chưa đọc thì hãy đọc trước bài đó, bài này mình sẽ không viết chi tiết như bài trước đó mà chỉ tập trung vào phần trọng tâm mở rộng thôi!


Hướng dẫn quan hệ nhiều nhiều (many to many) cột mở rộng hibernate jpa với Spring Boot Project


Tạo bảng trong cơ sở dữ liệu


Trong bài này chúng ta sẽ có 3 bảng trong cơ sở dữ liệu: book, publisher, book_publisher. Vì thế bên Java tương ứng sẽ có 3 entity là Book.javaPublisher.java và BookPublisher.java


many-to-many-extracolumns (3)


Lược đồ cơ sở dữ liệu như bạn thấy, trong bảng phụ ngoài 2 khóa chính cũng là 2 khóa ngoại như bài trước thì còn có 1 field là published_date


Mapping a many-to-many extra columns relationship with Spring Boot, Spring Data JPA and MySQL.


Database many-to-many extra columns code mysql:


CREATE DATABASE IF NOT EXISTS `jpa_manytomany_extracolumns` /*!40100 DEFAULT CHARACTER SET utf8 */;
USE `jpa_manytomany_extracolumns`;

--
-- Table structure for table `book`
--

DROP TABLE IF EXISTS `book`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `book` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Table structure for table `publisher`
--

DROP TABLE IF EXISTS `publisher`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `publisher` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8;

--
-- Table structure for table `book_publisher`
--

DROP TABLE IF EXISTS `book_publisher`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `book_publisher` (
`book_id` int(10) unsigned NOT NULL,
`publisher_id` int(10) unsigned NOT NULL,
`published_date` datetime DEFAULT NULL,
PRIMARY KEY (`book_id`,`publisher_id`),
KEY `fk_bookpublisher_publisher_idx` (`publisher_id`),
CONSTRAINT `fk_bookpublisher_book` FOREIGN KEY (`book_id`) REFERENCES `book` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `fk_bookpublisher_publisher` FOREIGN KEY (`publisher_id`) REFERENCES `publisher` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;

Cấu trúc project spring boot


many-to-many-extracolumns (1)


Vào phần chính nào, mình dùng Eclipse + plugin Spring suite Tool để tạo project spring boot nhanh nhất.


Tạo project Spring Starter Project như hình


many-to-many-extracolumns (2)


Sau khi tạo xong bạn sẽ thấy có class Manytomany1Application.java và file pom.xml


Nội dung file Manytomany1Application.java


package com.qlam.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Manytomany2Application
public static void main(String[] args)
SpringApplication.run(Manytomany2Application.class, args);


Nội dung file pom.xml


<?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.qlam</groupId>
<artifactId>manytomany2</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

<name>manytomany2</name>
<description>Demo project for Spring Boot shareeverythings.com</description>

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.7.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.8</java.version>
</properties>

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>


</project>

Khai báo các thực thể JPA Entity tức là các class trong package model


File BookPublisher.java


package com.qlam.demo.model;

import javax.persistence.*;

import java.io.Serializable;
import java.util.Date;

@Entity
@Table(name = "book_publisher")
public class BookPublisher implements Serializable
private static final long serialVersionUID = 1L;

private Book book;
private Publisher publisher;
private Date publishedDate;

@Id
@ManyToOne
@JoinColumn(name = "book_id")
public Book getBook()
return book;


public void setBook(Book book)
this.book = book;


@Id
@ManyToOne
@JoinColumn(name = "publisher_id")
public Publisher getPublisher()
return publisher;


public void setPublisher(Publisher publisher)
this.publisher = publisher;


@Column(name = "published_date")
public Date getPublishedDate()
return publishedDate;


public void setPublishedDate(Date publishedDate)
this.publishedDate = publishedDate;


File Book.java


package com.qlam.demo.model;

import javax.persistence.*;
import java.util.HashSet;
import java.util.Set;

@Entity
public class Book
private int id;
private String name;
private Set<BookPublisher> bookPublishers;

public Book()


public Book(String name)
this.name = name;
bookPublishers = new HashSet<>();


@Id
@GeneratedValue(strategy = GenerationType.AUTO)
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;


@OneToMany(mappedBy = "book", cascade = CascadeType.ALL, orphanRemoval = true)
public Set<BookPublisher> getBookPublishers()
return bookPublishers;


public void setBookPublishers(Set<BookPublisher> bookPublishers)
this.bookPublishers = bookPublishers;


File Publisher.java


package com.qlam.demo.model;

import javax.persistence.*;
import java.util.Set;

@Entity
public class Publisher
private int id;
private String name;
private Set<BookPublisher> bookPublishers;

public Publisher()



public Publisher(String name)
this.name = name;


@Id
@GeneratedValue(strategy = GenerationType.AUTO)
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;


@OneToMany(mappedBy = "publisher")
public Set<BookPublisher> getBookPublishers()
return bookPublishers;


public void setBookPublishers(Set<BookPublisher> bookPublishers)
this.bookPublishers = bookPublishers;


Tạo Spring Data JPA Repository


File BookRepository.java


package com.qlam.demo.repository;

import org.springframework.data.jpa.repository.JpaRepository;

import com.qlam.demo.model.Book;

public interface BookRepository extends JpaRepository<Book, Integer>

File PublisherRepository.java


package com.qlam.demo.repository;

import org.springframework.data.jpa.repository.JpaRepository;

import com.qlam.demo.model.Publisher;

public interface PublisherRepository extends JpaRepository<Publisher, Integer>

Khai báo chuỗi kết nối trong file Application Properties


Trong file application.properties thêm các đoạn code kết nối với mysql


spring.datasource.url=jdbc:mysql://localhost/jpa_manytomany_extracolumns
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

spring.jpa.show-sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect

Bạn cần lưu ý 3 dòng đầu tùy chỉnh lại cho đúng với kết nối mysql của bạn.


Chạy thử chương trình


Mình sẽ tạo 2 book A,B và 2 publisher A và B. Sau đó Book A sẽ có 2 publisher là A và B, còn book B chỉ có publisher là B thôi.


Trong file Manytomany2ApplicationTests.java trong phần src/test/resources mình tạo một số đối tượng để test thử như bên dưới.


package com.qlam.demo;

import java.util.Date;

import javax.transaction.Transactional;

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.SpringRunner;

import com.qlam.demo.model.Book;
import com.qlam.demo.model.BookPublisher;
import com.qlam.demo.model.Publisher;
import com.qlam.demo.repository.BookRepository;
import com.qlam.demo.repository.PublisherRepository;

@RunWith(SpringRunner.class)
@SpringBootTest
public class Manytomany2ApplicationTests
@Autowired
private BookRepository bookRepository;

@Autowired
private PublisherRepository publisherRepository;

@Transactional
@Test
public void contextLoads()
Book bookA = new Book("Book A");
Book bookB = new Book("Book B");

Publisher publisherA = new Publisher("Publisher A");
Publisher publisherB = new Publisher("Publisher B");

BookPublisher bookPublisher = new BookPublisher();
bookPublisher.setBook(bookA);
bookPublisher.setPublisher(publisherA);
bookPublisher.setPublishedDate(new Date());
bookA.getBookPublishers().add(bookPublisher);

BookPublisher bookPublisher2 = new BookPublisher();
bookPublisher2.setBook(bookA);
bookPublisher2.setPublisher(publisherB);
bookPublisher2.setPublishedDate(new Date());
bookA.getBookPublishers().add(bookPublisher2);

BookPublisher bookPublisher3 = new BookPublisher();
bookPublisher3.setBook(bookB);
bookPublisher3.setPublisher(publisherB);
bookPublisher3.setPublishedDate(new Date());
bookB.getBookPublishers().add(bookPublisher3);

publisherRepository.save(publisherA);
publisherRepository.save(publisherB);
bookRepository.save(bookA);
bookRepository.save(bookB);
// test
System.out.println(bookA.getBookPublishers().size());


Kết quả chạy, mình chỉ copy phần chính thôi!


Hibernate: insert into publisher (name) values (?)
Hibernate: insert into publisher (name) values (?)
Hibernate: insert into book (name) values (?)
Hibernate: insert into book_publisher (published_date, publisher_id, book_id) values (?, ?, ?)
Hibernate: insert into book_publisher (published_date, publisher_id, book_id) values (?, ?, ?)
Hibernate: insert into book (name) values (?)
2

Kết quả là trong bảng Book và Publisher sẽ có 2 Book và 2 Publisher tương ứng. Còn trong bảng book_publisher sẽ có 3 dòng trong đó có 1 book sẽ có 2 publisher và 1 book sẽ có 1 publisher.


Download source code


 



Link Source: Quan hệ Many To Many cột mở rộng Hibernate với Spring Boot
Xem Tiếp

DOWNLOAD PHẦN MỀM KEIL C UVISION v4 v5 Full Crack

Leave a Comment

Link Source: DOWNLOAD PHẦN MỀM KEIL C UVISION v4 v5 Full Crack
Thể loại: Phần mềm PC
Tags: Học hành, Lập trình, Phần mềm

DOWNLOAD PHẦN MỀM KEIL C MDK ARM v4 v5 Full Crack


keil (1)


Keil C là một phần mềm hỗ trợ cho người dùng trong việc lập trình cho vi điều khiển các dòng khác nhau (Atmel, AVR, PIC..). Keil C giúp người dùng soạn thảo và biên dịch chương trình C hay cả ASM thành ngôn ngữ máy để nạp vào vi điều khiển giúp chúng ta tương tác giữa vi điều khiển và người lập trình.


Download KEIL C UVISION 4 and KEIL C UVISION 5


Hôm nay, mình xin giới thiệu đến các bạn các bước cài đặt phần mềm lập trình cho ARM Keil C V5. Đầu tiên các bạn tải phần mềm Keil C V5 Full crack tại đây. (Keil C – V4 làm tương tự nhé).


KEIL C UVISION v4 v5 FULL CRACK


Hướng dẫn cài đặt Keil mdk ARM


Sau khi các bạn download phần mềm Keil C về, các bạn giải nén sẽ ra thư mục KeilC V5.


Trong thư mục ARM chứa bộ cài phần mềm Keil: mdk511.exe và c51v901.exe. Vui lòng chọn 1 trong 2 để cài đặt sau đó chạy keygen để crack. Chạy file mdk511.exe

Hộp thoại cài đặt xuất hiện, các bạn chọn Next.


keil (13)


Tick vào ô “I agree to all the terms of the preceding License Agreement”, sau đó chọn Next.


keil (12)


Tiếp theo, các bạn chọn đường dẫn lưu thư mục cài đặt, sau đó chọn Next.


keil (11)


Tiếp theo, các bạn điền đầy đủ thông tin, và chọn Next.


keil (10)


Sau đó các bạn chờ để máy tự động tiến hành cài đặt.


keil (9)


Sau khi máy cài đặt xong, các bạn chọn Finish.


keil (8)

Sau đó, hộp thoại Pack Installer xuất hiện, các bạn nhấn OK.


keil (7)


Trong hộp thoại Pack Installer, các bạn install dòng chip các bạn đang sử dụng.


keil (6)


Sau khi quá trình Install kết thúc, các bạn tắt hộp thoại Pack Installer.


Tiến hành crack


Các bạn chạy chương trình Keil uVision 5 vừa cài đặt ở dạng Run as Admin, sau đó vào File License Management.


keil (5)


Hộp thoại License Management xuất hiện, các bạn copy mã CID.


keil (4)


Sau đó, các bạn vào thư mục Crack /keygen, Click chạy file keygen.exe và làm theo các bước hướng dẫn trong hình sau.


keil (3)


Tiếp theo, quay trở lại hộp thoại License Management , và làm theo hướng dẫn như dưới đây.


keil (2)


Như vậy là đã xong các bước cài đặt và crack thành công phần mềm Keil C V5 cho 8051 & ARM.



Download Keil C V5 or Keil C V4 (nên dùng)



Chúc các bạn thành công!


KEIL C UVISION4 FULL CRACK


Nguồn: dammedientu.com/download-keilc-5-bid7.html



Link Source: DOWNLOAD PHẦN MỀM KEIL C UVISION v4 v5 Full Crack
Xem Tiếp

Proteus Pro 8.6 Full Portable Phần mềm giả lập mạch điện tử

Leave a Comment

Link Source: Proteus Pro 8.6 Full Portable Phần mềm giả lập mạch điện tử
Thể loại: Phần mềm PC
Tags: Designer, Giả lập, Học hành, Lập trình, Mô phỏng, Phần mềm

Proteus Pro 8.6 Full Portable Phần mềm giả lập mạch điện tử


proteus8


Proteus Pro 8.6 là phần mềm cho phép giả lập mô phỏng hoạt động của mạch điện tử bao gồm phần thiết kế mạch và viết chương trình điều khiển.proteus8 (1)


Proteus Pro 8.6 là phần mềm cho phép giả lập mô phỏng hoạt động của mạch điện tử bao gồm phần thiết kế mạch và viết chương trình điều khiển cho các họ vi điều khiển như MCS-51, PIC, AVR…Proteus là phần mềm mô phỏng mạch điện tử của Lancenter Electronics, mô phỏng cho hầu hết các linh kiện điện tử thông dụng, đặc biệt hỗ trợ cho cả các MCU như PIC, 8051, AVR, Motorola.


Phần mềm Proteus Pro 8.6 bao gồm 2 chương trình: ISIS cho phép mô phỏng mạch và ARES dùng để vẽ mạch in. Proteus là công cụ mô phỏng cho các loại Vi Điều Khiển khá tốt, nó hỗ trợ các dòng VĐK 8051, AVR, PIC, dsPIC, ARM … các giao tiếp I2C, SPI, CAN, USB, Ethenet,… ngoài ra còn mô phỏng các mạch số, mạch tương tự một cách hiệu quả.


Proteus Pro 8.6 là một phần mềm không còn xa lạ gì cho những bạn là dân Kỹ Thuật. Nó giúp bạn có thể mô phỏng mạch điện tử một cách chính xác nhất so với các chương trình tương tự. Bạn có thể thiết kế mạch, nguyên lý hoạt động, chạy thử nghiệm, thiết kế các mạch in với giao diện cực kì trực quan, thao tác dễ dàng chỉ việc kéo thả các linh kiện, kéo thả kết nối các chân kết nối với nhau một cách nhanh chóng.


proteus8 (3)


Các phần mềm trong bộ Proteus Professional 8.6


ISIS Schematic Capture- ISIS đã được nghiên cứu và phát triển trong hơn 12 năm và có hơn 12000 người dùng trên khắp thế giới. Sức mạnh của nó là có thể mô phỏng hoạt động của các hệ vi điều khiển mà không cần thêm phần mềm phụ trợ nào. Sau đó, phần mềm ISIS có thể xuất file sang ARES hoặc các phần mềm vẽ mạch in khác.Trong lĩnh vực giáo dục, ISIS có ưu điểm là hình ảnh mạch điện đẹp, cho phép ta tùy chọn đường nét, màu sắc mạch điện, cũng như thiết kế theo các mạch mẫu (templates).Những khả năng khác của ISIS là:


  • Tự động sắp xếp đường mạch và vẽ điểm giao đường mạch.

  • Chọn đối tượng và thiết lập thông số cho đối tượng dễ dàng

  • Xuất file thống kê linh kiện cho mạch

  • Xuất ra file Netlist tương thích với các chương trình làm mạch in thông dụng.

  • Đối với người thiết kế mạch chuyên nghiệp, ISIS tích hợp nhiều công cụ giúp cho việc quản lý mạch điện lớn, mạch điện có thể lên đến hàng ngàn linh kiện.

  • Thiết kế theo cấu trúc (hierachical design)

  • Khả năng tự động đánh số linh kiện.

proteus8 (2)


proteus8 (1)


Download Proteus Pro 8 gồm 2 bản: Proteus 8 Pro Full và Proteus Pro 8.6 SP2 Build 23525 Portable (nên cài) và hướng dẫn dùng phần mềm Proteus


Download Proteus 8 Pro Full


Hướng dẫn cài đặt Proteus 8

Chạy file setup

Trong bước setup type, chọn Use a locally installed Licence Key

Ấn Next đến khi hiện Licence Manager >> Browse đến file LICENCE.lxk trong thư mục crack >> Install

Chọn Yes, Next…

Cài xong. Copy thư mục “BIN” trong thư mục crack vào thư mục cài đặt mặc định là “C:\Program Files\Labcenter Electronics\Proteus 8 Professional”


Download Proteus Pro 8.6 SP2 Build 23525 Portable


Bản này chỉ cần giải nén và sử dụng (đã crack sẵn) nên tải !


Download hướng dẫn dùng phần mềm Proteus (sinh viên SPKT thực hiện)



Link Source: Proteus Pro 8.6 Full Portable Phần mềm giả lập mạch điện tử
Xem Tiếp

Quan hệ Many To Many Hibernate với Spring Boot

Leave a Comment

Link Source: Quan hệ Many To Many Hibernate với Spring Boot
Thể loại: Java, Lập trình
Tags: Hibernate Framework, Học hành, Lập trình, Spring Framework

Hướng dẫn tạo quan hệ liên kết nhiều nhiều (many to many) trong hibernate spring boot không tạo bản phụ


Many To Many Relationship Mapping with Spring Boot


Trong bài này mình sẽ hướng dẫn dùng annotation manytomany không thêm bảng phụ (trung gian) trong hibernate + spring boot + mysql


manytomany1 (1)


Hướng dẫn dùng annotation manytomany với bảng phụ (trung gian) trong hibernate + spring boot + mysql – đang update 🙂


Quan Hệ Liên Kết Giữa Các Đối Tượng Trong Hibernate


Association Mappings


Sau đây là bốn cách thức biểu diễn các mối quan hệ giữa các đối tượng, nó được biểu diễn theo hướng 1 chiều hoặc 2 chiều.












MAPPING TYPEDESCRIPTION
Many-to-OneMapping mối quan hệ nhiều – một trong Hibernate
One-to-OneMapping mối quan hệ một – một trong Hibernate
One-to-ManyMapping mối quan hệ một – nhiều trong Hibernate
Many-to-ManyMapping mối quan hệ nhiều – nhiều trong Hibernate

Hướng dẫn quan hệ nhiều nhiều (many to many) hibernate jpa với Spring Boot Project


Các công nghệ sử dụng:


  • Spring Boot

  • MySQL

  • Hibernate JPA (Spring Data)

Các công cụ phần mềm cần:


  • JDK 1.8 or later

  • Maven 3 or later

  • MySQL Server 5.6 or later

  • Eclipse + Plugin spring suite tool

Tạo bảng trong cơ sở dữ liệu


Trong bài này chúng ta sẽ có 3 bảng trong cơ sở dữ liệu: book, publisher, book_publisher. Nhưng bên java chúng ta chỉ cần 2 entity là book.javapublisher.java thôi.


manytomany1 (1)


Lược đồ cơ sở dữ liệu như bạn thấy bảng phụ chỉ có 2 khóa chính của 2 bản chính. Nếu thêm 1 field vào bản phụ này thì sao? Khi đó bạn không thể làm theo hướng dẫn này mà bạn phải làm theo Hướng dẫn dùng annotation manytomany với bảng phụ (trung gian) trong hibernate + spring boot + mysql


Database jpa_manytomany code:


CREATE DATABASE IF NOT EXISTS `jpa_manytomany`;
USE `jpa_manytomany`;

DROP TABLE IF EXISTS `book`;
CREATE TABLE `book` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8;

DROP TABLE IF EXISTS `publisher`;
CREATE TABLE `publisher` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8;


DROP TABLE IF EXISTS `book_publisher`;
CREATE TABLE `book_publisher` (
`book_id` int(10) unsigned NOT NULL,
`publisher_id` int(10) unsigned NOT NULL,
PRIMARY KEY (`book_id`,`publisher_id`),
KEY `fk_bookpublisher_publisher_idx` (`publisher_id`),
CONSTRAINT `fk_bookpublisher_book` FOREIGN KEY (`book_id`) REFERENCES `book` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `fk_bookpublisher_publisher` FOREIGN KEY (`publisher_id`) REFERENCES `publisher` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Cấu trúc project spring boot


manytomany1 (6)


Vào phần chính nào, mình dùng Eclipse + plugin Spring suite Tool để tạo project spring boot nhanh nhất.


Tạo project Spring Starter Project như hình


manytomany1 (4)


Sau đó thiết lập project


manytomany1 (3)manytomany1 (2)


Sau khi tạo xong bạn sẽ thấy có class Manytomany1Application.java và file pom.xml


Nội dung file Manytomany1Application.java


package com.qlam.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Manytomany1Application

public static void main(String[] args)
SpringApplication.run(Manytomany1Application.class, args);


 


Nội dung file pom.xml


<?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.qlam</groupId>
<artifactId>manytomany1</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

<name>manytomany1</name>
<description>Demo project for Spring Boot</description>

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.7.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.8</java.version>
</properties>

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>


</project>

Khai báo các thực thể JPA Entity tức là các class trong package model


Tạo package com.qlam.demo.model


Sau đó bạn tạo class Book.java như bên dưới:


package com.qlam.demo.model;

import javax.persistence.*;
import java.util.Set;

@Entity
public class Book
private int id;
private String name;
private Set<Publisher> publishers;

public Book()



public Book(String name)
this.name = name;


public Book(String name, Set<Publisher> publishers)
this.name = name;
this.publishers = publishers;


@Id
@GeneratedValue(strategy = GenerationType.AUTO)
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;


@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "book_publisher", joinColumns = @JoinColumn(name = "book_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "publisher_id", referencedColumnName = "id"))
public Set<Publisher> getPublishers()
return publishers;


public void setPublishers(Set<Publisher> publishers)
this.publishers = publishers;


@Override
public String toString()
String result = String.format(
"Book [id=%d, name='%s']%n",
id, name);
if (publishers != null)
for(Publisher publisher : publishers)
result += String.format(
"Publisher[id=%d, name='%s']%n",
publisher.getId(), publisher.getName());



return result;


Tiếp theo bạn tạo class Publisher.java cũng nằm trong package com.qlam.demo.model


package com.qlam.demo.model;

import javax.persistence.*;
import java.util.Set;

@Entity
public class Publisher
private int id;
private String name;
private Set<Book> books;

public Publisher()



public Publisher(String name)
this.name = name;


public Publisher(String name, Set<Book> books)
this.name = name;
this.books = books;


@Id
@GeneratedValue(strategy = GenerationType.AUTO)
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;


@ManyToMany(mappedBy = "publishers")
public Set<Book> getBooks()
return books;


public void setBooks(Set<Book> books)
this.books = books;


Mình sẽ giải thích một chút nhá!


@Entity khai báo đây là thực thể tương ứng với bảng trong cơ sở dữ liệu.


@Table dùng để maps các class java với bảng trong cơ sở dữ liệu theo tên. Ví dụ:


@Table(name = "bai")
public class Bai

Nếu bạn không khai báo tên trong @Table thì nó ngầm định bạn dùng tên bảng giống tên class.


@Id khai báo này cho biết thuộc tính này là khóa chính.


@Column dùng để maps với các field trong bảng cơ sở dữ liệu. Nếu bạn để trống, không khai báo thì nó ngầm định tên thuộc tính trong class tương ứng với tên field trong bảng.


@ManyToMany khai báo quan hệ many-to-many giữa 2 thực thể. Ví dụ cụ thể: quan hệ nhiều nhiều giữa book và publisher, nên trong class Book sẽ có danh sách các publisher và ngược lại.


@JoinTable thường đi chung với khai báo quan hệ liên kết Association Mappings. Được hiểu là kết với bảng nào. Ví dụ bảng book sẽ kết với bảng book_publisher qua cột ( @JoinColumn ) book_id và tham chiếu cột còn lại là: publisher_id


@JoinTable(name = "book_publisher", joinColumns = @JoinColumn(name = "book_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "publisher_id", referencedColumnName = "id"))

mappedBy được dùng bên bảng còn lại là publisher nói rằng sẽ maps với thuộc tính publishers bên bảng book. Ví dụ bên dưới!


@ManyToMany(mappedBy = "publishers")
public Set<Book> getBooks()
return books;

Tạo Spring Data JPA Repository


Sau khi tạo xong các class trong Model, chúng ta sẽ tạo Repository cho các class tương ứng. Ở đây mình làm nhanh để tập trung vào phần hibernate many to many nên không có class Service hay Implement nhá!


Spring Data JPA chứa một số kho tích hợp để thực hiện một số chức năng phổ biến để làm việc nhanh với cơ sở dữ liệu như: findOne, findAll, save, …


Tạo class BookRepository.java trong package com.qlam.demo.repository


package com.qlam.demo.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import com.qlam.demo.model.Book;

public interface BookRepository extends JpaRepository<Book, Integer>

Tiếp tục tạo class PublisherRepository.java trong package com.qlam.demo.repository


package com.qlam.demo.repository;

import org.springframework.data.jpa.repository.JpaRepository;

import com.qlam.demo.model.Publisher;

public interface PublisherRepository extends JpaRepository<Publisher, Long>

Khai báo chuỗi kết nối trong file Application Properties


Trong file application.properties thêm các đoạn code kết nối với mysql


spring.datasource.url=jdbc:mysql://localhost/jpa_manytomany
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

spring.jpa.show-sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect

Bạn cần lưu ý 3 dòng đầu tùy chỉnh lại cho đúng với kết nối mysql của bạn.


Chạy thử chương trình


Trong file Manytomany1ApplicationTests.java trong phần src/test/resources mình tạo một số đối tượng để test thử như bên dưới.


package com.qlam.demo;

import java.util.HashSet;

import javax.transaction.Transactional;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import com.qlam.demo.model.Book;
import com.qlam.demo.model.Publisher;
import com.qlam.demo.repository.BookRepository;
import com.qlam.demo.repository.PublisherRepository;

@RunWith(SpringRunner.class)
@SpringBootTest
public class Manytomany1ApplicationTests
private static final Logger logger = LoggerFactory.getLogger(Manytomany1Application.class);
@Autowired
private BookRepository bookRepository;

@Autowired
private PublisherRepository publisherRepository;

@Test
@Transactional
public void contextLoads()
// save a couple of books
Publisher publisherA = new Publisher("Publisher A");
Publisher publisherB = new Publisher("Publisher B");
Publisher publisherC = new Publisher("Publisher C");

bookRepository.save(new HashSet<Book>()

add(new Book("Book A", new HashSet<Publisher>()

add(publisherA);
add(publisherB);

));

add(new Book("Book B", new HashSet<Publisher>()

add(publisherA);
add(publisherC);

));

);

// fetch all books
for (Book book : bookRepository.findAll())
logger.info("\n" + book.toString());


// save a couple of publishers
Book bookA = new Book("Book A");
Book bookB = new Book("Book B");

publisherRepository.save(new HashSet<Publisher>()

add(new Publisher("Publisher A", new HashSet<Book>()

add(bookA);
add(bookB);

));

add(new Publisher("Publisher B", new HashSet<Book>()

add(bookA);
add(bookB);

));

);

// fetch all publishers
for (Publisher publisher : publisherRepository.findAll())
logger.info("\n"+publisher.toString());





Để chạy project spring boot bạn chọn theo hình dưới!


manytomany1 (5)


Kết quả chạy, mình chỉ copy phần chính thôi!


2017-10-02 15:17:52.498 INFO 11172 --- [ main] c.qlam.demo.Manytomany1ApplicationTests : Started Manytomany1ApplicationTests in 7.008 seconds (JVM running for 8.777)
2017-10-02 15:17:52.551 INFO 11172 --- [ main] o.s.t.c.transaction.TransactionContext : Began transaction (1) for test context [DefaultTestContext@2698dc7 testClass = Manytomany1ApplicationTests, testInstance = com.qlam.demo.Manytomany1ApplicationTests@6c0b51da, testMethod = contextLoads@Manytomany1ApplicationTests, testException = [null], mergedContextConfiguration = [WebMergedContextConfiguration@43d7741f testClass = Manytomany1ApplicationTests, locations = '', classes = 'class com.qlam.demo.Manytomany1Application', contextInitializerClasses = '[]', activeProfiles = '', propertySourceLocations = '', propertySourceProperties = 'org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true', contextCustomizers = set[org.springframework.boot.test.context.SpringBootTestContextCustomizer@3bfdc050, org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@5c3bd550, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@6a4f787b, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@0, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizerFactory$Customizer@3fee9989], resourceBasePath = 'src/main/webapp', contextLoader = 'org.springframework.boot.test.context.SpringBootContextLoader', parent = [null]]]; transaction manager [org.springframework.orm.jpa.JpaTransactionManager@5b0dbfb]; rollback [true]
Hibernate: insert into book (name) values (?)
Hibernate: insert into publisher (name) values (?)
Hibernate: insert into publisher (name) values (?)
Hibernate: insert into book (name) values (?)
Hibernate: insert into publisher (name) values (?)
2017-10-02 15:17:53.386 INFO 11172 --- [ main] o.h.h.i.QueryTranslatorFactoryInitiator : HHH000397: Using ASTQueryTranslatorFactory
Hibernate: select book0_.id as id1_0_, book0_.name as name2_0_ from book book0_
Hibernate: select publishers0_.book_id as book_id1_1_0_, publishers0_.publisher_id as publishe2_1_0_, publisher1_.id as id1_2_1_, publisher1_.name as name2_2_1_ from book_publisher publishers0_ inner join publisher publisher1_ on publishers0_.publisher_id=publisher1_.id where publishers0_.book_id=?
2017-10-02 15:17:53.887 INFO 11172 --- [ main] com.qlam.demo.Manytomany1Application :
Book [id=15, name='Book B']
Publisher[id=19, name='Publisher C']
Publisher[id=20, name='Publisher A']

Hibernate: select publishers0_.book_id as book_id1_1_0_, publishers0_.publisher_id as publishe2_1_0_, publisher1_.id as id1_2_1_, publisher1_.name as name2_2_1_ from book_publisher publishers0_ inner join publisher publisher1_ on publishers0_.publisher_id=publisher1_.id where publishers0_.book_id=?
2017-10-02 15:17:53.900 INFO 11172 --- [ main] com.qlam.demo.Manytomany1Application :
Book [id=16, name='Book A']
Publisher[id=21, name='Publisher B']
Publisher[id=20, name='Publisher A']

2017-10-02 15:17:53.900 INFO 11172 --- [ main] com.qlam.demo.Manytomany1Application :
Book [id=17, name='Book A']
Publisher[id=22, name='Publisher B']
Publisher[id=23, name='Publisher A']

2017-10-02 15:17:53.901 INFO 11172 --- [ main] com.qlam.demo.Manytomany1Application :
Book [id=18, name='Book B']
Publisher[id=24, name='Publisher C']
Publisher[id=23, name='Publisher A']

Hibernate: insert into publisher (name) values (?)
Hibernate: insert into publisher (name) values (?)
Hibernate: select publisher0_.id as id1_2_, publisher0_.name as name2_2_ from publisher publisher0_
2017-10-02 15:17:53.925 INFO 11172 --- [ main] com.qlam.demo.Manytomany1Application :
com.qlam.demo.model.Publisher@79ab97fd

Video chi tiết Hướng dẫn annotation many to many Hibernate Spring Boot không bản phụ



Xong rồi, qua bài Hướng dẫn tạo quan hệ liên kết nhiều nhiều (many to many) trong hibernate spring boot không tạo bản phụ bạn đã biết cách dùng project spring boot với annotation manytomany trong hibernate. Trong bài tiếp theo mình sẽ Hướng dẫn dùng annotation manytomany với bảng phụ (trung gian) trong hibernate + spring boot + mysql – đang update!



Link Source: Quan hệ Many To Many Hibernate với Spring Boot
Xem Tiếp

Hướng dẫn Hibernate Query Language (HQL) qua Ví Dụ

Leave a Comment

Link Source: Hướng dẫn Hibernate Query Language (HQL) qua Ví Dụ
Thể loại: Java, Lập trình
Tags: Hibernate Framework, Học hành, Lập trình

Hướng dẫn Hibernate Query Language (HQL) qua 14 ví dụ


Hướng dẫn Hibernate Query LanguageHibernate Query Language (HQL) Example


Hibernate ORM framework cung cấp ngôn ngữ truy vấn gọi là Hibernate Query Language viết tắt là HQL. Nó rất mạnh mẽ và linh hoạt và có các đặc điểm sau:


  • Tương tự như SQL: Cú pháp của HQL rất giống với SQL chuẩn. Nếu bạn quen thuộc với SQL thì viết HQL sẽ khá dễ dàng: từ SELECT, FROM, ORDER BY đến các biểu thức số học và các hàm tổng hợp, vv

  • Hoàn toàn hướng đối tượng: HQL không sử dụng tên thật của bảng và cột trong cơ sở dữ liệu. Nó sử dụng tên lớp và tên thuộc tính thay thế. HQL có thể hiểu được thừa kế, đa hình và liên kết.

  • Không phân biệt chữ hoa chữ thường cho các từ khóa (keywords): Điều đó có nghĩa là SELECT, select, Select là như nhau.

  • Phân biệt chữ hoa chữ thường cho các lớp và thuộc tính của Java: HQL xem xét các trường hợp nhạy cảm cho các lớp Java và các thuộc tính của chúng, nghĩa là Person và person là hai đối tượng khác nhau.

Trong bài này, mình sẽ Hướng dẫn Hibernate Query Language (HQL) qua 14 ví dụ để thực hiện các truy vấn cơ bản (CRUD) cũng như các ứng dụng phổ biến khác. Lược đồ sau minh hoạ mối quan hệ của các bảng được sử dụng trong các ví dụ của hướng dẫn này:


Hướng dẫn Hibernate Query Language


Và đây là các lớp model đã map với JPA annotations:


Category class:


package net.codejava.hibernate;

import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;


@Entity
@Table(name = "CATEGORY")
public class Category

private long id;
private String name;

private Set<Product> products;

public Category()


public Category(String name)
this.name = name;


@Id
@Column(name = "CATEGORY_ID")
@GeneratedValue
public long getId()
return id;



@OneToMany(mappedBy = "category", cascade = CascadeType.ALL)
public Set<Product> getProducts()
return products;


// other getters and setters

Product class:


package net.codejava.hibernate;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

@Entity
@Table(name = "PRODUCT")
public class Product
private long id;
private String name;
private String description;
private float price;

private Category category;

public Product()


public Product(String name, String description, float price,
Category category)
this.name = name;
this.description = description;
this.price = price;
this.category = category;


@Id
@Column(name = "PRODUCT_ID")
@GeneratedValue
public long getId()
return id;


@ManyToOne
@JoinColumn(name = "CATEGORY_ID")
public Category getCategory()
return category;


// other getters and setters

Order class:


package net.codejava.hibernate;

import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@Entity
@Table(name = "ORDERS")
public class Order
private int id;
private String customerName;
private Date purchaseDate;
private float amount;
private Product product;

@Id
@Column(name = "ORDER_ID")
@GeneratedValue
public int getId()
return id;


public void setId(int id)
this.id = id;


@Column(name = "CUSTOMER_NAME")
public String getCustomerName()
return customerName;


@Column(name = "PURCHASE_DATE")
@Temporal(TemporalType.DATE)
public Date getPurchaseDate()
return purchaseDate;



@ManyToOne
@JoinColumn(name = "PRODUCT_ID")
public Product getProduct()
return product;


// other getters and setters

Hibernate Query Language (HQL) Example


Các ví dụ sắp tới được cung cấp dựa trên giả định rằng SessionFactory Hibernate được mở ra và một giao dịch(Transaction) đã được bắt đầu. Bạn có thể tìm hiểu thêm về cách lấy SessionFactory và bắt đầu một giao dịch trong hướng dẫn: Xây dựng Hibernate SessionFactory từ Service Registry. (updating)


1. Cách thực thi(execute) HQL trong Hibernate


Thực thi câu lệnh hql qua các bước dưới đây:


  • Viết câu lệnh HQL:
    String hql = "Your Query Goes Here";


  • Tạo câu truy vấn Query từ phiên làm việc Session:
    Query query = session.createQuery(hql);


  • Thực thi query có 2 dạng: là bạn muốn thực thi dạng xem danh sách listing hay thực thi dạng cập nhật:
    • Listing query (SELECT):
      List listResult = query.list();


    • Update query (INSERT, UPDATE, DELETE):
      int rowsAffected = query.executeUpdate();



  • Kết quả trả về từ câu truy vấn: phụ thuộc vào dạng truy vấn mà Hibernate trả về các kiểu kết quả khác nhau. Ví dụ:
    • Select query một đối tượng sẽ trả về một danh sách các đối tượng đó.

    • Join query trả về danh sách mảng Objects mà các bảng được kết với nhau(xem mỗi bảng là 1 object). Điều này cũng áp dụng cho các truy vấn sử dụng các hàm tổng hợp (count, sum, avg, etc).


Bây giờ chúng ta cùng vào các ví dụ chi tiết của Hướng dẫn Hibernate Query Language (HQL) qua ví dụ !


2. Ví dụ List Query


Đoạn mã sau đây thực thi một truy vấn mà kết quả trả về là danh sách Category:


String hql = "from Category";
Query query = session.createQuery(hql);
List<Category> listCategories = query.list();

for (Category aCategory : listCategories)
System.out.println(aCategory.getName());


Lưu ý rằng trong Hibernate Query Language(HQL), chúng ta có thể bỏ qua từ khoá SELECT và chỉ sử dụng FROM thay thế.


3. Ví dụ Search Query


Các câu lệnh thực hiện truy vấn tìm kiếm tất cả các sản phẩm trong một danh mục có tên là ‘Computer’:


String hql = "from Product where category.name = 'Computer'";
Query query = session.createQuery(hql);
List<Product> listProducts = query.list();

for (Product aProduct : listProducts)
System.out.println(aProduct.getName());

Điều thú vị ở đây là Hibernate tự động tạo truy vấn JOIN giữa bảng Product và Category một cách lặng im. Như lúc đầu mình đã nói HQL hoàn toàn hướng đối tượng và nó thể hiện rõ ở đây.  Vì vậy, chúng ta không phải sử dụng từ khóa JOIN ở câu này:


String hql = "from Product where category.name = 'Computer'";

4. Dùng tham số cho câu truy vấn (Named Parameters)


Bạn có thể dùng tham số cho câu truy vấn bằng cách sử dụng dấu hai chấm trước tên tham số, ví dụ :id cho biết một trình giữ chỗ cho một tham số có tên id. Ví dụ sau minh họa cách viết và thực hiện một truy vấn bằng cách sử dụng các tham số được đặt tên:


String hql = "from Product where description like :keyword";

String keyword = "New";
Query query = session.createQuery(hql);
query.setParameter("keyword", "%" + keyword + "%");

List<Product> listProducts = query.list();

for (Product aProduct : listProducts)
System.out.println(aProduct.getName());

Các câu lệnh Hibernate Query Language(HQL) ở trên cho kết quả là  tất cả các sản phẩm có mô tả chứa từ khoá được chỉ định(dòng 1). Sau đó sử dụng phương thức setParameter (name, value) để thiết lập giá trị thực cho tham số được đặt tên.(dòng 5)


Lưu ý rằng chúng ta muốn thực hiện một tìm kiếm LIKE để các dấu phần trăm phải được sử dụng bên ngoài chuỗi truy vấn, không giống như SQL truyền thống.


5. Ví dụ Insert – Select Query


HQL không hỗ trợ câu lệnh INSERT thông thường (bạn biết tại sao – vì phương thức session.save (Object) thực hiện nó rất tốt rồi). Vì vậy, chúng ta chỉ có thể viết INSERT … SELECT truy vấn trong HQL. Đoạn mã sau thực hiện truy vấn chèn tất cả các dòng dữ liệu từ bảng Category vào bảng OldCategory:


String hql = "insert into Category (id, name)"
+ " select id, name from OldCategory";

Query query = session.createQuery(hql);

int rowsAffected = query.executeUpdate();
if (rowsAffected > 0)
System.out.println(rowsAffected + "(s) were inserted");

Lưu ý rằng HQL là hướng đối tượng, vì vậy Category và OldCategory phải được ánh xạ các tên lớp (không phải tên bảng thật).


6. Ví dụ Update Query


Truy vấn UPDATE tương tự như SQL. Ví dụ sau chạy truy vấn cập nhật giá cho một sản phẩm cụ thể:


String hql = "update Product set price = :price where id = :id";

Query query = session.createQuery(hql);
query.setParameter("price", 488.0f);
query.setParameter("id", 43l);

int rowsAffected = query.executeUpdate();
if (rowsAffected > 0)
System.out.println("Updated " + rowsAffected + " rows.");

7. Ví dụ Delete Query


Sử dụng truy vấn DELETE trong HQL cũng dễ hiểu. Ví dụ:


String hql = "delete from OldCategory where id = :catId";

Query query = session.createQuery(hql);
query.setParameter("catId", new Long(1));

int rowsAffected = query.executeUpdate();
if (rowsAffected > 0)
System.out.println("Deleted " + rowsAffected + " rows.");

8. Ví dụ Join Query


HQL hỗ trợ các loại kết bảng Join (như SQL):


  • inner join (can be abbreviated as join).

  • left outer join (can be abbreviated as left join).

  • right outer join (can be abbreviated as right join).

  • full join

Ví dụ, đoạn lệnh dưới đây sẽ truy vấn mà kết quả trả về là Join giữa 2 bảng Product và Category:


String hql = "from Product p inner join p.category";

Query query = session.createQuery(hql);
List<Object[]> listResult = query.list();

for (Object[] aRow : listResult)

    Product product = (Product) aRow[0];
    Category category = (Category) aRow[1];

    System.out.println(product.getName() + " - " + category.getName());

Dùng Join trên HQL là không tường minh. Chú ý rằng câu lệnh Join sẽ trả về 1 danh sách mảng Object, vì thế chúng ta cần xử lý kết quả trả về này:


List<Object[]> listResult = query.list();

HQL cung cấp từ khóa mà bạn có thể sử dụng trong trường hợp bạn muốn Join có điều kiện. Ví dụ:


from Product p inner join p.category with p.price > 500

Câu lệnh phía trên Join giữa Product và Category với nhau qua điều kiện là price của Produce > 500


Nếu bạn khó hiểu câu lệnh phía trên, chúng ta có thể viết từng minh như thế này cũng được:


from Product where category.name = 'Computer'

9. Ví dụ Sort Query


Sắp xếp trong HQL tương tự như SQL dùng lệnh ORDER BY theo đó là cột nào cần sắp xếp và sắp xếp theo hướng ASC(tăng dần) hay DESC(giảm dần). Ví dụ:


String hql = "from Product order by price ASC";

Query query = session.createQuery(hql);
List<Product> listProducts = query.list();

for (Product aProduct : listProducts)

    System.out.println(aProduct.getName() + "\t - " + aProduct.getPrice());


Kết quả là lấy danh sách tất cả các sản phẩm sắp xếp tăng dần theo giá.


10. Ví dụ Group By Query


Dùng GROUP BY trong HQL tương tự SQL. Câu truy vấn dưới đây gom nhóm giá của tất cả sản phẩm cho mỗi thể loại:


select sum(p.price), p.category.name from Product p group by category

Đây là toàn bộ code:


String hql = "select sum(p.price), p.category.name from Product p group by category";

Query query = session.createQuery(hql);
List<Object[]> listResult = query.list();

for (Object[] aRow : listResult)

    Double sum = (Double) aRow[0];
    String category = (String) aRow[1];
    System.out.println(category + " - " + sum);


11. Ví dụ Pagination Query


Truy vấn phân trang Trả về một tập hợp giới hạn các kết quả, giao diện truy vấn có 2 phương thức cho giới hạn tập kết quả:


  • setFirstResult(int firstResult): thiết lập dòng đầu tiên nhận được từ kết quả truy vấn.

  • setMaxResults(int maxResults): thiết lập số lượng dòng nhận được từ kết quả truy vấn.

Ví dụ, đoạn lệnh dưới đây lấy 10 sản phẩm đầu tiên từ kết quả truy vấn:


String hql = "from Product";

Query query = session.createQuery(hql);
query.setFirstResult(0);
query.setMaxResults(10);

List<Product> listProducts = query.list();

for (Product aProduct : listProducts)

    System.out.println(aProduct.getName() + "\t - " + aProduct.getPrice());


12. Ví dụ Date Range Query


Một tính năng hay của Hibernate đó là nó có thể kiểm soát tham số để tạo ra kết quả SQL cho phù hợp. Nên việc dùng tham số date time trong HQL cực dễ dàng, ví dụ:


String hql = "from Order where purchaseDate >= :beginDate and purchaseDate <= :endDate";

Query query = session.createQuery(hql);

SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd");
Date beginDate = dateFormatter.parse("2014-11-01");

query.setParameter("beginDate", beginDate);

Date endDate = dateFormatter.parse("2014-11-22");

query.setParameter("endDate", endDate);

List<Order> listOrders = query.list();

for (Order anOrder : listOrders)
    System.out.println(anOrder.getProduct().getName() + " - "
            +  anOrder.getAmount() + " - "
            + anOrder.getPurchaseDate());


Đoạn truy vấn trên cho kết quả các order nào có ngày mua nằm trong phạm vi ngày tháng năm.


13. Dùng Expressions trong Query


Các expressions dùng trong mệnh đề WHERE, HQL hỗ trợ tất cả các toán tử toán học tương tự như SQL bao gồm:


  • mathematical operators: +, -, *, /

  • binary comparison operators: =, >=, <=, <>, !=, like

  • logical operators: and, or, not

  • etc

Xem đầy đủ hơn tại trang chủ của Hibernate, click here.


Ví dụ, câu truy vấn dưới đây trả về các sản phẩm có giá trong phạm vi 500$ tới 1000$


from Product where price >= 500 and price <= 1000

14. Dùng Aggregate Functions trong Query


HQL hỗ trợ các hàm aggregate sau:


  • avg(…)sum(…)min(…)max(…)

  • count(*)

  • count(…)count(distinct…)count(all…)

Ví dụ, câu truy vấn dưới đây đếm tất cả các sản phẩm:


select count(name) from Product

Và dưới đây là toàn bộ code bao gồm cách lấy kết quả:


String hql = "select count(name) from Product";
Query query = session.createQuery(hql);
List listResult = query.list();
Number number = (Number) listResult.get(0);
System.out.println(number.intValue());

XONG! Qua bài Hướng dẫn Hibernate Query Language (HQL) qua ví dụ, bạn đã biết được các kiến thức cơ bản của Hibernate Query Language (HQL). Giờ đây bạn có thể truy vấn HQL dễ dàng hơn bao giờ hết!


Hibernate Query Language (HQL) Example



Link Source: Hướng dẫn Hibernate Query Language (HQL) qua Ví Dụ
Xem Tiếp