前言
安装
由于篇幅有限, 请参考网络上的教程
代码仓库
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 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)
更像是定义了一套项目规范和模板,然后用户在框架的基础上遵守框架约定的标准或结构进行开发; 不过很多时候这个界限不是很清晰,
两个词经常混用
java基本上是用spring全家桶, 主流开发是ssm, 即spring springmvc mybatis, 有时候会用微服务, 使用springcloud
而spring在没有springboot之前, 框架的配置非常繁琐, 所以本教程的框架案例基于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
社群
你可以在这些平台联系我: