SpringBoot + MyBatis 之 Hello World

41 篇文章 0 订阅
15 篇文章 0 订阅

https://blog.csdn.net/sxzlc/article/details/120679525

目录

■相关知识1(其他代码)

■相关知识2(补充说明)

■目录结构

■配置文件

 ■POM

└默认会导入SLF4j和logback相关的jar

■logback-spring.xml

■application.properties

・注意点(配置文件)

■DB

■Java代码

1.HelloWorldMainApplication (启动类)

2.UserController  (控制类)

3.User

4.UserMapper.java (关联对应的DB操作相关的UserMapper.xml文件 【@Mapper】)

5.UserRepositoryImpl (@Repository 层)

6.UserRepository

7.UserService  (@Service 层)

@Transactional的属性

■xml代码

■访问效果

■DB数据

■启动Log

■加载顺序(application.properties)

■Mybatis的mapper.xml配置文件——详解


■相关知识1(其他代码)

SpringBoot + Thymeleaf 之 HelloWorld_sun0322-CSDN博客

SpringBoot + MyBatis + Thymeleaf 之 HelloWorld_sun0322-CSDN博客

■相关知识2(补充说明)

只是helloWorld,关于DB操作时的事物处理,并没有事物的具体使用。

(只是使用了一个标注(@Transactional),意思一下)

■目录结构

      

更新:添加了logback

 ---

■配置文件

 ■POM

<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>sxz.com</groupId>
  <artifactId>SpringBootStaduy001</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>
 
  <name>SpringBootStaduy001</name>
  <url>http://maven.apache.org</url>
 
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
  
  <parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.3.10.RELEASE</version>
  </parent>
 
  <dependencies>
  	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-web</artifactId>
  	</dependency>
  	
  	<!-- 画面,thymeleaf,需要使用的驱动类  -->
  	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-thymeleaf</artifactId>
  	</dependency>
  	
  	<!-- 访问数据库,需要使用的驱动类  -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
  	
  	<!-- 纯MyBatis使用的类(比如@Mapper)  -->
  	<dependency>
  	    <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.4.5</version>
    </dependency>
    
    <!-- MyBatis与Spring结合,使用到的类(比如@MapperScan)  -->
    <dependency>
		<groupId>org.mybatis</groupId>
		<artifactId>mybatis-spring</artifactId>
		<version>2.0.0</version>
	</dependency>
	<!-- MyBatis与Spring结合,使用到的类(没有启动时会报错)  -->
	<dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>2.0.1</version>
    </dependency>
    
    <!-- Log4j  -->
	<!-- <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
    </dependency> -->

    <!-- lombok  -->
    <dependency>
    	<groupId>org.projectlombok</groupId>
    	<artifactId>lombok</artifactId>
	</dependency>
  	
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <scope>test</scope>
    </dependency>
   </dependencies>
  
 <build>
   <plugins>
	  <plugin>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-maven-plugin</artifactId>
		<configuration>
			<includeSystemScope>true</includeSystemScope>
		</configuration>
	  </plugin>
  </plugins>
</build>
  
</project>

└默认会导入SLF4j和logback相关的jar

■logback-spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern><![CDATA[%n[%d{yyyy-MM-dd HH:mm:ss.SSS}] [level: %p] [Thread: %t] [ Class:%c >> Method: %M:%L ]%n%p:%m%n]]></pattern>
        </encoder>
    </appender>
    <appender name="LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder>
            <pattern><![CDATA[%n[%d{yyyy-MM-dd HH:mm:ss.SSS}] [level: %p] [Thread: %t] [ Class:%c >> Method: %M:%L ]%n%p:%m%n]]></pattern>
        </encoder>
        <file>J:/logs/sxz-web.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>logs/sports-web.-%d{yyyyMMdd}.%i.log</fileNamePattern>
            <!-- 每天一个日志文件,当天的日志文件超过10MB时,生成新的日志文件,当天的日志文件数量超过totalSizeCap/maxFileSize,日志文件就会被回滚覆盖。 -->
            <maxFileSize>10MB</maxFileSize>
            <maxHistory>30</maxHistory>
            <totalSizeCap>10GB</totalSizeCap>
        </rollingPolicy> 
    </appender>
    <logger name="com.sxz" level="DEBUG" additivity="false">
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="LOG_FILE"/>
        <!--<appender-ref ref="myAppender"/>-->
    </logger>
    <root level="INFO">
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="LOG_FILE"/>
        <!--<appender-ref ref="mqAppender"/>-->
    </root>
</configuration>

■application.properties

server.port=443
server.ssl.key-store: .keystore
server.ssl.key-store-password: tomcat
server.ssl.keyStoreType: JKS
server.ssl.keyAlias: myTomcat

# 画面 thymeleaf 配置
spring.thymeleaf.enabled:true
spring.thymeleaf.cache: false
spring.thymeleaf.mode: html

# 数据库连接配置
spring.datasource.driver-class-name: com.mysql.cj.jdbc.Driver
spring.datasource.url: jdbc:mysql://localhost:3306/messageboard
spring.datasource.username: root
spring.datasource.password: root001
spring.datasource.sql-script-encoding: UTF-8

#mybatis的相关配置
mybatis.mapper-locations: classpath:mapper/*.xml
mybatis.type-aliases-package: com.sxz.test.one.entity
 #开启驼峰命名
mybatis.configuration.map-underscore-to-camel-case: true
    

・注意点(配置文件)

    ・ 这一版springboot的配置文件,不支持阶梯式命名!!!

    ・数据库访问XML位置  (下面黄色标记(可自行定义文件夹结构))

・访问数据库,需要使用的驱动类(的Maven配置)

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>

 ・通过Spring的基类,自动配置数据源

DataSourceAutoConfiguration

 ---

 ---

■DB

■Java代码

1.HelloWorldMainApplication (启动类)

package com.sxz.test.one;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication
@MapperScan("com.sxz.test.one.mapper")
public class HelloWorldMainApplication {

	public static void main(String[] args) {
 
        // Spring应用启动起来
        SpringApplication.run(HelloWorldMainApplication.class,args);
    }
}

---

@MapperScan

 在持久层的接口上添加@Mapper注解,编译后会生成相应的接口实现类,
   但由于要在每个接口上都进行配置,
      为了简化配置,所以产生了@MapperScan。

---

      @MapperScan 是扫描mapper类的注解,
         在配置类中,使用@MapperScan注解之后,
         就不用在每个,持久层的接口上添加@Mapper注解
         (等同与,对每个持久层的接口,  都加上了@Mapper注解)

---

标注【@MapperScan】对应的Maven配置

    <dependency>
		<groupId>org.mybatis</groupId>
		<artifactId>mybatis-spring</artifactId>
		<version>2.0.0</version>
	</dependency>
	
	 <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>2.0.1</version>
     </dependency>

注意,只是对应上面第一个依赖,但是第二个也要写,不写会出如下的错误

java.lang.annotation.AnnotationFormatError: Invalid default: public abstract java.lang.Class org.mybatis.spring.annotation.MapperScan.factoryBean()
    at java.lang.reflect.Method.getDefaultValue(Method.java:612) ~[na:1.8.0_191]

2.UserController  (控制类)

package com.sxz.test.one.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.sxz.test.one.entity.User;
import com.sxz.test.one.service.UserService;

@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    UserService userService;

    @RequestMapping("/findAll")
    public List<User> findAll(){
        return userService.findAll();
    }
}

有两个 @RequestMapping("/XXX")

所以访问时,按照下面的地址访问。

https://10.10.10.194/user/findAll

3.User

package com.sxz.test.one.entity;

import java.io.Serializable;

import lombok.Data;

@Data
public class User implements Serializable {
    private String luId;
    private String luPass;
    private String luPermission;
}

注意,要提前引入lombok

    <dependency>
    	<groupId>org.projectlombok</groupId>
    	<artifactId>lombok</artifactId>
	</dependency>

・扩展(lombok安装)

Eclipse中,lombok安装_sun0322-CSDN博客

4.UserMapper.java (关联对应的DB操作相关的UserMapper.xml文件 【@Mapper】)

在持久层的接口上添加@Mapper注解,编译后会生成相应的接口实现类,

package com.sxz.test.one.mapper;

import java.util.List;

import org.apache.ibatis.annotations.Mapper;

import com.sxz.test.one.entity.User;

@Mapper
public interface UserMapper {
    public List<User> findAll();
}

标注【@Mapper】对应的Maven配置

  	<dependency>
  	    <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.4.5</version>
    </dependency>

・关联对应的xml文件

5.UserRepositoryImpl (@Repository 层)

package com.sxz.test.one.repository.impl;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import com.sxz.test.one.entity.User;
import com.sxz.test.one.mapper.UserMapper;
import com.sxz.test.one.repository.UserRepository;

@Repository
public class UserRepositoryImpl implements UserRepository {

    @Autowired
    private UserMapper userMapper;

    @Override
    public List<User> findAll() {
        return userMapper.findAll();
    }
}

6.UserRepository

package com.sxz.test.one.repository;

import java.util.List;

import com.sxz.test.one.entity.User;

public interface UserRepository {
    public List<User> findAll();
}

7.UserService  (@Service 层)

package com.sxz.test.one.service;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.sxz.test.one.entity.User;
import com.sxz.test.one.repository.UserRepository;

@Service
// @Transactional
@Transactional(isolation=Isolation.READ_COMMITED, propagation=Propagation.REQUIRES_NEW)
public class UserService {
	
	@Autowired
	private UserRepository userRepository;
	
	public List<User> findAll() {
		return userRepository.findAll();
	}
}

@Transactional的属性

 =======

■xml代码

UserMapper.xml  (关联代码【4.UserMapper】)

<?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.sxz.test.one.mapper.UserMapper">
    <select id="findAll" resultType="User">
        select * from login_user
    </select>
</mapper>

----

■访问效果

​​​​​​https://10.10.10.194/user/findAll

■DB数据

----

■启动Log


  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::       (v2.3.10.RELEASE)

2021-10-10 13:18:51.809  INFO 2236 --- [           main] c.s.test.one.HelloWorldMainApplication   : Starting HelloWorldMainApplication on PC_NAME with PID 2236 (C:\dev\SpringBootHelloWorld\target\classes started by LOGIN_USER_NAME in C:\dev\SpringBootHelloWorld)
2021-10-10 13:18:51.813  INFO 2236 --- [           main] c.s.test.one.HelloWorldMainApplication   : No active profile set, falling back to default profiles: default
2021-10-10 13:18:53.102  INFO 2236 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 443 (https)
2021-10-10 13:18:53.112  INFO 2236 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2021-10-10 13:18:53.112  INFO 2236 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.45]
2021-10-10 13:18:53.200  INFO 2236 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2021-10-10 13:18:53.200  INFO 2236 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1335 ms
2021-10-10 13:18:53.653  INFO 2236 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
2021-10-10 13:18:53.738  INFO 2236 --- [           main] o.s.b.a.w.s.WelcomePageHandlerMapping    : Adding welcome page: class path resource [static/index.html]
2021-10-10 13:18:54.400  INFO 2236 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 443 (https) with context path ''
2021-10-10 13:18:54.406  INFO 2236 --- [           main] c.s.test.one.HelloWorldMainApplication   : Started HelloWorldMainApplication in 2.989 seconds (JVM running for 3.38)
2021-10-10 13:19:05.084  INFO 2236 --- [-nio-443-exec-9] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
2021-10-10 13:19:05.084  INFO 2236 --- [-nio-443-exec-9] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2021-10-10 13:19:05.100  INFO 2236 --- [-nio-443-exec-9] o.s.web.servlet.DispatcherServlet        : Completed initialization in 16 ms
2021-10-10 13:19:05.175  INFO 2236 --- [-nio-443-exec-9] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
2021-10-10 13:19:05.534  INFO 2236 --- [-nio-443-exec-9] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.

---

■加载顺序(application.properties)

如果不通过启动时的参数指定

--spring.config.location=\AAA\BBB\ccc\application.properties

那么,如果同一个配置属性,在多个配置文件都配置了,默认使用第1个读取到的,后面读取的不覆盖前面读取到的。

①project:/config/(项目根目录下面config文件夹里的配置文件)

②project:/config/*/(项目根目录下面config文件夹里的配置文件)
③project:/(项目根目录下面的配置文件)
④classpath:/config/(Resources文件夹下面config文件夹里的配置文件)
⑤classpath:/(Resources文件夹下面的配置文件))

 ---

■Mybatis的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">
<!-- namespace:填写映射当前的Mapper接口,所有的增删改查的参数和返回值类型,
		就可以直接填写缩写,不区分大小写,直接通过方法名去找类型-->
<mapper namespace="com.itheima.mapper.UserMapper">
	<!-- sql:里面可以写入一个共同的sql代码,用于提取重复的代码。
		要使用该代码的时候就直接使用<include>标签
		id:为提取的sql代码,取一个id,起标识作用
		 -->
	<sql id="select">
		select * from user
	</sql>
	<!-- public User findUserById(int id); 
		id:填写在XxxMapper接口中的方法名
		parameterType:填写参数的类型
		resultType:填写方法中返回值的类型,不用写全路径,不区分大小写
	-->
	<select id="findUserById" parameterType="int" resultType="user">
		<!-- include:用于加载提取公共的sql语句,与<sql>标签对应
		       refid:填写<sql>标签中的id属性
		 -->
		<include refid="select"></include>
		where id = #{id}
	</select>
	<!-- resultMap属性:与resultMap标签一起使用,填写resultMap标签中定义的id属性 -->
	<select id="findAllOrders" resultMap="orders">
		select * from orders
	</select>
	<!-- resultMap标签:用于自定义封装结果
		type:最终结果还是封装到实体类中,type就是指定封装到哪一个类中
		id:与<select>标签中的resultMap中的属性一直,一定要唯一
		<id>:该标签是指定主键封装到实体类中的哪一个属性(可以省略)
		<result>:该标签是其他的列封装到实体类中,一般只需填写实体类中的属性与表中列不同的项即可
			property:填写实体类中的属性,column:填写表中的列名
	 -->
	<resultMap type="Orders" id="orders">
		<id property="id" column="id"/>
		<result property="userId" column="user_id"/>
	</resultMap>
	<!--  public void addUser(User user);
		insert:用于执行添加语句;update:执行更新语句
	   同样 delete:执行删除语句
	 -->
	<insert id="addUser" parameterType="user">
		<!-- selectKey配置主键信息的标签
			keyColumn:对应数据库表中的主键列
			keyProperty:对应实体类中的属性
			after:代表执行下面代码之前,先执行当前里面的代码
		 -->
		 <selectKey keyColumn="id" keyProperty="id" order="AFTER" resultType="int">
		 	select LAST_INSERT_ID()
		 </selectKey>
		insert into user
		(username,sex,address)
		values(#{username},#{sex},#{address})
	</insert>
	<!-- public List<User> findUserBySexAndUsername(User user); -->
	<select id="findUserBySexAndUsername" parameterType="User" resultType="user">
		<!--select * from user  where 1=1 -->
		<include refid="select"></include>
		<!-- where标签:一个where条件语句,通常和<if>标签混合使用 -->
		<where>
		<!-- if标签:执行一个判断语句,成立才会执行标签体内的sql语句
			test:写上条件判断语句
			注意:这里每一个if前面都尽量加上and,如果你是第一个条件,框架会自动帮你把and截取,如果是第二个if就不能省略and
		 -->
		<if test="sex != null and sex != ''">
			and sex = #{sex} 
		</if>
		<if test="username != null and username != ''">
			and username like '%${username}%'
		</if>
		</where>
	</select>
	
	<!-- public List<User> findUserByIds(QueryVo vo); -->
	<!-- QueryVo:是一个实体包装类,通常用于封装实体类之外的一些属性-->
	<select id="findUserByIds" parameterType="QueryVo" resultType="user">
		<include refid="select"></include>
		<where>
		<!-- foreach:循环语句,通常多用于参数是集合时,需要对参数进行遍历出来,再进行赋值查询
			collection:参数类型中的集合、数组的名字,例:下面的ids就是QueryVo这个类中的list集合的名字
			item:为遍历该集合起一个变量名,遍历出来的每一个字,都赋值到这个item中
			open:在sql语句前面添加的sql片段
			close:在sql语句后面添加的sql片段
			separator:指定遍历元素之前用什么分隔符
		 -->
		<foreach collection="ids" item="id" open="id in(" close=")" separator=",">
			#{id}
		</foreach>
		</where>
	</select>
</mapper>

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值