spring boot 尚桂谷学习笔记10 数据访问02 mybatis
数据访问 mybatis
创建一个 springboot 工程,模块选择 sql 中 mysql(数据驱动), jdbc(自动配置数据源), mybatis Web模块中选择 web
pom 引入:
<dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.2</version> </dependency>
pom依赖关系图:也可以不引入jdbc 模块 mybatis依赖该模块
创建基本的环境:参照上一章节 (数据源druid 等配置)
新加入表 employee 并且设置 department 一起开机启动执行
DROP TABLE IF EXISTS `employee`; CREATE TABLE `employee` ( `id` int(10) NOT NULL, `lastName` char(20) DEFAULT NULL, `email` char(50) DEFAULT NULL, `gender` smallint(1) DEFAULT NULL, `d_id` int(10) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
yum 配置文件如下:
spring: datasource: password: 101022li username: root url: jdbc:mysql://192.168.10.129:3306/mybatis driver-class-name: com.mysql.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource initialSize: 5 minIdle: 5 maxActive: 5 maxWait: 60000 timeBetweenEvictionRunsMillis: 60000 minEvictableIdletimeMillis: 300000 validationQuery: SELECT 1 FROM DUAL testWhileIDle: true testOnBorrow: false testOnReturn: false poolPreparedStatements: true # 配置监控系统拦截的filters 去掉后监控界面sql无法统计 wall 用于防火墙 filters: stat,wall,log4j # maxPoolPreparedStatmentPerConnectionSize: 20 # useGlobalB # 配置执行sql目录下的sql schema: - classpath:sql/department.sql - classpath:sql/employee.sql
设置 employee bean 以及 department bean 设置好 get set 方法
employee private Integer id; private String lastName; private Integer gender; private String email; private Integer did; department private Integer id; private String departmentName;
注解版:
创建一个mapper文件
package com.lixuchun.springboot.mapper; import com.lixuchun.springboot.bean.Department; import org.apache.ibatis.annotations.*; // 这是一个操作数据库的mapper @Mapper public interface DepartmentMapper { @Select("select * from department where id=#{id}") public Department getDepartmentById(Integer id); @Delete("delete from department where id=#{id}") public Integer deleteDeptById(Integer id); @Options(useGeneratedKeys = true, keyProperty = "id") @Insert("insert into department(departmentName) values(#{departmentName})") public Integer insertDept(Department department); @Update("update department set departmentName=#{departmentName} where id=#{id}") public Integer updateDept(Department department); }
创建一个 controller 文件:
package com.lixuchun.springboot.Controller; import com.lixuchun.springboot.bean.Department; import com.lixuchun.springboot.mapper.DepartmentMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; @RestController public class DeptController { @Autowired DepartmentMapper departmentMapper; @GetMapping("/dept/{id}") public Department getDeptment(@PathVariable("id") Integer id) { return departmentMapper.getDepartmentById(id); } @GetMapping("/dept") public Department insertDept(Department department) { departmentMapper.insertDept(department); return department; } }
浏览器访问:
localhost:8080/dept/2 查询deptId=2 的 部门信息
localhost:8080/dept?departmentName=coding1 插入部门信息 研发部 正常查询插入
问题:当前 数据库cloum 字段名称和类中字段名称相同 如果不同情况下处理流程如下:
将 数据库中 departmentName 列名 修改成 department_name
对应 mapper 文件中 @Select @Insert 两个sql 注释方法中 修改列名称
查询发现 localhost:8080/dept/2 只能查询出 id 名称查询不出来 不能映射
新建一个 MybatisConfig 类 进行mybatis配置:configurationCustomizer
package com.lixuchun.springboot.config; import org.apache.ibatis.session.Configuration; import org.mybatis.spring.boot.autoconfigure.ConfigurationCustomizer; import org.springframework.context.annotation.Bean; @org.springframework.context.annotation.Configuration public class MybatisConfig { @Bean public ConfigurationCustomizer configurationCustomizer() { return new ConfigurationCustomizer() { @Override public void customize(Configuration configuration) { // 开启驼峰命名规则 configuration.setMapUnderscoreToCamelCase(true); } }; } }
每一个mapper 类中 都有 @mapper 注解 如果有多个 mapper类非常麻烦
可以在启动类 使用 @MapperScan注释进行批量扫描配置,代替@mapper 注释-》 Springboot06DataMybatisApplication:
@MapperScan(value = "com.lixuchun.springboot.mapper") @SpringBootApplication public class Springboot06DataMybatisApplication { public static void main(String[] args) { SpringApplication.run(Springboot06DataMybatisApplication.class, args); } }
配置文件版:
http://www.mybatis.org/mybatis-3/zh/index.html mybatis 参考文档
配置yum 配置文件 新增 mybatis 配置内容
# mybatis 配置 mybatis: config-location: classPath:mybatis/mybatis-config.xml mapper-locations: classPath:mybatis/mapper/EmployeeMapper.xml
在resource 文件夹下创建 mybatis/mapper 文件夹 并且创建 EmployeeMapper.xml 以及 Mybatis-config.xml 配置文件
EmployeeMapper.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="com.lixuchun.springboot.mapper.EmployeeMapper"> <!-- public Employee getEmployeeById(Integer id); public void insertEmployee(Employee employee); --> <select id="getEmployeeById" resultType="com.lixuchun.springboot.bean.Employee"> SELECT * FROM employee WHERE id=#{id} </select> <insert id="insertEmployee"> INSERT INTO employee(lastName, email, gender, d_id) VALUES (#{lastName}, #{email}, #{gender}, #{dId}) </insert> </mapper>
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> <settings> <setting name="mapUnderscoreToCamelCase" value="true"/> </settings> </configuration>
EmployeeMapper.java 文件内容
package com.lixuchun.springboot.mapper; import com.lixuchun.springboot.bean.Employee; import org.apache.ibatis.annotations.Mapper; @Mapper public interface EmployeeMapper { public Employee getEmployeeById(Integer id); public void insertEmployee(Employee employee); }
DeptController 内容增加 employee 访问
@Autowired EmployeeMapper employeeMapper; @GetMapping("/emp/{id}") public Employee getEmployeeById(@PathVariable("id") Integer id) { Employee employee = employeeMapper.getEmployeeById(id); System.out.println(employee.getLastName()); return employee; }
访问 localhost:8080/emp/1 正常返回json结果