SpringBoot整合Mybatis |
1. 添加mybatis依赖包
<!-- parent中规定了SpringBoot中统一的jar包的 依赖项. 1.Spring 2.日志jar包 3.tomcatjar包 版本依赖信息:
SpringBoot内部将需要使用的公共jar包的版本号 进行了统一维护 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.3.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<!-- 坐标作用: 1.管理项目如何储存 2.项目将来发布时,会将jar包/war包生成到指定的 本地仓库中. 3.生成的jar包可以被第三方项目依赖!!! -->
<groupId>com.jt</groupId> <!--组ID -->
<artifactId>springboot-1-demo</artifactId> <!--项目名称 -->
<version>0.0.1-SNAPSHOT</version> <!--版本号 -->
<name>springboot-1-demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<!--jar包依赖项 1.SSM框架整合时需要编辑很多的配置文件!!! -->
<dependencies>
<!-- SpringBoot整合SpringMVC(web.xml)会生成专门的 jar包名称一般都是以spring-boot-starter-xx开头 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--添加属性注入依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<!--支持热部署 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
<version>1.2.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
<!--引入插件lombok 自动的set/get/构造方法插件 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!--引入数据库驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!--引入druid数据源 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.12</version>
</dependency>
<!--spring整合mybatis 暂时 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
</dependencies>
<!-- 作用:当项目进行maven操作时,必须引入maven相关插件 -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
2. 编辑整合YMl配置文件
server:
port: 8090
servlet:
context-path: /
spring:
datasource:
#引入druid数据源
#下面两项可不要
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
#只要下面三项是最简化写法
url: jdbc:mysql://127.0.0.1:3306/jtdb?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
username: root
password: root
#如果数据库密码以0开头 使用:""包裹
mybatis:
#定义别名包 简化查询resultType配置
type-aliases-package: com.jt.pojo
#Mybatis的映射文件路径
mapper-locations: classpath:/mybatis/mappers/*.xml
#开启驼峰映射 字段 属性 对应 去除字段中的"_"之后首字母大写
configuration:
map-underscore-to-camel-case: true
3.开启驼峰映射
表名:user
字段:user_id,user_name,user_age,user_sex
对象:User
属性:userId,username,userAge,userSex;
问题说明:
Mybatis中如果实现ORM对象映射,则要求对象中的属性与表中的字段必须一一映射. 但是现在表中的字段与属性名称不一致.中间多”_”.导致映射不成功!!
解决方案:开启驼峰映射规则
Mybatis:
configuration:
map-underscore-to-camel-case: true
则可以自动的实现对象的赋值.
驼峰映射原理:
- 根据sql语句获取结果集对象.
- 利用resultType实现赋值时发现字段与对象的属性不否.
- 利用驼峰映射将字段user_id中的”_”去除—userid
- 将后边首字母大小------userId
- 将数据库中的值自动映射给对象中的属性userId
4. 业务代码实现
4.1 编辑POJO对象
@Data
@Accessors(chain = true)
public class User {
private Integer id;
private String name;
private Integer age;
private String sex;
}
@Data //自动添加get/set方法
@Accessors(chain = true) //开启链式加载
@AllArgsConstructor //添加全部参数的构造
@NoArgsConstructor //添加无参构造
public class User {
private Integer id;
private String name;
private Integer age;
private String sex;
}
4.2 编辑Mapper接口
//将Mapper接口交给Spring容器管理
//@Mapper 将Mapper接口交给Spring容器实例化.接口是不能直接实例化的.
//在底层实现时为mapper接口生成是代理对象. Spring容器内部利用JDK代理方式创建代理对象.
/**
* JDK代理: 如果被代理者实现了接口/本身是接口时使用JDK代理
* CGLIB代理: 当被代理者没有实现接口/本身也不是接口时,使用CGLIB代理.
* 特点:代理对象是被代理者的子类.
* @author tarena
*
*/
public interface UserMapper {
//查询数据库获取user信息
@Select("select * from user")
List<User> findAll();
void insertUser(User user);
}
4.3编辑Mapper映射文件
<?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.jt.mapper.UserMapper">
<!--基于别名包完成自动的映射 -->
<!--<select id="findAll" resultType="User">
select * from user
</select>-->
<!--用户入库操作 -->
<insert id="insertUser" >
insert into user(id,name,age,sex)
values(null,#{name},#{age},#{sex})
</insert>
<!--以后再映射对象时,只需要编辑类名称即可.
当需要映射时会根据别名包的定义进行路径的拼接.
-->
<!-- <select id="findAll" resultType="User">
select * from user
</select> -->
<!--自定义映射关系 -->
<!-- <resultMap type="User" id="userRM">
主键定义
<id column="user_id" property="userId"/>
<result column="user_name" property="userName"/>
<result column="user_age" property="userAge"/>
<result column="user_sex" property="userSex"/>
</resultMap> -->
<!--
表名 user
字段:
user_id
user_name
user_age
对象 User
属性:
userId
userName
userAge
问题: 数据库中的字段,与对象中的属性名称不一致,
所以利用resultType无法实现赋值.
-->
</mapper>
4.4 编辑主启动类
//表示定义主启动类
@SpringBootApplication
@MapperScan("com.jt.mapper") //为mapper接口创建代理对象
public class SpringBootRun {
public static void main(String[] args) {
SpringApplication.run(SpringBootRun.class,args);
}
}
4.5 编辑测试类
/**
* SpringBoot测试类写法
* 1.测试类的包路径必须位于主启动类包路径的子孙包
* @author tarena
*
*/
@SpringBootTest //springBoot容器启动时加载测试类的配制
@RunWith(SpringRunner.class)
public class TestSpringBoot {
@Autowired
private UserMapper userMapper;
/**
* 1.查询user表的记录
*/
@Test
public void testFind() {
List<User> userList = userMapper.findAll();
System.out.println(userList);
System.out.println("获取代理对象的类型:"+userMapper.getClass());
}
/**
* mybatis新增user
*/
@Test
public void insertUser() {
User user = new User();
user.setId(null).setName("孙扬")
.setAge(25).setSex("爷们");
userMapper.insertUser(user);
System.out.println("入库成功!!!!");
}
}
4.6 编辑Service
@Service
public class UserServiceImpl implements UserService {
//接口实例化: 1.创建实现类 2.创建代理对象 JDK CGLIB
//原则: 如果代理对象有接口则使用JDK代理
// 如果代理者没有实现接口 则使用cglib代理
@Autowired
private UserMapper userMapper;
@Override
public List<User> findAll() {
return userMapper.findAll();
}
}
4.7 编辑Controller
@RestController
public class UserController {
@Autowired
private UserService userService;
//用户通过localhost:8090/findAll获取用户数据
@RequestMapping("/findAll")
public List<User> findAll(){
return userService.findAll();
}
}