目录
前言:
这一篇博文的延续上一篇的。只是使用mybatis的注解形式。相对来说注解形式和xml形式是有一些不同的。在之前学习的时候就遇到了一个小坑。
开发环境:
win10+IntelliJ IDEA +JDK1.8
springboot版本:springboot 1.5.14 ——2.0后的springboot增加了挺多新特性,暂时先不做了解
项目结构:
项目完整案例:
https://github.com/LuckToMeet-Dian-N/springboot_Learn_7
配置文件:
pom.xml文件:
<?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.wen</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
application.properties文件:
spring.datasource.url=jdbc:mysql://localhost:3306/xmsx
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
#日期期时格式设置置
#Format setting for date time
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
数据库表:
用户表:
用于一对多的list表
开始开发:
Mapper层:
package com.wen.test.mapper;
import com.wen.test.vo.Lists;
import com.wen.test.vo.Users;
import org.apache.ibatis.annotations.*;
import java.util.List;
public interface UserMapper {
/**
* 最低级的使用。保持实体属性名和数据库列名一致
*
* @return
*/
@Select("select * from user")
List<Users> findAllUsers();
/**
* 高级一点的操作,
* 实体的属性名可以与数据库列名不一致进行映射
*
* @return
*/
@Results({@Result(id = true, property = "user_id", column = "user_id", javaType = Integer.class),
@Result(property = "phone", column = "phone", javaType = String.class),
@Result(property = "password", column = "password", javaType = String.class)
})
@Select("select * from user")
List<Users> findAllUsers1();
/**
* 注解形式一对多
*
* @param user_id
* @return
*/
@Results({
@Result(id = true, column = "user_id", property = "user_id"),
@Result(column = "phone", property = "phone"),
@Result(column = "password", property = "password"),
@Result(column = "user_id", property = "lists", javaType = List.class,
many = @Many(
select = "com.wen.test.mapper.UserMapper.selectAllByUserId"
)
)
})
@Select("select user.user_id,user.phone,user.password from user where user.user_id=#{user_id}")
Users getUsersAndLists(@Param("user_id") Integer user_id);
/**
* 被引用查询多个对象的方法
*
* @param user_id
* @return
*/
@Select("select list.lists,list.ids from list where list.user_id=#{user_id}")
@Results({
@Result(id = true, column = "ids", property = "id"),
@Result(column = "lists", property = "lists")
})
List<Lists> selectAllByUserId(@Param("user_id") Integer user_id);
/**
* 一对一的话,用的是one =@One()这个注解。。
* 在写一个查询单个的接口。就可以了。。这里就不写了。。持续懒惰中。。。。
*/
}
Controller层:
package com.wen.test.mapper;
import com.wen.test.vo.Lists;
import com.wen.test.vo.Users;
import org.apache.ibatis.annotations.*;
import java.util.List;
public interface UserMapper {
/**
* 最低级的使用。保持实体属性名和数据库列名一致
*
* @return
*/
@Select("select * from user")
List<Users> findAllUsers();
/**
* 高级一点的操作,
* 实体的属性名可以与数据库列名不一致进行映射
*
* @return
*/
@Results({@Result(id = true, property = "user_id", column = "user_id", javaType = Integer.class),
@Result(property = "phone", column = "phone", javaType = String.class),
@Result(property = "password", column = "password", javaType = String.class)
})
@Select("select * from user")
List<Users> findAllUsers1();
/**
* 注解形式一对多
*
* @param user_id
* @return
*/
@Results({
@Result(id = true, column = "user_id", property = "user_id"),
@Result(column = "phone", property = "phone"),
@Result(column = "password", property = "password"),
@Result(column = "user_id", property = "lists", javaType = List.class,
many = @Many(
select = "com.wen.test.mapper.UserMapper.selectAllByUserId"
)
)
})
@Select("select user.user_id,user.phone,user.password from user where user.user_id=#{user_id}")
Users getUsersAndLists(@Param("user_id") Integer user_id);
/**
* 被引用查询多个对象的方法
*
* @param user_id
* @return
*/
@Select("select list.lists,list.ids from list where list.user_id=#{user_id}")
@Results({
@Result(id = true, column = "ids", property = "id"),
@Result(column = "lists", property = "lists")
})
List<Lists> selectAllByUserId(@Param("user_id") Integer user_id);
/**
* 一对一的话,用的是one =@One()这个注解。。
* 在写一个查询单个的接口。就可以了。。这里就不写了。。持续懒惰中。。。。
*/
}
vo层:(实体)
package com.wen.test.vo;
import lombok.Data;
import java.util.List;
@Data
public class Users {
private Integer user_id;
private String phone;
private String password;
/**
* 一对多
*/
private List<Lists> lists;
}
package com.wen.test.vo;
import lombok.Data;
@Data
public class Lists {
private Integer id;
private String lists;
}
测试:
测试一对多:(显示部分,太多不完全截图)
测试列名与实体属性名不一致的方法:
测试列名与实体属性名一致的方法:
总结:
注解形式的开发和jpa等ORM框架都很类似,只是一些注解不同。相信对jpa等orm有经验的同学一下子就可以直接编写了。本次入门案例简化了很多。但是依旧有很多知识点要注意的,当然,最重要的是自己的学习能力。如果实在不了解Mybatis的话,可以去找找学习的博客。最后,注大家学习进步,步步高升。 — —谢谢