Xu Hướng 9/2023 # Database Migration Sử Dụng Liquibase # Top 9 Xem Nhiều | Bgxq.edu.vn

Xu Hướng 9/2023 # Database Migration Sử Dụng Liquibase # Top 9 Xem Nhiều

Bạn đang xem bài viết Database Migration Sử Dụng Liquibase được cập nhật mới nhất tháng 9 năm 2023 trên website Bgxq.edu.vn. Hy vọng những thông tin mà chúng tôi đã chia sẻ là hữu ích với bạn. Nếu nội dung hay, ý nghĩa bạn hãy chia sẻ với bạn bè của mình và luôn theo dõi, ủng hộ chúng tôi để cập nhật những thông tin mới nhất.

Bài viết được sự cho phép của tác giả Nguyễn Hữu Khanh

Mình sẽ sử dụng Java 11 cho project này:

Để làm việc với Liquibase, các bạn cần khai báo dependency của nó:

Mình cũng sẽ sử dụng PostgreSQL database để làm ví dụ cho bài viết này:

Khi làm việc với Liquibase, các bạn cần nắm 3 khái niệm cơ bản của nó là changelog, changeset và changetype.

Một changelog có thể sẽ chứa nhiều changeset và một changeset có thể chứa nhiều changetype. Nói nôm na cho các bạn hiểu thì changelog là một tập tin này định nghĩa tất cả các version của database structure theo cách của Liquibase để nó có thể execute việc thay đổi database theo version cho chúng ta được. Các bạn có thể định nghĩa tập tin changelog này theo nhiều định dạng khác nhau bao gồm SQL, XML, JSON, YAML, …

Nếu các bạn định nghĩa bằng XML thì nội dung của tập tin changelog sẽ có nội dung cơ bản như sau:

Mỗi changeset sẽ hỗ trợ cho các bạn rất nhiều changetype. Nói nôm na changetype là đại diện cho các câu lệnh SQL để các bạn thực hiện việc thêm, mới, xoá, sửa database structure. Cho changeLog với XML format, các bạn có thể thấy các changetype như sau:

Ví dụ bây giờ mình cần tạo mới table name student với thông tin về tên và tuổi của sinh viên thì mình sẽ định nghĩa changeset với changetype như sau:

Mình sẽ lưu nội dung changelog ở trên vào tập tin chúng tôi trong thư mục src/main/resources của project:

Mình sẽ tạo mới main class để làm ví dụ:

package com.huongdanjava.liquibase; public class Application { public static void main(String[] args) { } }

Để làm việc với Liquibase, các bạn cần sử dụng đối tượng của class Liquibase. Chúng ta sẽ cần truyền cho đối tượng này connection tới database và đường dẫn tới tập tin cấu hình của changelog. Có 3 constructor trong class Liquibase cho phép chúng ta truyền các thông tin này.

Mình sử dụng một trong 3 constructor này như sau:

package com.huongdanjava.liquibase; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import liquibase.Liquibase; import liquibase.database.Database; import liquibase.database.DatabaseFactory; import liquibase.database.jvm.JdbcConnection; import liquibase.exception.LiquibaseException; import liquibase.resource.ClassLoaderResourceAccessor; public class Application { public static void main(String[] args) throws SQLException, LiquibaseException { Connection c = DriverManager.getConnection("jdbc:postgresql://localhost:5432/liquibase_example", "postgres", "123456"); Database database = DatabaseFactory.getInstance() .findCorrectDatabaseImplementation(new JdbcConnection(c)); Liquibase liquibase = new Liquibase("classpath:db-changelog.xml", new ClassLoaderResourceAccessor(), database); } }

Tham số thứ 2 trong constructor của Liquibase trong ví dụ trên chỉ định cách mà Liquibase sẽ đọc tập tin cấu hình changelog. Nó implement interface ResourceAccessor của Liquibase đó các bạn!

Sau khi đã có đối tượng Liquibase thì các bạn có thể gọi method update() với một tham số mang ý nghĩa Context mà chúng ta đang chạy database migration. Các bạn có thể để empty hoặc null cũng được nếu muốn. Mình sẽ để empty:

package com.huongdanjava.liquibase; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import liquibase.Liquibase; import liquibase.database.Database; import liquibase.database.DatabaseFactory; import liquibase.database.jvm.JdbcConnection; import liquibase.exception.LiquibaseException; import liquibase.resource.ClassLoaderResourceAccessor; public class Application { public static void main(String[] args) throws SQLException, LiquibaseException { Connection c = DriverManager.getConnection("jdbc:postgresql://localhost:5432/liquibase_example", "postgres", "123456"); Database database = DatabaseFactory.getInstance() .findCorrectDatabaseImplementation(new JdbcConnection(c)); Liquibase liquibase = new Liquibase("classpath:db-changelog.xml", new ClassLoaderResourceAccessor(), database); liquibase.update(""); } }

OK, giờ thì chạy ứng dụng thôi các bạn.

Để kiểm tra kết quả, các bạn hãy vào database của mình. Các bạn sẽ thấy Liquibase tạo ra 3 bảng trong ví dụ trên của mình:

Ngoài bảng student với cấu trúc database mà chúng ta đã định nghĩa trong changeset:

như các bạn thấy, chúng ta còn có thêm 2 bảng là databasechangelog và databasechangeloglock.

Mục đích của bảng databasechangelog là keep track lại tất cả các changeset mà Liquibase đã chạy. Nếu các bạn query table này, các bạn sẽ thấy kết quả như sau:

Bây giờ, nếu mình thêm một changeset mới để thêm column address trong bảng student:

<databaseChangeLog

thì các bạn sẽ thấy kết quả như sau:

Hướng Dẫn Sử Dụng Cpu

CPU-Z là gì?

CPU-Z là một phần mềm được cài đặt miễn phí trên hệ điều hành Windows được sáng lập bởi CPUID. Phần mềm CPU-Z dùng để cung cấp thông tin trên máy tính, laptop bao gồm thông số CPU, bộ nhớ đệm (Cache), bo mạch chủ, card đồ họa và bộ nhớ,…

Bên cạnh đó, phần mềm CPU-Z còn có khả năng chấm benchmark giúp người sử dụng máy có thể kiểm tra được hiệu suất của thiết bị. Đặc biệt, cho phép người dùng tải các bài báo lên CPU-Z, có thể so sánh hiệu suất máy tính của mình với các máy tính khác.

CPU-Z là một phần mềm được cài đặt miễn phí trên hệ điều hành Windows

Cách cài đặt CPU-Z về máy tính

Bước 1: Đầu tiên, bạn hãy truy cập vào trang Web CPUID để tải phần mềm CPU-Z vào máy tính.

Bước 2: Kéo chuột xuống thì ta thấy có 2 phiên bản như cột Classic và Custom. Bạn có thể chọn bất cứ phiên bản nào. Chẳng hạn như hình bên dưới chọn thiết lập phiên bản Classic, chọn SETUP.

Bước 3: Nhấn vào nút Download để tải phần mềm vào máy.

Bước 7: Nhấn vào Install để thực hiện cài đặt.

Bước 8: Nhấn Finish để hoàn thành quá trình cài đặt.

Hướng dẫn sử dụng CPU-Z Thẻ CPU

Ngay khi vào phần mềm CPU-Z, bạn sẽ thấy thẻ CPU máy tính. Trong thẻ bạn có thể xem được bộ vi xử lý (name), thế hệ CPU (codename), chân cắm socket (package).

Thẻ CPU có thể xem được bộ vi xử lý (name), thế hệ CPU (codename), chân cắm socket (package)

Thẻ Caches

Thẻ Caches cho phép bạn kiểm tra bộ nhớ Cache của hệ thống về dung lượng và cấp độ, thuộc tính.

L1D- Cache, L1 I-Cache, L2 Cache, L3 Cache: băng thông L1, L2, L3 của CPU, trong đó bộ nhớ Cache L2, L3 càng lớn thì CPU hoạt động càng nhanh. Phần thẻ Caches dường như không có nhiều thông tin để xem, gần như đã hiển thị hết ở Thẻ CPU.

Thẻ Caches cho phép bạn kiểm tra bộ nhớ Cache của hệ thống về dung lượng

Thẻ Mainboard

Thẻ Mainboard cung cấp một số thông tin cơ bản của máy tính như:

Manufacturer: Là tên nhà sản xuất ra mainboard, ví dụ: Gigabyte, ASUS, Foxconn, HP…

Model: là tên loại mainboard, ví dụ: G41MDV, 82F2… thông tin này khá quan trọng trong quá trình tìm kiếm driver mà không phải mở máy để xem trực tiếp.

Chipset: Thông tin về chipset trên main, ví dụ: 945, G31, H61…

BIOS: Hiển thị các thông tin về hãng sản xuất, phiên bản và ngày ra phiên bản hiện tại đang dùng của BIOS.

Graphic Interface: Là thông tin về khe cắm card đồ họa trên mainboard, phổ biến nhất hiện nay chỉ có 2 chuẩn là AGP và PCI-Express.

Thẻ Mainboard cung cấp một số thông tin cơ bản của máy tính

Thẻ Memory

Thẻ Memory có thể xem thông tin về bộ nhớ RAM. Một số thông tin được cung cấp trong thẻ Memory như:

Type: Loại RAM hay đời RAM máy đang sử dụng, ví dụ: DDR, DDR2, DDR3…

Size: Tổng dung lượng RAM đang sử dụng trên máy tính của bạn.

Channel: Số lượng RAM cắm trên máy có thể là Single (một RAM) hoặc Dual (2 RAM) hoặc Triple (3 RAM).

DRAM Frequency: Là tốc độ chuẩn của RAM, các loại RAM DDR, DDR2, DDR3, DDR4 thì lấy thông số DRAM Frequency nhân 2, kết quả ra tốc độ Bus của RAM.

Thẻ Memory có thể xem thông tin về bộ nhớ RAM

Thẻ SPD

Thẻ SPD cung cấp thông tin về số lượng khe cắm RAM và thông số của RAM. Thẻ cung cấp một số thông tin như:

Module Size: Dung lượng RAM ở khe cắm đang xem. Đơn vị là MB (1GB = 1024MB).

Max Bandwidth: Tốc độ băng thông tối đa, đây thực tế là thông số về bus RAM. Bạn chỉ cần đem nhân phần xung nhịp nằm trong dấu ngoặc đơn cho 2, sẽ ra Bus của RAM hiện tại.

Manufacturer: Tên hãng sản xuất RAM.

Thẻ SPD cung cấp thông tin về số lượng khe cắm RAM và thông số của RAM

Thẻ Graphics

Thẻ Graphics cung cấp thông tin về card đồ họa của laptop như:

Display Device Selection: Nếu có nhiều card màn hình, phần này sẽ sáng lên và bạn chọn card tương ứng. Nếu chỉ có 1 card, phần này sẽ mờ đi.

Advertisement

Name: Tên của hãng sản xuất chip đồ họa.

Size: Dung lượng của card đồ họa (đơn vị MB).

Type: Kiểu xử lý, thông số này càng cao thì card màn hình của bạn càng cao cấp và xử lý đồ họa tốt hơn.

Thẻ Graphics cung cấp thông tin về card đồ họa của laptop

Thẻ About

Thẻ About không quan trọng lắm chỉ để hiển thị thông tin về số hiệu phiên bản đang dùng của phần mềm, đôi khi bạn nên tải về bản mới nhất để có thể kiểm tra chính xác hơn.

Ngoài ra ở phần Tools sẽ cho phép bạn xuất toàn bộ cấu hình ra file text (TXT) hoặc file dạng webpage (HTML).

Thẻ About không quan trọng lắm chỉ để hiển thị thông tin về số hiệu phiên bản đang dùng của phần mềm

Thẻ Bench

Thẻ Bench là một trong những thẻ được sử dụng nhiều nhất. Bạn có thể xem thẻ điểm benchmark CPU của mình bằng cách nhấn vào Bench CPU. Đặc biệt, để so sánh với các dòng máy tính khác, ngay tại hộp Reference chọn hộp CPU bạn muốn.

Ngay tại hộp Reference chọn hộp CPU bạn muốn

Tiếp đó, bạn hãy tích vào ô Reference màu đen sẽ quy đổi thành màu đen để bạn dễ dàng so sánh.

Hãy tích vào ô Reference màu đen sẽ quy đổi thành màu đen để bạn dễ dàng so sánh

Oppo Share, Mi Share Là Gì? Cách Sử Dụng Và Thiết Bị Nào Sử Dụng Được?

OPPO Share, Mi Share là những tính năng chia sẻ tệp không dây mới giữa các thiết bị trong cùng hệ điều hành, tính năng này tương tự như Airdrop trên iOS.

OPPO Share

OPPO Share là một tính năng chia sẻ được nâng cấp trên các dòng điện thoại OPPO chạy Color OS 5.2. Người dùng được hỗ trợ chia sẻ các tệp và ứng dụng trong cùng hệ thống mà không cần phải thông qua Internet, Bluetooth hoặc sử dụng USB dây cáp.

Mi Share

Mi Share là một phần của bộ ứng dụng văn phòng Xiaomi Mi Work được cung cấp trên các điện thoại Xiaomi chạy hệ điều hành MIUI 11.

Giống như AirDrop trên iPhone, Mi Share cung cấp cho người dùng trải nghiệm truyền tệp nhanh chóng và tiện lợi giữa nhiều thiết bị.

Việc chia sẻ các tệp, hình ảnh và ứng dụng có thể dễ dàng thực hiện với các thiết bị khác mà máy bạn không cần phải cài đặt ứng dụng hỗ trợ của bên thứ ba hay dùng thêm dây cáp USB.

So với Bluetooth hoặc bất kỳ ứng dụng bên thứ ba nào khác, Mi Share cung cấp tốc độ truyền tệp cao hơn. Và tốc độ truyền tối đa của nó có thể đạt 82MB/s. Mi Share không có giới hạn về số lượng tệp, kích thước tệp hoặc loại tệp chia sẻ, do đó nó rất thuận tiện để sử dụng.

Ngoài chức năng Mi Share trên điện thoại Xiaomi cũng hỗ trợ một số thiết bị của các thương hiệu khác như OPPO, Realme và Vivo.

Các thiết bị dùng được

OPPO Share là tính năng được hỗ trợ trên các dòng điện thoại của OPPO chạy hệ điều hành Color OS 5.2 trở về sau.

Mi Share cũng chỉ hỗ trợ điện thoại Xiaomi với hệ điều hành MIUI 11 dựa trên Android 9.0 Pie hoặc các phiên bản mới hơn.

Để kiểm tra xem điện thoại Xiaomi của bạn có hỗ trợ tính năng chia sẻ OPPO Share, Mi Share hay không, trước tiên bạn nên đảm bảo điện thoại của bạn đã được cập nhật lên hệ điều hành này.

Giữa các thiết bị OPPO với nhau

Bước 1: Mở trung tâm điều khiển của các mấy nhận và chia sẻ dữ liệu bằng cách vuốt màn hình từ trên xuống, bật tính năng OPPO Share. Chọn tập tin bạn muốn chia sẻ và nhấp vào Send. Bạn sẽ thấy danh sách các điện thoại của Oppo gần đó và chọn một điện thoại mà bạn muốn chia sẻ các tập tin.

Bước 2: Trên điện thoại nhận tệp chia sẻ, nhấn Recieve.

Giữa các điện thoại Xiaomi với nhau và điện thoại Xiaomi với OPPO

Bước 1: Vui lòng đảm bảo chức năng wifi hoặc Bluetooth được bật trên cả điện thoại Xiaomi và thiết bị của người nhận khác.

Bước 2: Chuyển đến “Settings” trên điện thoại của bạn.

Bước 3: Nhấp vào “Connection & sharing“.

Bước 4: Nhấn “Mi Share“.

Bước 5: Chuyển đổi bật Mi Share để bật và cấp quyền lưu trữ và quyền truy cập cho nó. Sau đó, chức năng Mi Share sẽ tự động bật khi Bluetooth Bluetooth hoặc wifi được bật trên điện thoại của bạn.

Advertisement

Bước 6: Khi tính năng Mi Share được bật, bạn có thể chọn một tệp trong trình quản lý tệp Mi hoặc ảnh trong thư viện hoặc ứng dụng bạn muốn chia sẻ, sau đó nhấn vào “Send“.

Bước 7: Sau đó, Mi Share sẽ tìm kiếm và hiển thị các thiết bị có sẵn gần đó (bao gồm cả điện thoại Xiaomi và cả OPPO). Chọn tên thiết bị bạn muốn gửi tập tin.

Bước 8: Sau một thời gian ngắn, thiết bị của người nhận sẽ nhận được thông báo nhắc nhở về việc chấp nhận yêu cầu. Chỉ cần nhấn vào “Accept” để nhận các tập tin.

Sử Dụng Fanout Exchange Trong Rabbitmq

Bài viết được sự cho phép của tác giả Giang Phan

Trong các bài viết trước, chúng ta đã cùng tìm hiểu về Direct Exchange. Trong bài này, tôi sẽ giới thiệu với các bạn một loại exchange khác là Fanout Exchange.

Flow của một Message trong Fanout Exchange

Fanout exchange (định tuyến broadcast – amq.fanout) định tuyến message (copy message) tới tất cả queue mà nó được bind, với bất kể một routing key nào. Giả sử, nếu nó N queue được bind bởi một Fanout exchange, khi một message mới published, exchange sẽ định tuyến message đó tới tất cả N queues. Fanout exchange được sử dụng cho định tuyến message broadcast (quảng bá).

Flow của một Message trong Fanout Exchange như sau:

Một Producer sẽ tạo một Message và publish tới Exchange.

Một hoặc nhiều Queue bind tới Fanout Exchange không cần thông tin routing key.

Một Message tới Exchange sẽ được chuyển tiếp đến tất cả các Queue mà không có bất kỳ điều kiện kiểm tra nào.

Exchange Fanout hữu ích với trường hợp ta cần một dữ liệu được gửi tới nhiều ứng dụng khác nhau với cùng một message nhưng cách xử lý ở mỗi ứng dụng là khác nhau.

Ví dụ Fanout Exchange trong RabbitMQ

Trong ví dụ này, tôi tạo một Fanout Exchange có tên GPCoderFanoutExchange, tạo 3 Queue binding tới Fanout Exchange này: QDeveloper, QManager, QGeneral.

Một số class của chương trình:

ConnectionManager : hỗ trợ tạo Connection đến RabbitMQ.

FanoutExchangeChannel :  class util hỗ trợ tạo Echange, Queue, binding Queue đến Exchange, publish/ subscribe message, …

Constant : định nghĩa constant chứa các thông tin về tên Exchange, Queue.

Producer: để gửi Message đến Exchange.

Consumer: để nhận Message từ Queue.

App: giả lập việc gửi nhận Message thông qua Fanout Exchange của RabbitMQ.

ConnectionManager.java

package com.gpcoder.fanoutexchange; import com.rabbitmq.client.Connection; import com.rabbitmq.client.ConnectionFactory; import java.io.IOException; import java.util.concurrent.TimeoutException; public class ConnectionManager { private ConnectionManager() { super(); } public static Connection createConnection() throws IOException, TimeoutException { ConnectionFactory factory = new ConnectionFactory(); factory.setHost("localhost"); return factory.newConnection(); } }

FanoutExchangeChannel.java

package com.gpcoder.fanoutexchange; import com.rabbitmq.client.BuiltinExchangeType; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; import java.io.IOException; import java.util.concurrent.TimeoutException; public class FanoutExchangeChannel { private String exchangeName; private Channel channel; private Connection connection; public FanoutExchangeChannel(Connection connection, String exchangeName) throws IOException { this.exchangeName = exchangeName; this.connection = connection; this.channel = connection.createChannel(); } public void declareExchange() throws IOException { channel.exchangeDeclare(exchangeName, BuiltinExchangeType.FANOUT, true); } public void declareQueues(String ...queueNames) throws IOException { for (String queueName : queueNames) { channel.queueDeclare(queueName, true, false, false, null); } } public void performQueueBinding(String queueName) throws IOException { channel.queueBind(queueName, exchangeName, ""); } public void subscribeMessage(String queueName) throws IOException { System.out.println("[Received] [" + queueName + "]: " + new String(message.getBody())); System.out.println(consumerTag); }); } public void publishMessage(String message) throws IOException { System.out.println("[Send]: " + message); channel.basicPublish(exchangeName, "", null, message.getBytes()); } }

Constant.java

package com.gpcoder.fanoutexchange; public final class Constant { public static final String EXCHANGE_NAME = "GPCoderFanoutExchange"; public static final String DEV_QUEUE_NAME = "QDeveloper"; public static final String MANAGER_QUEUE_NAME = "QManager"; public static final String GENERAL_QUEUE_NAME = "QGeneral"; private Constant() { super(); } }

Producer.java

package com.gpcoder.fanoutexchange; import com.rabbitmq.client.Connection; import java.io.IOException; import java.util.concurrent.TimeoutException; import static com.gpcoder.fanoutexchange.Constant.*; public class Producer { private FanoutExchangeChannel channel; public void start() throws IOException, TimeoutException { Connection connection = ConnectionManager.createConnection(); channel = new FanoutExchangeChannel(connection, EXCHANGE_NAME); channel.declareExchange(); channel.declareQueues(DEV_QUEUE_NAME, MANAGER_QUEUE_NAME, GENERAL_QUEUE_NAME); channel.performQueueBinding(DEV_QUEUE_NAME); channel.performQueueBinding(MANAGER_QUEUE_NAME); channel.performQueueBinding(GENERAL_QUEUE_NAME); } public void send(String message) throws IOException { channel.publishMessage(message); } }

Consumer.java

package com.gpcoder.fanoutexchange; import com.rabbitmq.client.Connection; import java.io.IOException; import java.util.concurrent.TimeoutException; import static com.gpcoder.fanoutexchange.Constant.*; public class Consumer { private FanoutExchangeChannel channel; public void start() throws IOException, TimeoutException { Connection connection = ConnectionManager.createConnection(); channel = new FanoutExchangeChannel(connection, EXCHANGE_NAME); channel.declareExchange(); channel.declareQueues(DEV_QUEUE_NAME, MANAGER_QUEUE_NAME, GENERAL_QUEUE_NAME); channel.performQueueBinding(DEV_QUEUE_NAME); channel.performQueueBinding(MANAGER_QUEUE_NAME); channel.performQueueBinding(GENERAL_QUEUE_NAME); } public void subscribe() throws IOException { channel.subscribeMessage(DEV_QUEUE_NAME); channel.subscribeMessage(MANAGER_QUEUE_NAME); channel.subscribeMessage(GENERAL_QUEUE_NAME); } }

App.java

package com.gpcoder.fanoutexchange; import java.io.IOException; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; public class App { public static void main(String[] args) throws IOException, TimeoutException, InterruptedException { Producer producer = new Producer(); producer.start(); producer.send("gpcoder message 1"); Consumer consumer = new Consumer(); consumer.start(); consumer.subscribe(); TimeUnit.SECONDS.sleep(1); producer.send("gpcoder message 2"); } }

Output chương trình:

[Send]: gpcoder message 1 [Received] [QDeveloper]: gpcoder message 1 [Received] [QManager]: gpcoder message 1 [Received] [QGeneral]: gpcoder message 1 [Send]: gpcoder message 2 [Received] [QGeneral]: gpcoder message 2 [Received] [QDeveloper]: gpcoder message 2 [Received] [QManager]: gpcoder message 2

Như bạn thấy, tất cả các Consumer đều nhận được Message.

Lưu ý: Chúng ta có thể sử dụng phương thức queueDeclare() để tạo một Queue non-durable, exclusive, autodelete và tên được tạo một cách ngẫu nhiên.

Tạo Ứng Dụng Java Restful Client Không Sử Dụng 3Rd Party Libraries

Bài viết được sự cho phép của tác giả Giang Phan

Trong bài này tôi sẽ giới thiệu với các bạn cách gọi Restful web service sử dụng thư viện chuẩn  chúng tôi của Java, không sử dụng bất kỳ 3rd party libraries nào khác.

Các bước thực hiện

Để gọi restful web service thông qua lớp  chúng tôi  chúng ta lần lượt thực hiện các bước sau:

Tạo 1 chúng tôi object.

Mở HttpURLConnection từ URL trên.

Set các Request property cần thiết.

Gửi Request data lên server (nếu có).

Nhận Response từ server gửi về (nếu có).

Ví dụ tạo ứng dụng Java RESTful Client sử dụng java.net

Trong ví dụ này, chúng ta sẽ gọi lại các Restful API chúng ta đã tạo ở bài viết trước “JWT – Token-based Authentication trong Jersey 2.x“.

Đầu tiên, chúng ta cần gọi API /auth để lấy token và sau đó chúng ta sẽ attach token này vào mỗi request để truy cập resource.

package com.gpcoder; import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; public class HttpClientExample { private static String token; public static void main(String[] args) throws IOException { token = getToken(); System.out.println("token: " + token); createOrder(); retrieveOrder(); updateOrder(); deleteOrder(); } /** */ private static String getToken() throws IOException { URL url = new URL(BASE_URL + "/auth"); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); connection.setRequestProperty("Accept", "application/json"); connection.setRequestMethod("POST"); String urlParameters = "username=gpcoder&password=gpcoder"; sendRequest(connection, urlParameters); return getResponse(connection); } private static void sendRequest(HttpURLConnection connection, String data) throws IOException { connection.setDoOutput(true); try (DataOutputStream wr = new DataOutputStream(connection.getOutputStream())) { wr.writeBytes(data); wr.flush(); } } private static String getResponse(HttpURLConnection connection) throws IOException { int responseCode = connection.getResponseCode(); System.out.println("Response Code : " + responseCode); StringBuilder response = new StringBuilder(); try (InputStream is = connection.getInputStream(); BufferedReader rd = new BufferedReader(new InputStreamReader(is));) { String line; while ((line = rd.readLine()) != null) { response.append(line); } } return response.toString(); } /** */ private static void createOrder() throws IOException { URL url = new URL(BASE_URL + "/orders"); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestProperty("Authorization", "Bearer " + token); connection.setRequestProperty("Content-Type", "application/json"); connection.setRequestMethod("POST"); String data = "{"id" : 1, "name": "gpcoder"}"; sendRequest(connection, data); String response = getResponse(connection); System.out.println("createOrder: " + response); } /** */ private static void retrieveOrder() throws IOException { URL url = new URL(BASE_URL + "/orders/1"); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestProperty("Authorization", "Bearer " + token); connection.setRequestMethod("GET"); String response = getResponse(connection); System.out.println("retrieveOrder: " + response); } /** */ private static void updateOrder() throws IOException { URL url = new URL(BASE_URL + "/orders"); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestProperty("Authorization", "Bearer " + token); connection.setRequestProperty("Content-Type", "application/json"); connection.setRequestMethod("PUT"); String data = "{"id" : 1, "name": "gpcoder"}"; sendRequest(connection, data); String response = getResponse(connection); System.out.println("updateOrder: " + response.toString()); } /** */ private static void deleteOrder() throws IOException { URL url = new URL(BASE_URL + "/orders/1"); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestProperty("Authorization", "Bearer " + token); connection.setRequestMethod("DELETE"); String response = getResponse(connection); System.out.println("deleteOrder: " + response); } }

Chạy chương trình trên, chúng ta có kết quả như sau:

Response Code : 200 token: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJncGNvZGVyIiwicm9sZXMiOlsiQWRtaW4iLCJDdXN0b21lciJdLCJqdGkiOiIwNWQwZTE5ZS1lODYzLTQ5MGQtOGE0Yi1mZWE4NWQ0OTZhYzIiLCJpYXQiOjE1NjE4MTgxMTgsImlzcyI6Imh0dHBzOi8vZ3Bjb2Rlci5jb20iLCJleHAiOjE1NjE4MTk5MTh9.fhhogziLVLMGz_nZjpFy9N0-MG2t4fOYKl6LSU7tLxo Response Code : 200 Response Code : 200 Response Code : 200 Response Code : 200

Lưu ý: toàn bộ các API trả về kết quả là plain/text nên tôi không cần xử lý gì thêm. Nếu API các bạn nhận được là một chuỗi json, các bạn có thể sử dụng các thư viện như Gson hay Jackson để convert json về java object.

Lá Oregano Là Gì? Công Dụng Và Cách Sử Dụng Lá Oregano

 Lá oregano là gì? Nguồn gốc lá oregano

Cây oregano thuộc cùng họ với cây bạc hà, là nhóm cây thân mềm. Cây được phủ một lớp lông nhung mỏng bên ngoài, có chiều cao từ 30-40 cm, có hoa mọc thành từng chùm màu tím nhỏ.

Theo thần thoại Hy Lạp, oregano là cây mà thần Vệ nữ dùng để ban phát cho loài người. Từ “oregano” bắt nguồn từ chữ “Oros” có nghĩa là “núi”, “Ganos” có nghĩa là “niềm vui”. Dịch nôm na là Ngọn núi của những niềm vui.

Về khu vực sinh sống, cây oregano có mặt ở vùng có độ cao 0 – 3.400 m, phân bố chủ yếu ở khu vực đất bỏ hoang, đồi núi, địa hình nhiều nắng, bờ suối sông hoặc trong rừng. Oregano hiện có nhiều ở Ấn Độ, Lào, Campuchia, Malaysia, Myanma, Mông Cổ, Nga, Nhật Bản, Thái Lan, Trung Quốc (ngoại trừ các tỉnh Tân Cương, Thanh Hải) và Việt Nam.

Đặc điểm lá oregano

Oregano thực ra là loại rau thơm rất quen thuộc mà dân gian thường gọi là rau kinh giới cay – cây thảo mộc lâu năm thuộc họ bạc hà. Chúng là loại lá nhỏ, thuôn nhọn, mềm, mịn, bên trên bề mặt phủ một lớp lông tơ.

Đây là loài cây rất dễ trồng, thích hợp với nhiều kiểu khí hậu, chỉ cần là nơi khô ráo và có ánh mặt trời là chúng có thể phát triển tốt, nên hoàn toàn có thể trồng ở Việt Nam.

Vì vậy, bạn cũng có thể tự trồng cây oregano ngay tại nhà, vừa đảm bảo an toàn, lại tiện lợi có thể sử dụng ngay khi cần.

Tham khảo: Cây an xoa và công dụng chữa bệnh gan của cây an xoa

Công dụng của lá oregano Ức chế sự phát triển của vi khuẩn

Một nghiên cứu năm 2013, được công bố trên tạp chí the Science of Food and Agriculture đã kết luận rằng Oregano có thể thay thế cho các hóa chất tổng hợp trong ngành công nghiệp, chứa các đặc tính chống oxy hóa và kháng khuẩn, nó còn có khả năng ức chế sự phát triển của bảy chủng vi khuẩn.

Ngăn ngừa ung thư

Tinh dầu Oregano có thể hỗ trợ chống khối u của tế bào ung thư di căn ở người bởi thành phần carvacrol trong lá Oregano được biết đến với khả năng làm chậm quá trình phát triển của tế bào, điều này được chứng minh qua nghiên cứu của Các nhà nghiên cứu từ đại học Nacional de Cordoba ở Argentina.

Hơn nữa trong tinh dầu còn có chứa phenol, một chất giúp nâng cao khả năng chống oxy hóa mạnh, loại bỏ tế bào chết, tế bào hỏng, các gốc tự do làm tổn thương đến cơ thể. Vì tác dụng mạnh mẽ trong việc ngăn ngừa ung thư nên nền Y học đang kỳ vọng rất lớn vào loại tinh dầu này với mong muốn giúp hàng triệu bệnh nhân đang đối mặt với căn bệnh ung thư quái ác được khỏe mạnh hơn.

Điều trị viêm họng và bệnh cảm cúm

Tinh dầu Oregano có thể kích thích làm lỏng và loại bỏ sự tích tụ nhầy nhụa trong cổ họng, làm dịu phổi khi xuất hiện các cơn ho.Vì vậy nên tinh dầu này được sử dụng để điều trị các cơn ho, viêm họng, viêm xoang, các bệnh về đường hô hấp khá hiệu quả.

Tăng cường sức khỏe đường tiêu hóa

Năm 2011, tạp chỉ Medicinal Food đã công bố một nghiên cứu đánh giá hoạt tính kháng khuẩn của Oregano, giúp chống lại năm loại vi khuẩn gây hại khác nhau, có khả năng tăng cường sức khỏe cho đường tiêu hóa, ngăn ngừa ngộ độ thực phẩm gây chết người.

Ngoài ra, Tinh dầu Oregano khi kết hợp với thức ăn để hấp thụ vào cơ thể có thể loại bỏ một số loại ký sinh trùng trong hệ tiêu hóa của chúng ta như giun đường ruột. Vì thế nhiều người sử dụng Tinh dầu Oregano để giúp đường ruột khỏe mạnh hơn, kích thích ruột tiết ra enzym, chất dinh dưỡng và thúc đẩy hệ tiêu hóa làm việc hiệu quả và năng suất.

Kháng viêm và làm dịu sưng đỏ

Tinh dầu Oregano có thể xem như loại thuốc kháng sinh tự nhiên bởi khả năng kháng viêm, kháng khuẩn tốt, làm xoa dịu các loại viêm, vết sưng đỏ tấy, vùng da bị kích ứng. Loại tinh dầu này có những tác dụng đó vì nó có chứa chất carvacrol và thymol, 2 chất có tác dụng chống oxy hóa để điều trị nhiễm khuẩn, chống lại vi khuẩn.

Sử dụng để bôi ngoài ra cũng có thể xua đuổi côn trùng, chấy, rận, muỗi và bọ chét. Vì vậy bạn có thể sử dụng tinh dầu này để đuổi côn trùng thay vì thuốc xịt côn trùng hóa học gây hại cho sức khỏe.

Điều hòa kinh nguyệt

Đối với chị em phụ nữ mỗi kỳ kinh nguyệt đều vô cùng phiền phức khi nó khiến họ trở nên cáu bẳn, khó chịu thậm chí đau bụng. Tinh dầu Oregano có thể loại bỏ các tác dụng phụ này và giúp kỳ kinh nguyệt của các chị em trở nên dễ chịu, êm ái hơn. Đồng thời nó còn hỗ trợ điều hòa kinh nguyệt, ngăn chặn quá trình mãn kinh sớm.

Trị mụn và làm đẹp da

Ngoài các tác dụng trên, không thể không kể đến khả năng làm đẹp của Tinh dầu Oregano. Nhờ khả năng kháng viêm cũng như chống lão hóa mạnh mẽ nên tinh dầu có thể sử dụng để trị mụn, giúp da giữ được sự tươi trẻ.

Ứng dụng của lá oregano trong đời sống Trong ẩm thực

Lá oregano có hương vị rất đặc trưng nên được ứng dụng vào ẩm thực rất nhiều, đặc trưng nhất là món pizza của nền ẩm thực Ý.

Không chỉ có pizza mà các loại bánh mặn khác và các loại nước sốt cà cũng được thêm lá oregano vào để tạo nên hương thơm nồng đặc trưng.

Thay vì nấu chín, lá oregano cũng có thể ăn sống bằng cách cho vào các món salad để tạo nên một hương vị mà chỉ có loại lá này mới tạo ra được.

Trong lĩnh vực y tế

Như bạn đã biết, oregano là một loại cây thuộc họ bạc hà và được ứng dụng nhiều trong lĩnh vực y tế như:

Tinh dầu oregano có thể dùng để súc miệng khi bị viêm họng. Ngoài ra, còn giúp giảm nhức đầu, trị cảm lạnh và trị mụn cóc.

Lá oregano còn hỗ trợ tốt trong việc điều trị các chứng đầy hơi, ruột kích thích.

Khi điều chế mỹ phẩm, nhiều người có thể tắm với lá oregano để làm sạch các chất khử trùng trong phòng thí nghiệm.

Nhờ có hương thơm đặc trưng, tinh dầu lá oregano được dùng rộng rãi để sản xuất nước hoa hoặc những dung dịch khử mùi.

Đặc biệt, chất Carvacrol trong lá Oregano có tác dụng chống khối u của tế bào ung thư vú di căn ở người.

Lá oregano mua ở đâu?

Lá oregano được bán trên thị trường với 2 loại là lá oregano khô và lá oregano tươi. Ở nước ngoài thì tìm mua lá oregano rất dễ nhưng ở Việt Nam, bạn cần ghé những siêu thị lớn hoặc những cửa hàng chuyên bán gia vị Tây thì mới có, thông thường giá trung bình khoảng 12.000đ/10 gam

Advertisement

Món ngon cùng lá Oregano

Bạn có thể sử dụng lá oregano tươi để trang trí lên bề mặt các loại bánh như creme brulee, panna cotta,…hoặc để tạo vẻ nhấn nhá cho ly cocktail, ly nước ép của mình. Hoặc chế biến thành nhiều món ngon khác nhau với lá oregano.

Bạn cũng có thể trộn salad, các loại thịt chung với oregano tươi, sẽ góp phần làm dậy mùi món ăn, hơn nữa tinh dầu từ lá tiết ra giúp món ăn có vị the độc đáo, hấp dẫn hơn bộn phần.

Còn đối với các món nướng, bạn nên thêm oregano khô vào phần nước ướp thịt để món nướng có vị đậm đà, mùi thơm hấp dẫn và không còn mùi dầu mỡ.

Oregano khô cũng dùng để rắc lên bánh pizza, nước xốt cà chua của mì spaghetti để làm dậy lên mùi thơm nồng ấm, vị the the giúp món ăn tròn vị.

Bên cạnh sử dụng trong nấu nướng, bạn cũng có thể dùng tinh dầu lá oregano để làm sạch không khí, diệt khuẩn.

Bảo quản lá Oregano

Bảo quản lá oregano tươi

Bạn cho lá tươi vào túi nhựa và bảo quản trong ngăn mát tủ lạnh, có thể giữ được khoảng 3 ngày. Nếu muốn để lá oregano lâu hơn, bạn nên tách lá ra khỏi thân, cho vào túi hút chân không và để ngăn đá bảo quản.

Hoặc bạn có thể cắt nhỏ lá oregano, sau đó cho xay nhuyễn một chút nước và cho vào khay đá cấp đông.

Bảo quản lá oregano khô

Bảo quản lá oregano trong túi hoặc lọ thủy tinh đậy kín sẽ giúp giữ được trọn vẹn mùi hương của lá, để nơi khô ráo.

Kết lại, mong rằng bài viết đã cung cấp đủ thông tin về lá oregano với phần công dụng và cả cách sử dụng lá oregano, để bạn có thể chế biến thêm nhiều món ăn ngon với loại gia vị mới lạ, độc đáo này.

Cập nhật thông tin chi tiết về Database Migration Sử Dụng Liquibase trên website Bgxq.edu.vn. Hy vọng nội dung bài viết sẽ đáp ứng được nhu cầu của bạn, chúng tôi sẽ thường xuyên cập nhật mới nội dung để bạn nhận được thông tin nhanh chóng và chính xác nhất. Chúc bạn một ngày tốt lành!