如何创建一个Spring项目
错误问题
不知道什么原因,大概是依赖版本不兼容、java版本不对的问题,折磨了好久就是搞不成。
主要原因看pom.xml配置
pom.xml配置
java版本
由于是跟着22年黑马视频做的,java版本换成了jdk-11,用21以上不行,其他没试过。
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
Project Structure设置
依赖
需要修改的下面几个
<?xml version="1.0" encoding="UTF-8"?>
<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>SpringDemo</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.16</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.26</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.6</version>
</dependency>
<!-- 添加logback-classic依赖 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<!-- 添加logback-core依赖 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
</dependencies>
</project>
文件结构
下面只介绍用上的
数据库
create database mybatis;
use mybatis;
create table user
(
id int auto_increment
primary key,
username varchar(20) null,
password varchar(20) null,
gender char null,
addr varchar(30) null
);
application.properties
把mybatis换成自己数据库名即可
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis?useSSL=false
jdbc.username=root
jdbc.password=root
MybatisConfig
package com.example.config;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.context.annotation.Bean;
import javax.sql.DataSource;
public class MybatisConfig {
@Bean
public SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource) {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setTypeAliasesPackage("com.example.domain");
sqlSessionFactoryBean.setDataSource(dataSource);
return sqlSessionFactoryBean;
}
@Bean
public MapperScannerConfigurer mapperScannerConfigurer() {
MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
mapperScannerConfigurer.setBasePackage("com.example.dao");
return mapperScannerConfigurer;
}
}
JdbcConfig
package com.example.config;
import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.PropertySource;
import javax.sql.DataSource;
// 从 application.properties 文件中加载配置属性
@PropertySource("application.properties")
public class JdbcConfig {
// 注入数据库驱动类名
@Value("${jdbc.driver}")
private String driver;
// 注入数据库连接 URL
@Value("${jdbc.url}")
private String url;
// 注入数据库用户名
@Value("${jdbc.username}")
private String username;
// 注入数据库密码
@Value("${jdbc.password}")
private String password;
/**
* 创建并配置 Druid 数据源
* @return 配置好的数据源对象
*/
@Bean
public DataSource dataSource() {
DruidDataSource ds = new DruidDataSource();
// 设置数据库驱动类名,使用从配置文件中注入的值
ds.setDriverClassName(driver);
// 设置数据库连接 URL,使用从配置文件中注入的值
ds.setUrl(url);
// 设置数据库用户名,使用从配置文件中注入的值
ds.setUsername(username);
// 设置数据库密码,使用从配置文件中注入的值
ds.setPassword(password);
return ds;
}
}
User
package com.example.domain;
public class User {
private int id;
private String username;
private String password;
private String gender;
private String addr;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
", gender='" + gender + '\'' +
", addr='" + addr + '\'' +
'}';
}
}
UserDao
package com.example.dao;
import com.example.domain.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import java.util.List;
@Mapper
public interface UserDao {
@Select("select * from mybatis.user")
public List<User> selectAll();
@Select("select * from mybatis.user where id = #{id}")
public User selectById(Integer id);
}
UserService
package com.example.service;
import com.example.domain.User;
import java.util.List;
public interface UserService {
public List<User> selectAll();
public User selectById(Integer id);
}
UserServiceImpl
package com.example.service.impl;
import com.example.dao.UserDao;
import com.example.domain.User;
import com.example.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service("userService")
public class UserServiceImpl implements UserService {
//private BookDao bookDao = new BookDaoImpl();
// 5.为了解决代码耦合度过高,使用IOC容器将创建对象的过程在容器中实现,不再使用new
@Autowired
private UserDao userDao;
@Override
public List<User> selectAll() {
return userDao.selectAll();
}
@Override
public User selectById(Integer id){
return userDao.selectById(id);
}
}
logback.xml(无关紧要)
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- console表示当前日志信息是可以输出到控制台的-->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>(%level %boldBlue(%d{HH:mm:ss.SSS}) %cyan(【%thread】) %boldGreen(%logger{15}) - %msg %n)</pattern>
</encoder>
</appender>
<root level="debug">
<appender-ref ref="STDOUT" />
</root>
</configuration>
AppTest(Spring整合mybatis的运行程序)
package com.example;
import com.example.config.SpringConfig;
import com.example.domain.User;
import com.example.service.UserService;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import java.util.List;
public class AppTest {
public static void main(String[] args) {
// 获取IOC容器
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
UserService userService = ctx.getBean(UserService.class);
List<User> users = userService.selectAll();
System.out.println(users);
ctx.close();
}
}
UserServiceTest(测试类)
package com.example.service;
import com.example.config.SpringConfig;
import com.example.domain.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import java.util.List;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = SpringConfig.class)
public class UserServiceTest {
@Autowired
private UserService userService;
@Test
public void selectAllTest() {
List<User> users = userService.selectAll();
System.out.println(users);
}
@Test
public void selectByIdTest() {
Integer id = 3;
User user = userService.selectById(id);
System.out.println(user);
}
}
整合思路
整合mybaits
在mybatisConfig用SqlSessionFactoryBean封装SqlSessionFactory需要的环境信息
连接信息用jdbcConfig实现,dataSource对象是自动加载的
使用MapperScannerConfigurer加载Dao接口,创建代理对象保存到IOC容器中
主配置类SpringConfig中引入Mybatis配置类
- @Configuration:声明这是一个配置类
- @ComPonentScan:使得 Spring 容器能够自动扫描和发现被特定注解标注的类,并将它们注册为 Spring 容器中的 Bean
- @PropertySource:加载外部属性文件,将外部的属性文件(如
.properties
、.yml
等)中的属性加载到 Spring 的Environment
中,为应用程序提供配置信息。 - @Import:这里是导入配置类,可以将其他的 Spring 配置类导入到当前配置类中,让 Spring 容器能够扫描和管理这些配置类中定义的 Bean。
@Configuration
@ComponentScan("com.examole")
@PropertySource("classpath:jdbc.properties")
@Import({JdbcConfig.class,MybatisConfig.class})
public class SpringConfig {
}
整合Jnuit
//设置类运行器
@RunWith(SpringJUnit4ClassRunner.class)
//设置Spring环境对应的配置类
@ContextConfiguration(classes = {SpringConfiguration.class}) //加载配置类
- 单元测试,如果测试的是注解配置类,则使用@ContextConfiguration(classes = 配置类.class)
- 单元测试,如果测试的是配置文件,则使用 名,...}) @ContextConfiguration(locations={配置文件名,...})
- Junit运行后是基于Spring环境运行的,所以Spring提供了一个专用的类运行器,这个务必要设 置,这个类运行器就在Spring的测试专用包中提供的,导入的坐标就是这个东西 SpringJUnit4ClassRunner
- 上面两个配置都是固定格式,当需要测试哪个bean时,使用自动装配加载对应的对象,下面的工 作就和以前做Junit单元测试完全一样了
注解解释
@RunWith
@ContextConfiguration