一、mybatis基于注解定义SQL语句
员工类
@Data
@NoArgsConstructor//无参
@AllArgsConstructor//有参
public class Emp {
private Integer id;//id
private String username;//用户名
private String password;//密码
private String name;//姓名
private Short gender;//性别 : 1男 ; 2女
private String image;//图片
private Short job;//职务 1班主任 ,2讲师 ,3学工主管 ,4教师主管 ,5咨询师
private LocalDate entrydate;//入职日期
private Integer deptId;//部门ID
private LocalDateTime createTime;//创建时间
private LocalDateTime updateTime;//修改时间
EmpMapper接口类
① 根据ID删除数据
//代理
@Mapper//说明程序在运行时会自动创建该接口的代理对象,并将这个对象放入IOC容器当中
public interface EmpMapper {
/**
* 根据ID删除数据
* @param id
*/
@Delete("delete from emp where id = #{id}")
//#{ }占位符号 ---来动态获取delete()方法传入的参数,在预编译是会用‘?’占位,
// 如:delete from emp where id = ?(该类型就为预编译SQL)
//优点:性能更高 ;更安全(防止SQL注入)
//#{id}拼接符号 ---若id = 1,则预编译的时候会将id直接拼接成“id = 1”,
//如 delete from emp where id = 1
//使用占位符,会生成预编译的SQL语句
public void delete(Integer id);
// public int delete(Integer id);
//返回值代表的是:影响的记录数,因为删除操作已经执行了,所以这次方法的返回值为0
② 插入员工数据
/**
* 插入员工数据
*/
@Options(useGeneratedKeys = true , keyProperty = "id")//将自动生成的主键值,赋值给emp对象的id属性
//useGeneratedKeys = true ----代表要拿到生成记录的主键值
//keyProperty = "id" -----获取到的主键最终会封装到 emp.id 属性当中
@Insert("insert into emp(username, name, gender, image, job, entrydate, dept_id, create_time, update_time)" +
"value(#{username},#{name},#{gender},#{image},#{job},#{entrydate},#{deptId},#{createTime},#{updateTime})")
public void insert(Emp emp);
③更新数据
/**
* 更新数据
*/
@Update("update emp set username =#{username} , name = #{name},gender = #{gender}," +
"job = #{job},image = #{image},entrydate = #{entrydate},dept_id = #{deptId},update_time = #{updateTime} where id = #{id}")
public void update(Emp emp);
④根据ID查询员工
/**
* 根据ID查询员工
*/
@Select("select * from emp where id = #{id}")
public Emp getID(Integer id);
解决类的属性名与表的字段名不对应问题:
针对查询过程中,类的属性名与表的字段名(如类createTime,表中字段create_time)不一致,导致查询部分数据丢失(create_time = null)
方案三(推荐):打开自动映射
/*针对类的属性名与表的字段名不一致,导致部分数据丢失 =====> 解决方案*/
//方案三(推荐):开启mybatis的驼峰命名自动映射开关 dept_id ====>deptId(自动映射)
//在application.properties文件中配置
//=====================================================================
application.properties文件:
#开启mybatis的驼峰命名自动映射开关
mybatis.configuration.map-underscore-to-camel-case=true
方案一:起别名
//方案一:给被查询表中不一致的字段名(dept_id,create_time,update_tome)起别名,别名与实体类属性一致
/* @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 getID(Integer id);*/
方案二:通过@Results,@Result注解,手动映射封装
//方案二:通过@Results,@Result注解,手动映射封装
/*@Results({
@Result(column = "dept_id",property = "deptId"), //dept_id ---> deptId
// 表中字段名 类中属性名
@Result(column = "create_time",property = "createTime"),
@Result(column = "update_time",property = "updateTime")
})
@Select("select * from emp where id = #{id}")
public Emp getID(Integer id);*/
模糊查询中的字符拼接问题
⑤条件查询员工信息(模糊查询)
占位符:${} 为拼接作用 #{}为占位符(预编译阶段用?占位)
方式一:${ }
/**
* 条件查询员工信息
*/
//方式一:
//预编译'%张%'
@Select("select * from emp where name like '%${name}%' and gender = #{gender} and " +
//%${name}%' 这里用$直接拼接,因为#{}会在预编译是用?代替,而''引号中不能出现?
"entrydate between #{entryTimeStart} and #{entryTimeEnd} order by update_time desc;")
public List<Emp> list(String name , Short gender , LocalDate entryTimeStart , LocalDate entryTimeEnd);
方式二:concat 字符串拼接函数-----预编译过程中('%',?,'%')【推荐】
//方式二:
//concat 字符串拼接函数-----预编译concat('%',?,'%')【推荐】
@Select("select * from emp where name like concat('%',#{name},'%') and gender = #{gender} and " +
"entrydate between #{entryTimeStart} and #{entryTimeEnd} order by update_time desc;")
public List<Emp> list(String name , Sh ort gender , LocalDate entryTimeStart , LocalDate entryTimeEnd);
测试类
@SpringBootTest
class SpringbootMybatisCrudApplicationTests {
@Autowired
private EmpMapper empMapper;
/**
* ①根据ID删除数据
*/
@Test
public void testdelete(){
empMapper.delete(17);
/* int delete = empMapper.delete(17);
System.out.println(delete);*/
System.out.println("==================================");
}
/**
* ②插入员工数据
*/
@Test
public void testInsert(){
//构造员工对象
Emp emp = new Emp();
emp.setUsername("Tom03");
emp.setName("汤姆03");
emp.setGender((short)1);
emp.setImage("1.jpg");
emp.setJob((short)1);
emp.setEntrydate(LocalDate.of(2005,1,1));
emp.setDeptId(1);
emp.setCreateTime(LocalDateTime.now());
emp.setUpdateTime(LocalDateTime.now());
//执行新增员工信息操作
empMapper.insert(emp);
System.out.println(emp.getId());
System.out.println("==================================");
}
/**
* ③更新员工信息
*/
@Test
public void testUpdate(){
Emp emp = new Emp();
emp.setId(18);
emp.setUsername("Tom02");
emp.setName("汤姆02");
emp.setGender((short)1);
emp.setImage("1.jpg");
emp.setJob((short)1);
emp.setEntrydate(LocalDate.of(2005,1,1));
emp.setDeptId(1);
emp.setUpdateTime(LocalDateTime.now());
//执行更新操作
empMapper.update(emp);
System.out.println("==================================");
}
/**
* ④根据ID查询员工信息
*/
@Test
public void testGetID(){
Emp emp = empMapper.getID(21);
System.out.println(emp);
//Emp(id=21, username=Tom03, password=123456, name=汤姆03, gender=1, image=1.jpg,
// job=1, entrydate=2005-01-01, deptId=null, createTime=null, updateTime=null)
//查询返回的对象其中deptId=null, createTime=null, updateTime=null都为null
/*原因是emp表中对应的字段名为dept_id等均包含下划线,故此三个字段名与emp类封装的对象属性名不一致
* */
System.out.println("==================================");
}
/**
*⑤条件查询员工信息
*/
@Test
public void testList(){
List<Emp> empList = empMapper.list("张",(short)1,LocalDate.of(2010,1,1),LocalDate.of(2020,1,1));
System.out.println(empList);
}
}
二、XML配置文件的形式来定义SQL语句
=========================================================================
XML映射文件
规范
①XML映射文件的名称与Mapper接口名称一致,并且将XML映射文件和Mapper接口放置在相同包下(同包同名)。
②XML映射文件的namespace属性为Mapper接口全限定名一致。
③XML映射文件中sql语句的id与Mapper接口中的方法名一致,并保持返回类型一致。
=========================================================================
⑤条件查询员工信息(模糊查询)
EmpMapper.xml配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 2、XML映射文件的namespace属性为Mapper接口全限定名一致。-->
<mapper namespace="com.it.mapper.EmpMapper">
<!--3、XML映射文件中sql语句的id与Mapper接口中的方法名一致,并保持返回类型一致。-->
<!--resultSetType:单条记录所封装的类型-->
<select id="list" resultType="com.it.mapper.pojo.Emp"> <!-- 如果是查询,是有返回值的-->
select * from emp where name like concat('%',#{name},'%') and gender = #{gender} and
entrydate between #{entryTimeStart} and #{entryTimeEnd} order by update_time desc;
</select>
</mapper>
测试类
/**
*⑤条件查询员工信息
*/
@Test
public void testList(){
List<Emp> empList = empMapper.list("张",(short)1,LocalDate.of(2010,1,1),LocalDate.of(2020,1,1));
System.out.println(empList);
}
标签:XML,name,配置文件,gender,time,id,emp,SQL,public
From: https://blog.csdn.net/yangjiale629/article/details/142633563