springboot 数据访问之 MyBatis

现在依然非常流行的数据持久层框架,通过与 springboot 的整合,几乎不用做任何配置即可使用,直接操作数据库。
springboot 中可以通过注解方式也可以通过配置方式使用 MyBatis,当然,也可以混合使用两种方式。

准备工作

数据源配置延用了上一篇的配置
加入相关依赖

	<dependency>
  		<groupId>org.springframework.boot</groupId>
  		<artifactId>spring-boot-starter-jdbc</artifactId>
  	</dependency>
  	<!-- https://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter -->
	<dependency>
	    <groupId>org.mybatis.spring.boot</groupId>
	    <artifactId>mybatis-spring-boot-starter</artifactId>
	    <version>2.0.1</version>
	</dependency>
  	<dependency>
  		<groupId>mysql</groupId>
  		<artifactId>mysql-connector-java</artifactId>
  		<scope>runtime</scope>
  	</dependency>

先确保建了数据表,同时有了相对应的实体类
本例使用如下数据表和实体类

CREATE TABLE `students` (
  `sid` int NOT NULL,
  `sname` varchar(20)
);

CREATE TABLE `departments` (
  `deptid` int NOT NULL,
  `deptname` varchar(20)
);
public class Student {
    
    

	private Integer sid;
	private String sname;
	public Integer getSid() {
    
    
		return sid;
	}
	public void setSid(Integer sid) {
    
    
		this.sid = sid;
	}
	public String getSname() {
    
    
		return sname;
	}
	public void setSname(String sname) {
    
    
		this.sname = sname;
	}
	
}
public class Department {
    
    

	private Integer deptid;
	private String deptname;
	public Integer getDeptid() {
    
    
		return deptid;
	}
	public void setDeptid(Integer deptid) {
    
    
		this.deptid = deptid;
	}
	public String getDeptname() {
    
    
		return deptname;
	}
	public void setDeptname(String deptname) {
    
    
		this.deptname = deptname;
	}
	
}

注解方式

注解方式:就是创建一个 Mapper 接口,直接在接口的方法上加入注解,并且把该方法执行的 sql 直接写在注解中。记得在 Mapper 接口类上标注 @Mapper ,或者在启动类标注 @MapperScan(value=“com.xiao.mapper”),指明扫描哪个包,value 可以是一个 String 数组。在启动类标注后就不用在每个 Mapper 接口类标注 @Mapper 了

@Mapper
public interface StudentMapper {
    
    

//	@Options(useGeneratedKeys=true,keyProperty="sid") // 此注解表明这个表使用了自增主键,插入记录后主键会封装到这个对象中
	@Insert("insert into students values(#{sid},#{sname})")
	public int insertStu(Student stu);
	
	@Delete("delete from students where sid = #{sid}")
	public int deleteStuById(Integer sid);
	
	@Update("update students set sname = #{sname} where sid = #{sid}")
	public int updateStuById(Student stu);
	
	@Select("select * from students where sid = #{sid}")
	public Student getStuById(Integer sid);
}

写好接口类后,不用写实现类,就可以直接注入使用了,下面直接在 Controller 中调用 crud 方法

@RestController
public class StudentsController {
    
    

	@Autowired
	StudentMapper stuMapper;
	
	@GetMapping("/stu")
	public Student insertStu(Student stu) {
    
    
		stuMapper.insertStu(stu);
		return stu;
	}
	
	@GetMapping("/stu/{id}")
	public Student getStuById(@PathVariable("id")Integer sid) {
    
    
		return stuMapper.getStuById(sid);
	}
}

启动项目,发送请求,查看结果
在这里插入图片描述
在这里插入图片描述
当数据库的列名有下划线时,需要开启驼峰命名才能正确装配属性,我们可以自定义 MyBatis 的配置规则,给容器中添加一个 ConfigurationCustomizer

@org.springframework.context.annotation.Configuration
public class MybatisConfig {
    
    

	@Bean
	public ConfigurationCustomizer mybatisCustomizer() {
    
    
		return new ConfigurationCustomizer() {
    
    
			@Override
			public void customize(Configuration configuration) {
    
    
				// 开启驼峰命名
				configuration.setMapUnderscoreToCamelCase(true);
			}
		};
	}
}

配置方式

配置方式:就是写相应的 mapper.xml 映射文件,在 xml 文件中书写 sql ,id 对应 Mapper 接口中的方法名
在静态资源目录下创建 mybatis 文件夹,存放有关 mybatis 的配置文件。创建一个 mybatis 的全局配置文件 mybatis-config.xml,空的就行,只要头

<?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>
  
</configuration>

创建 Mapper 接口,这次没有在这里加@Mapper注解,直接在启动类中加 @MapperScan 注解

public interface DeptMapper {
    
    

	public void insertDept(Department dept);
	
	public Department getDeptById(Integer deptid);
}

写 Mapper 映射文件 departmentMapper.xml,我放在资源目录 mybatis 的 mapper 文件夹下。namespace 绑定对应的 Mapper 接口

<!DOCTYPE mapper
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.xiao.mapper.DeptMapper">
	<select id="getDeptById" resultType="com.xiao.entities.Department">
		select * from departments where deptid = #{deptid}
	</select>	

	<insert id="insertDept">
		insert into departments values(#{deptid},#{deptname})
	</insert>
</mapper>

在 application.properties 配置文件中指定资源文件的位置

# mybatis 全局配置/主配置文件
mybatis.config-location=classpath:mybatis/mybatis-config.xml
# mybatis mapper映射文件
mybatis.mapper-locations=classpath:mybatis/mapper/*.xml

controller 中调用方法

@RestController
public class DeptController {
    
    
	@Autowired
	DeptMapper deptMapper;

	@GetMapping("/dept")
	public Department insertDept(Department dept) {
    
    
		deptMapper.insertDept(dept);
		return dept;
	}
	
	@GetMapping("/dept/{id}")
	public Department getDeptById(@PathVariable("id") Integer id) {
    
    
		return deptMapper.getDeptById(id);
	}
}

启动项目,记得在启动类 @MapperScan 注解
在这里插入图片描述
在这里插入图片描述
配置方式开启驼峰命名,在 mybatis 的主配置文件中加入一个设置

<?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>
  <settings>
  	<setting name="mapUnderscoreToCamelCase" value="true" />
  </settings>
</configuration>

注解方式和配置方式可以混用,本人倾向于简单的 sql 用注解方式,比较复杂的 sql 用配置方式。

猜你喜欢

转载自blog.csdn.net/Alias_fa/article/details/89977849
今日推荐