创建SpringBoot-Mybatis项目
创建新项目,注意Type要选择Maven
Spring Boot的版本没啥硬性要求,一般开开发环境
依赖必选MySQL Driver、MyBatis Framework;
选Spring Web是为了辅助未来的web开发;
Lombok是个人开发习惯。
配置
找到resources下的application.properties,在该文件下配置数据库的四要素(驱动、数据库连接、用户和密码)
#驱动类名称
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#数据库连接的url //使用的时候记得自己改一下mybatis_test指的是要操控数据库的名称
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis_test
#连接数据库的用户名
spring.datasource.username=root
#连接数据库的密码
spring.datasource.password=root
在这里插入代码片
实现
在com.ztt.pojo包下构建实体类Emp,
因为我们有Lombok所以可以通过@Data(生成Getter和Setter方法)@NoArgsConstructor(无参构造)@AllArgsConstructor(全参构造)。
package com.ztt.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDate;
import java.time.LocalDateTime;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Emp {
private Integer id; //用户ID
private String username; // 用户名
private String password; //密码
private String name; //姓名
private Short gender; // 性别
private String image; // 图像的URL
private Short job; //职位
private LocalDate entrydate; //入职时间
private Integer deptId; // 部门ID
private LocalDateTime createTime; //创建时间
private LocalDateTime updateTime; //更新时间
}
com.ztt.mapper下实现接口方法(interface )。
删除数据
直接在EmpMapper下实现Mybatis的删除数据方法,通过@Mapper自动创建接口的代理对象,并将对象装入IOC容器中,在@Delete中写需要SQL语句,利用#{}作为占位符。
@Mapper //自动创建接口的代理对象,并将对象装入IOC容器中
public interface EmpMapper {
// 删除数据
@Delete("delete from emp where id = #{id}")
public int delete(Integer id);
}
删除方法
这里所有方法都包裹在public interface EmpMapper {}
,为了方便这里就不写了
@Options用于主键返回,keyProperty = "id"指的是主键返回到那个参数上,未来可以直接通过 emp.id 在java中查看到主键,同理这里也用#{}占位符。
// 新增员工
@Options(useGeneratedKeys = true,keyProperty = "id") //用于主键返回,返回的主键通过keyProperty控制,并将其返回到emp的ID上
@Insert("insert into emp(username,name,gender,image,job,entrydate,dept_id,create_time,update_time)"+
"values (#{username},#{name},#{gender},#{image},#{job},#{entrydate},#{deptId},#{createTime},#{updateTime});")
public void insert(Emp emp);
更新数据
// 更新数据
@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 update(Emp emp);
查询数据
@Select("select * from emp where id = #{id}")
public Emp getEmpById(Integer id);
这里需要注意,由于数据库中字段名为update_time、dept_id;但是我们上面实现的实体类中名称为updateTime、deptId,上下有不一致的问题。
我们检索到的结果为:emp(id=1, username=jinyong, password=123456, name=金庸, gender=1, image=1.jpg, job=4, entrydate=2000-01-01, deptId=null, createTime=null, updateTime=null)
,可以看到不匹配的位置都是空的。
为了解决上述问题一共有三种解决办法
1.在SQL语言中起别名,来跟我们的实体类对应,完成映射
@Select("select id,username,password,name,gender,image,job,entrydate,dept_id deptId,create_time createTime,update_time updateTime from emp where id = #{id}")
public Emp getEmpById(Integer id);
2.采用封装映射的办法,利用Mybatis中的Results和Result进行映射定义
@Results({
@Result(column = "dept_id",property = "deptId"),
@Result(column = "update_time",property = "updateTime"),
@Result(column = "create_time",property = "createTime")
})
public Emp getEmpById(Integer id);
- 解决方法3 --开启mybatis的驼峰命名自动映射开关,在application.properties中自动配置
我们转到application.properties添加驼峰映射开关:mybatis.configuration.map-underscore-to-camel-case=true
添加完成后SQL语句查找出来的dept_id就会自动映射成deptId,然后我们再使用上面的方法就可以了。
@Select("select * from emp where id = #{id}")
public Emp getEmpById(Integer id);
列表条件查询
@Select("select * from emp where name like concat('%',#{name},'%') and gender = #{gender} " +
"and entrydate between #{begin} and #{end}" +
" order by update_time desc ;")
public List<Emp> selectList(String name, Short gender, LocalDate begin, LocalDate end);