前書き
インストール
スペースの制限により、インターネット上のチュートリアルを参照してください。
コードリポジトリ
gitee
実行方法
Hello Worldを印刷する例として
Javaにはパッケージ管理がないため、いくつかのプロジェクトでは外部ライブラリを管理するためにMavenを使用します。
Mavenコマンドラインで実行:
変数定義とデータ型
変数はメモリ内の特定のアドレスを指す識別子であり、通常データを保存するために使用されます。
データ型は変数の型を表し、型はこの変数がメモリ内で占めるスペースのサイズを決定します。
代入はデータ(値)を変数が指すアドレスに保存することであり、その後この変数を使用してそのデータを取得できます。
1 2 3 4 5 6 7 8 9 10 11 12
| public class VariableExample { public static void main(String[] args) { int age = 25; double salary = 5000.50; String name = "Alice";
System.out.println("Name: " + name); System.out.println("Age: " + age); System.out.println("Salary: " + salary); } }
|
フロー制御
フロー制御はプログラムの実行順序を定義することです。
順序
順序実行は上から下へ順に実行されます。これはプログラムの通常の実行フローです。
選択
選択は異なる条件を満たすことで異なるコードを実行することです。
選択のフローは単一分岐と多分岐に分かれます。
単一分岐
単一分岐は分岐ノードが1つだけで、条件判断が1回だけです。
1 2 3 4 5 6 7 8 9
| public class IfExample { public static void main(String[] args) { int temperature = 30; if (temperature > 25) { System.out.println("It's a hot day!"); } } }
|
多分岐
多分岐は複数の分岐ノードがあり、複数の条件判断があります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| public class SwitchStringExample { public static void main(String[] args) { String fruit = "Apple";
switch (fruit) { case "Apple": System.out.println("You chose Apple."); break; case "Banana": System.out.println("You chose Banana."); break; default: System.out.println("Unknown fruit."); break; } } }
|
ループ
ループは繰り返し実行するプロセスを表します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| public class LoopExamples { public static void main(String[] args) { for (int i = 1; i <= 5; i++) { System.out.println("For loop: " + i); }
int count = 0; while (count < 5) { System.out.println("While loop: " + count); count++; }
int value = 0; do { System.out.println("Do-while loop: " + value); value++; } while (value < 5); } }
|
関数
関数の本質はクロージャであり、独自のスコープを持っています。
関数を使用してコードの一部を定義し、0個以上の入力を受け取り、関数内のコードを実行し、終了時に0個以上の出力を返すことができます。
関数を使用すると共通のロジックを抽出し、コードを簡素化できます。
1 2 3 4 5 6 7 8 9
| public class FunctionExample { public static void greetUser(String name) { System.out.println("Hello, " + name + "!"); }
public static void main(String[] args) { greetUser("Bob"); } }
|
クラス/構造体
クラス/構造体
クラスはデータとメソッド(関数)を含む抽象構造であり、定義することができます。クラスを使用するには、クラスをインスタンス化する必要があります。これはメモリ内に指定されたサイズのスペースを開いて保存することです。
クラスのサイズは内部に定義されるデータ(例えばint)によって決まり、コンパイラはデータのサイズに基づいてどれだけのスペースを割り当てるかを自動的に決定します。
クラスは複数のインスタンス化オブジェクトを持つことができ、つまり複数の異なる変数を持つことができますが、これらの変数はすべてこのクラスの構造と一致しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| class Person { String name; int age;
void introduce() { System.out.println("My name is " + name + ", and I am " + age + " years old."); } }
public class ClassExample { public static void main(String[] args) { Person person1 = new Person(); person1.name = "John"; person1.age = 30; person1.introduce();
Person person2 = new Person(); person2.name = "Jane"; person2.age = 28; person2.introduce(); } }
|
インターフェース
インターフェース(Interface)構文は、動作の規範を定義する方法です。ある型がどのようなメソッド(関数)を持つべきかを記述しますが、これらのメソッドが具体的にどのように実装されるかには関心を持ちません。
インターフェースは抽象的な契約(contract)です:
- メソッド名、パラメータ、戻り値のみを定義します。
- 具体的な実装(ロジックコード)は含みません。
- ある型がインターフェースに定義されたすべてのメソッドを実装した場合、「そのインターフェースを実装した」と呼ばれます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| interface Animal { void makeSound(); }
class Dog implements Animal { public void makeSound() { System.out.println("Woof!"); } }
class Cat implements Animal { public void makeSound() { System.out.println("Meow!"); } }
public class InterfaceExample { public static void main(String[] args) { Animal myDog = new Dog(); Animal myCat = new Cat(); myDog.makeSound(); myCat.makeSound(); } }
|
フレームワーク
開発を簡素化するために、プログラマーは共通のロジックを抽出し、関数として、またはクラスとメソッドとして封装し、開発を簡素化します。この継続的な簡素化の過程でフレームワークが誕生しました。
しかし私の理解では、ライブラリ(library)は共通のメソッドとクラスのツールの集合であり、ユーザーは自分の好みに応じて多くの異なるライブラリを追加して使用できます。一方、フレームワーク(framework)はプロジェクトの規範とテンプレートを定義し、ユーザーはフレームワークの基礎に従ってフレームワークが定めた標準や構造に従って開発を行います。しかし多くの場合、この境界は非常に明確ではなく、2つの言葉は頻繁に混用されます。
Javaは基本的にSpringファミリーを使用し、主流の開発はSSM、つまりSpring、SpringMVC、MyBatisです。時にはマイクロサービスを使用し、SpringCloudを使用します。
SpringBootが登場する前は、Springの設定は非常に面倒でしたので、このチュートリアルのフレームワークの例はSpringBootに基づいています。
Web
現在書いているプログラムはすべてローカルで実行されていますが、世界中のユーザーが使用できるようにするためには、ネットワークに公開する必要があります。そしてWebフレームワークは、言語自体が提供するネットワークライブラリを封装し、ネットワークサービスを公開するためのさまざまな方法を提供します。
Java言語で一般的に使用されるWebフレームワークはSpringMVCです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| <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.example</groupId> <artifactId>springmvc-json-demo</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging>
<name>Spring MVC JSON Demo</name> <description>Demo project for Spring MVC with JSON response</description>
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.5</version> <relativePath/> </parent>
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </dependency> </dependencies>
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>11</source> <target>11</target> </configuration> </plugin> </plugins> </build> </project>
|
1 2 3 4 5 6 7 8 9 10 11 12 13
| package com.example.demo;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController;
@RestController public class DemoController {
@GetMapping("/hello") public String sayHello() { return "{\"message\": \"Hello, World!\"}"; } }
|
1 2 3 4 5 6 7 8 9 10 11 12
| package com.example.demo;
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication public class Application {
public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
|
localhost:8080にアクセスして確認
DB
現在は変数を使用してデータを保存していますが、変数のデータはメモリに保存されているため、プログラムが停止するとメモリ内のデータは回収されます。次回プログラムを起動すると、オペレーティングシステムが割り当てるのは別のメモリ空間かもしれません。したがって、データを永続的に保存する必要があり、これにはデータベースシステムが必要です。
Java言語で一般的に使用されるDBフレームワークはMyBatisです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| <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.example</groupId> <artifactId>mybatis-sqlite-demo</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging>
<name>MyBatis SQLite Demo</name> <description>Demo project for MyBatis with SQLite in Spring Boot</description>
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.5</version> <relativePath/> </parent>
<properties> <java.version>11</java.version> </properties>
<dependencies> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.3.1</version> </dependency>
<dependency> <groupId>org.xerial</groupId> <artifactId>sqlite-jdbc</artifactId> <version>3.36.0.3</version> </dependency> </dependencies>
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>${java.version}</source> <target>${java.version}</target> </configuration> </plugin> </plugins> </build> </project>
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| package com.example.demo;
public class User { private Long id; private String name; private Integer age;
public Long getId() { return id; } public void setId(Long id) { this.id = id; }
public String getName() { return name; } public void setName(String name) { this.name = name; }
public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; }
@Override public String toString() { return "User{" + "id=" + id + ", name='" + name + '\'' + ", age=" + age + '}'; } }
|
resources/mapper/UserMapper.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.UserMapper"> <insert id="insertUser"> INSERT INTO users (name, age) VALUES (#{name}, #{age}) </insert>
<select id="selectAllUsers" resultType="com.example.demo.User"> SELECT * FROM users </select>
<update id="updateUser"> UPDATE users SET name = #{name}, age = #{age} WHERE id = #{id} </update>
<delete id="deleteUserById"> DELETE FROM users WHERE id = #{id} </delete> </mapper>
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
| package com.example.demo;
import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.InputStream; import java.util.List;
public class Main {
public static void main(String[] args) throws Exception { String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
try (SqlSession session = sqlSessionFactory.openSession(true)) { User user1 = new User(); user1.setName("Alice"); user1.setAge(25); session.insert("com.example.demo.UserMapper.insertUser", user1); System.out.println("✅ 插入用户 Alice");
User user2 = new User(); user2.setName("Bob"); user2.setAge(30); session.insert("com.example.demo.UserMapper.insertUser", user2); System.out.println("✅ 插入用户 Bob");
List<User> users = session.selectList("com.example.demo.UserMapper.selectAllUsers"); System.out.println("🔍 查询所有用户:"); for (User user : users) { System.out.println(user); }
if (!users.isEmpty()) { User updateUser = users.get(0); updateUser.setName("Updated Alice"); updateUser.setAge(26); session.update("com.example.demo.UserMapper.updateUser", updateUser); System.out.println("🔄 更新用户 ID=" + updateUser.getId()); }
if (!users.isEmpty()) { Long deleteId = users.get(0).getId(); session.delete("com.example.demo.UserMapper.deleteUserById", deleteId); System.out.println("🗑️ 删除用户 ID=" + deleteId); }
List<User> remainingUsers = session.selectList("com.example.demo.UserMapper.selectAllUsers"); System.out.println("📋 删除后剩余用户:"); for (User user : remainingUsers) { System.out.println(user); } } } }
|
resources/mybatis-config.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="url" value="jdbc:sqlite:./test.db"/>
<property name="driver" value="org.sqlite.JDBC"/>
</dataSource> </environment> </environments>
<mappers> <mapper resource="mapper/UserMapper.xml"/> </mappers> </configuration>
|
运行前执行sql
1 2 3 4 5 6 7 8 9
| -- src/main/resources/schema.sql DROP TABLE IF EXISTS users;
CREATE TABLE IF NOT EXISTS users ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, age INTEGER );
|
拡張
○ マルチスレッド/マイクロサービス/リフレクション-動的プロキシ/ファイル操作/ネットワークプログラミング/
○ フレームワークの原理/手書き
○ wasm/grpc
コミュニティ
これらのプラットフォームで私に連絡できます:
- bili: 刚子哥forever
- QQグループ: 940263820
- gitee: gitee
- ブログ: malcode-site
- メール: malguy2022@163.com
- 知乎: 乐妙善哉居士
- csdn: 飞鸟malred