aetechliu / blog

0 stars 0 forks source link

springboot + mybatis の開発プロセスをまとめる #5

Open aetechliu opened 1 year ago

aetechliu commented 1 year ago

Spring Boot和MyBatis都是非常流行的Java开发框架,它们的集成可以使开发人员更加高效地开发Web应用程序。下面是Spring Boot和MyBatis开发过程的概述: 0.https://start.spring.io/ 可以在线一分钟生成脚手架程序。 image

  1. 添加Mybatis的依赖:在Spring Boot项目的pom.xml文件中添加mybatis-spring-boot-starter依赖。例如:
    <dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.2.0</version>
    </dependency>

    注意:Spring Boot默认支持JPA,而不是MyBatis,因此需要添加MyBatis的依赖。

2.配置数据源:在application.properties或application.yml文件中配置数据库连接信息,例如:

#在MyBatis中,如果您要连接MySQL数据库的默认端口(即3306端口),则可以在数据库连接配置中不指定端口号,不用写3306也可。MyBatis会自动使用默认端口来连接MySQL数据库。
spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

在这里,我们使用MySQL作为示例数据库,配置了URL、用户名、密码和驱动程序类名等信息。

3.创建MyBatis的Mapper接口:在src/main/java目录下创建Mapper接口,例如:

@Mapper
public interface UserMapper {
    @Select("SELECT * FROM users WHERE id = #{id}")
    User getUserById(Long id);
}

在这里,我们使用了@Mapper注解来标记这个接口。

4.创建MyBatis的Mapper XML文件:在src/main/resources目录下创建Mapper XML文件,例如:

<?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.mapper.UserMapper">
    <resultMap id="BaseResultMap" type="com.example.demo.model.User">
        <id column="id" property="id" jdbcType="BIGINT"/>
        <result column="name" property="name" jdbcType="VARCHAR"/>
        <result column="age" property="age" jdbcType="INTEGER"/>
    </resultMap>
    <select id="getUserById" resultMap="BaseResultMap">
        SELECT * FROM users WHERE id = #{id}
    </select>
</mapper>

在这里,我们定义了一个结果映射和一个查询语句。

5.注入Mapper接口:在Spring Boot的配置类中注入Mapper接口,例如:

@SpringBootApplication
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
    @Bean
    public UserMapper userMapper(SqlSessionFactory sqlSessionFactory) {
        SqlSessionTemplate sqlSessionTemplate = new SqlSessionTemplate(sqlSessionFactory);
        return sqlSessionTemplate.getMapper(UserMapper.class);
    }
}

在这里,我们使用了@Bean注解来将Mapper接口注入到Spring容器中。

除了使用@Bean注解,还可以使用其他注解将Mapper接口注入到Spring容器中,例如:

5.1 @MapperScan注解:在Spring Boot的配置类上使用@MapperScan注解,例如:

@SpringBootApplication
@MapperScan("com.example.demo.mapper")
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

在这里,我们使用@MapperScan注解来扫描com.example.demo.mapper包下的所有Mapper接口,并将它们注入到Spring容器中。

5.2 @Mapper注解:在Mapper接口上使用@Mapper注解,例如:

@Mapper
public interface UserMapper {
    // ...
}

在这里,我们使用@Mapper注解来标记这个Mapper接口,告诉Spring容器将它注入到容器中。

5.3 @Repository注解:在Mapper接口上使用@Repository注解,例如:

@Repository
public interface UserMapper {
    // ...
}

在这里,我们使用@Repository注解来标记这个Mapper接口,告诉Spring容器将它注入到容器中。

这些注解都可以将Mapper接口注入到Spring容器中,使用哪种注解取决于开发人员的个人喜好和项目的具体情况。

6.使用Mapper接口:在Controller类中使用Mapper接口,例如:

@RestController
public class UserController {
    @Autowired
    private UserMapper userMapper;
    @GetMapping("/users/{id}")
    public User getUserById(@PathVariable Long id) {
        return userMapper.getUserById(id);
    }
}

在这里,我们使用@Autowired注解来注入Mapper接口,并在请求处理方法中使用它。

总的来说,Spring Boot和MyBatis的集成非常简单,只需要添加依赖、配置数据源、创建Mapper接口和XML文件、注入Mapper接口并使用它即可。

aetechliu commented 1 year ago

Maven

pom.xml文件是使用Maven构建Java项目时的核心文件之一,主要用于描述项目依赖、构建过程和部署信息。当使用Maven构建项目时,Maven会自动读取和解析pom.xml文件,根据文件中的配置信息执行相应的构建操作。

下面是一个示例的pom.xml文件,包含了一些常用的配置信息:

<project>
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.example</groupId>
  <artifactId>myproject</artifactId>
  <version>1.0.0</version>

  <dependencies>
    <dependency>
      <groupId>com.google.guava</groupId>
      <artifactId>guava</artifactId>
      <version>30.0-jre</version>
    </dependency>
    <dependency>
      <groupId>org.junit.jupiter</groupId>
      <artifactId>junit-jupiter-api</artifactId>
      <version>5.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.8.1</version>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
        </configuration>
      </plugin>
    </plugins>
  </build>

  <repositories>
    <repository>
      <id>central</id>
      <url>http://repo1.maven.org/maven2/</url>
    </repository>
  </repositories>
</project>

这个pom.xml文件中包含了以下配置信息:

在解析pom.xml文件时,Maven会自动读取其中的配置信息,并执行相应的构建操作。例如,Maven会下载指定的依赖库,并将它们打包到最终的构建产物中;同时,Maven也会根据配置信息编译和打包项目代码,生成相应的构建产物。总的来说,pom.xml文件是Maven构建Java项目的重要配置文件,它可以帮助开发者管理项目依赖、指定构建过程和部署信息,从而简化Java项目的构建和管理。 Maven构建过程是在编译项目时进行的,而不是在程序运行时。Maven通过读取pom.xml文件中的配置信息,执行相应的构建操作,生成最终的构建产物。这些构建产物可以是可执行的JAR或WAR包,也可以是一些资源文件、文档或配置文件。开发人员可以使用这些产物部署项目或将其发布到中央仓库供其他开发人员或用户使用。

aetechliu commented 1 year ago

注解

Java中的注解(Annotation)是一种元数据,它可以被应用于类、方法、变量等代码元素上,用来为这些元素添加描述性信息,或者在编译时或运行时起到特定的作用。注解本质上是一种特殊的Java接口,使用了@符号来标识。

Java项目中注解的作用有以下几个方面:

  1. 提供代码描述信息:通过注解为代码元素(例如类、方法、字段等)提供额外的描述信息,可以更清晰地表达代码意图和逻辑,方便其他开发人员阅读和理解代码。

  2. 编译时检查:通过注解在编译时检查代码的合法性,例如@Override注解可以检查某个方法是否正确地覆盖了父类的方法。

  3. 运行时处理:通过注解在运行时处理代码,例如@Autowired注解可以自动注入依赖对象,简化代码编写。

  4. 代码生成:通过注解生成一些重复性的代码,例如使用Lombok库中的@Data注解可以自动生成getter/setter方法、equals/hashCode方法、toString方法等。

  5. 标记测试用例:通过注解标记测试用例,例如使用JUnit框架中的@Test注解可以标记测试用例,方便测试框架自动识别测试用例并执行。

  6. 生成文档:通过注解生成API文档,例如使用JavaDoc工具可以自动生成API文档,其中的注解可以提供API的说明和文档。

总的来说,Java中的注解为开发者提供了一种灵活而强大的元编程工具,可以帮助开发者更好地描述代码、检查代码、处理代码和生成代码。在Java开发中广泛应用,是Java语言的重要特性之一。

aetechliu commented 1 year ago

MyBatis 的Mapper 接口是由谁来实现的

在 MyBatis 中,Mapper 接口并没有具体的实现类,而是在运行时由 MyBatis 根据 Mapper 接口中的定义动态地生成实现类。这种机制称为动态代理。

MyBatis 会在启动时扫描 Mapper 接口,然后根据接口的定义和注解生成一个实现类,并将该实现类注入到 Spring 容器中。这个实现类中的方法具体实现是由 MyBatis 运行时根据对应的 Mapper XML 文件生成的 SQL 语句来完成的。

因此,在 Java 工程中,我们看不到 Mapper 接口的具体实现类。这种机制使得开发人员只需要定义 Mapper 接口并按照规范进行注解,就可以直接调用 Mapper 接口中定义的方法,而不需要编写繁琐的 SQL 语句和数据源的连接等操作。这大大提高了代码的可读性和可维护性。同时,由于 Mapper 接口没有实现类,因此我们也不需要手动去编写和维护 Mapper 接口的具体实现。

aetechliu commented 1 year ago

Thymeleaf的变量渲染

Thymeleaf是一种Java模板引擎,用于在Web应用中渲染HTML、XML、JavaScript等文件。Thymeleaf中的变量占位符在不同的情况下会被赋值,具体如下:

  1. 服务端渲染:当使用Thymeleaf进行服务端渲染时,变量占位符在服务器端被赋值。通常情况下,开发者会在后端Java代码中将变量值赋给模板中的变量占位符,例如:
@GetMapping("/hello")
public String hello(Model model) {
    model.addAttribute("name", "Thymeleaf");
    return "hello";
}

在这个例子中,Model对象的addAttribute方法用于将name变量赋值为"Thymeleaf",然后在模板中使用th:text指令来显示该变量的值:

<h1 th:text="${name}"></h1>

在服务端渲染时,Thymeleaf会将该模板渲染成HTML代码,并将变量占位符替换为相应的变量值。

  1. 客户端渲染:当使用Thymeleaf进行客户端渲染时,变量占位符在浏览器端被赋值。通常情况下,开发者会在后端Java代码中将变量值作为响应数据返回给浏览器,然后在浏览器端使用JavaScript等脚本来将变量值赋给模板中的变量占位符。例如:
@GetMapping("/hello")
@ResponseBody
public Map<String, Object> hello() {
    Map<String, Object> data = new HashMap<>();
    data.put("name", "Thymeleaf");
    return data;
}

在这个例子中,hello方法返回一个Map对象,其中包含了name变量和其对应的值。然后在客户端JavaScript代码中,可以使用fetch等API来获取该响应数据,并将变量值赋给模板中的变量占位符。例如:

<h1 th:text="${name}" id="name"></h1>
<script>
    fetch('/hello')
        .then(res => res.json())
        .then(data => {
            const name = document.getElementById('name');
            name.innerText = data.name;
        });
</script>

在客户端渲染时,Thymeleaf不会直接将模板渲染成HTML代码,而是在浏览器端使用JavaScript脚本来将模板渲染成HTML代码,并将变量占位符替换为相应的变量值。