Springboot Mybatis操作数据库
Mybatis操作数据库完成增删改查
Mapper接口
package com.wzb.MybatisExercise20240923;
import com.wzb.Pojo20240923.Emp;
import org.apache.ibatis.annotations.*;
@Mapper
public interface EmpMapper {
// 通过Mybatis对数据库内容进行更新
@Update("update emp set username=#{username}, name=#{name}, gender=#{gender}, image=#{image}, job=#{job}, " +
"entrydate=#{entrydate}, dept_id=#{deptId}, update_time=#{updateTime} where id=#{id}")
public void updateEmp(Emp emp);
// 根据不同的字段对数据库进行查询
// 注!@Select必须要有返回值,通常是返回对应属性封装的实例类
// @Select("select id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time" +
// " from emp where id=#{id}")
// public Emp selectEmp(Integer id);
// 发现查询的结果:deptId、createTime、updateTime是没有值的,其全部都是null
// 原因:因为实体类的属性和数据库表查询返回的字段名不一致,无法自动封装(若一致才可以自动封装)
// 解决方案:
// 1.起别名
// 在SQL语句中,对不同的列名起别名,别名和实体类属性名一样
// @Select("select id, username, password, name, gender, image, job, entrydate, dept_id as deptId, " +
// "create_time as createTime, update_time as updateTime from emp where id = #{id}")
// public Emp selectEmp(Integer id);
// 2.结果映射
// 通过@Results和@Result进行手动结果映射
// @Results({@Result(column = "dept_id", property = "deptId"),
// @Result(column = "create_time", property = "createTime"),
// @Result(column = "update_time", property = "updateTime")
// })
// @Select("select id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time " +
// "from emp where id = #{id}")
// public Emp selectEmp(Integer id);
// 3.开启驼峰命名
// 如果字段名与属性名符合驼峰命名规则,mybatis会自动通过驼峰命名规则映射
// 但是,非常需要注意的一点:要使用驼峰命名前提是:实体类的属性与数据库表中的字段名严格遵守驼峰命名。
// 在application.properties中添加:mybatis.configuration.map-underscore-to-camel-case=true
@Select("select id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time" +
" from emp where id=#{id}")
public Emp selectEmp(Integer id);
}
测试类
package com.wzb;
import com.wzb.ConditionSelectExercise20240923.ConditionEmpMapper;
import com.wzb.MybatisExercise20240923.EmpMapper;
import com.wzb.Pojo20240923.Emp;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
@SpringBootTest
class SpringbootExercise20240923ApplicationTests {
// 通过@Mapper和@Autowired实现从IOC容器中自动注入需要的类
@Autowired
private EmpMapper empMapper;
@Autowired
private ConditionEmpMapper ce;
// 更新数据库的函数
@Test
public void updateEmp() {
Emp emp = new Emp();
// 注:想要更改哪条数据,就直接将新的对象的id值设置成想要更改的id值
emp.setId(19);
emp.setUsername("songdaxia");
emp.setPassword(null);
emp.setName("老宋");
emp.setImage("2.jpg");
emp.setGender((short)1);
emp.setJob((short)2);
emp.setEntrydate(LocalDate.of(2012,1,1));
emp.setCreateTime(null);
emp.setUpdateTime(LocalDateTime.now());
emp.setDeptId(2);
empMapper.updateEmp(emp);
}
// 按照id在数据库查找的函数
// @Test
// public void selectEmp() {
// Emp emp = empMapper.selectEmp(19);
// System.out.println(emp);
// }
// 条件查询
@Test
// LocalDate.of()方法是会返回一个对应的LocalDate对象的
public void selectEmp() {
List<Emp> empList = ce.selectEmp("张", (short)1, LocalDate.of(2010, 1, 1),
LocalDate.of(2020, 1, 1));
System.out.println(empList);
}
}
Pojo
package com.wzb.Pojo20240923;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDate;
import java.time.LocalDateTime;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Emp {
private Integer id;
private String username;
private String password;
private String name;
private Short gender;
private String image;
private Short job;
private LocalDate entrydate; //LocalDate类型对应数据表中的date类型
private Integer deptId;
private LocalDateTime createTime;//LocalDateTime类型对应数据表中的datetime类型
private LocalDateTime updateTime;
}