mybatis基于注解、XML配置文件的形式来定义SQL语句

一、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);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值