整合Mybatis
整合包:mybatis-spring-boot-starter
<!--mybatis:整合【非官方】-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
- xxx-spring-boot-starter【非官方格式】
- 官方格式:spring-boot-starter-xxx
配置数据库的依赖
spring:
datasource:
username: root
password: 1234
url: jdbc:mysql://localhost:3306/springboot?serverTimezone=UTC&useUnicode=ture&characterEncoding=utf-8
driver-class-name: com.mysql.cj.jdbc.Driver
写个测试类试试看能否成功
@SpringBootTest
class Springboot05MybatisApplicationTests {
@Autowired
DataSource dataSource;
@Test
void contextLoads() throws SQLException {
System.out.println(dataSource.getClass());
System.out.println(dataSource.getConnection());
}
}
编写pojo包下的类和mapper包下的接口
mapper包下的接口要加@mybatis注解
-
【根据mybatis-spring-boot-starter文档得知—>点击跳转】
-
这个注解表示了这是一个mybatis的mapper
-
相当于以前spring整合mybatis的mapper接口,要去扫描
-
原来的做法:
-
在Springboot05MybatisApplication类上加**@MapperScan**(“xxx”)注解
-
创建一个扫描包(路径下的所有mapper就被扫描进去了)
-
@SpringBootApplication @MapperScan("com.kami.mapper") public class Springboot05MybatisApplication { public static void main(String[] args) { SpringApplication.run(Springboot05MybatisApplication.class, args); } }
-
-
-
推荐mapper包下接口加@mybatis注解
Dao层要加@Repository
//这个注解表示了这是一个mybatis的mapper类
//Dao
@Mapper
@Repository
public interface EmployeeMapper {
//查询所有员工
List<Employee> queryEmployeeList();
//查询一个员工
Employee queryEmployeeById(int id);
//添加员工
int addEmployee(Employee employee);
//修改员工
int updateEmployee(Employee employee);
//删除员工
int deleteEmployee(int id);
}
编写mybaits配置文件
需要在resources
—>springboot(数据库名字)
—>mapper
下创建xml文件
- 不能配置和注解一起用
去mybatis中文文档找配置内容
入门
—>映射语句
<?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="org.mybatis.example.BlogMapper">
<select id="selectBlog" resultType="Blog">
select * from Blog where id = #{id}
</select>
</mapper>
修改EmployeeMapper.xml的配置内容
-
namespace绑定
-
绑定后写sql
- 直接写不会被识别,需要写别名和该xml文件能被识别
-
需要去yaml配置文件中,整合mybatis【重点】
-
mybatis: # 整合mybatis type-aliases-package: com.kami.pojo # 整合别名 mapper-locations: classpath:springboot/mapper/*.xml
-
classpath相当于resources且后面用的是
:
-
-
整合完就可以用了
- #{id}相当于id=?
<?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.kami.mapper.EmployeeMapper">
<select id="queryEmployeeList" resultType="Employee">
select * from employee
</select>
<select id="queryEmployeeById" resultType="Employee">
select * from employee where id = #{id}
</select>
<insert id="addEmployee" parameterType="employee">
insert into employee(id, last_name, email, gender, department) values(#{id}, #{last_name}, #{email}, #{gender}, #{department});
</insert>
<update id="updateEmployee" parameterType="employee">
update employee set last_name = #{last_name}, gender = #{gender} where id = #{id}
</update>
<delete id="deleteEmployee" parameterType="int">
delete from employee where id = #{id}
</delete>
</mapper>
- 注:不用JDBC用Mybatis的原因是sql定制度更高
编写一个controller类测试
EmployeeController类
//会在页面上显示
@RestController
public class EmployeeController {
@Autowired
private EmployeeMapper employeeMapper;
@GetMapping("/queryEmployeeList")
public List<Employee> queryEmployeeList(){
List<Employee> employees = employeeMapper.queryEmployeeList();
for (Employee employee : employees) {
System.out.println(employee);
}
return employees;
}
@GetMapping("/addEmployee")
public int addEmployee(){
Employee employee = new Employee();
employee.setLast_name("kuangshen");
employee.setEmail("qinjiang@qq.com");
employee.setGender(1);
employee.setDepartment(106);
employee.setBirth(new Date());
return employeeMapper.addEmployee(employee);
}
// 通过id获得员工信息
@GetMapping("/queryEmployeeById/{id}")
public Employee queryEmployeeById(@PathVariable("id") Integer id){
return employeeMapper.queryEmployeeById(id);
}
//通过id修改员工
@GetMapping("updateEmployee")
public int updateEmployee(){
Employee employee = new Employee();
employee.setId(1006);
employee.setLast_name("kuang");
employee.setGender(0);
return employeeMapper.updateEmployee(employee);
}
// 通过id删除员工
@GetMapping("/deleteEmployee/{id}")
public int delete(@PathVariable("id") Integer id){
return employeeMapper.deleteEmployee(id);
}
}
自己去整合前面写的项目springboot_03_web项目【复制到了】
一、在数据库中按照pojo对应设置一个实体类
二、将mybatis整合进来【导包】
三、yaml配置文件中的数据源的JDBC和整合mybatis
四、编写sql
-
由于查询所有用户时候有多个id,就需要起别名,就要用到resultMap,而不是resultType了
-
EmployeeMapper.xml中resultMap的作用【Mybatis中ResultMap的作用】
-
主要用于解决实体类属性名与数据库表中字段名不一致的情况下,解决将查询结果映射成实体对象。
-
column 数据表的列名或者标签别名。
-
property 需要映射到JavaBean 的属性名称。
-
<resultMap id="EmployeeMap" type="Employee"> <id property="id" column="eid"/> <result property="lastName" column="last_name"/> <result property="email" column="email"/> <result property="gender" column="gender"/> <result property="birth" column="birth"/> <association property="eDepartment" javaType="Department"> <id property="id" column="did"/> <result property="departmentName" column="dname"/> </association> </resultMap>
-
-
#{}和${}的使用
- resultMap和ParameterMap书写拼写要使用#{},resultType 和parameterType类型使用${}
- #{}:?具有预编译效果
- ${}:不具有预编译效果
- 当页面向后台传递一个列名(属性名)的时候,是不希望被预编译出一个?的,此时要用到$格式
-
五、解决maven中资源过滤问题【在我们使用Maven构建项目的时候,会默认过滤掉静态资源,所以,需要手动来配置】
-
在pom.xml中的build中添加如下代码
-
<resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> <filtering>true</filtering> </resource> </resources>
六、业务逻辑层【service】调用数据访问层【dao】
七、视图层【controller】调用业务逻辑层【service】
深入理解MVC和三层架构
- M:数据(Dao——[用Mybatis后称为mapper切要加@Mapper注解])与业务(Service)与实体类(pojo,JavaBean,domain)
- C:交接(Controller——[Servlet])
- V:HTML,thymeleaf(就可以不用jsp了)