目录
[更新员工信息 (U)](#更新员工信息 (U))
前端页面展示提供对于数据的删除操作,后端为其实现
根据id删除数据(D)
-
具体的SQL语句
*sqldelete from emp where id =17;
-
接口方法
*sql@Delete("delete from emp where id =#{id} ") public int DeleteByID(Integer id);
-
测试方法
*java@Test public void testDelete() { int delete = empMapper.DeleteByID(17); System.out.println(delete); }
新增员工数据(C)
-
具体的SQL语句
*sqlinsert into emp (username, name, gender, image, job, entrydate, dept_id, create_time, update_time) VALUES ('法老爷爷', '孙权', 1, '1.jpg', 1, '2021-06-13', 1, now(), now());
-
接口方法
java@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);
- 在Insert()方法中,传入参数enp,则在上述的SQL语句中使用**#{}占位符**,在占位符中填写emp对象中成员变量的名称,就可完成对应数据的传递
-
测试方法
java@Test public void testInsert() { // 设置要插入的员工信息 Emp emp = new Emp(); emp.setUsername("法老爷爷"); emp.setName("孙权"); emp.setImage("1.jpg"); emp.setGender((short) 1); emp.setJob((short) 1); emp.setEntrydate(LocalDate.of(2021, 12, 23)); emp.setCreateTime(LocalDateTime.now()); emp.setUpdateTime(LocalDateTime.now()); emp.setDeptId(1); empMapper.Insert(emp); }
-
主键返回
-
描述:在数据添加成功后,需要获取插入数据库数据的主键
-
实现:在接口中加入对应的注解,然后在测试的方法中获取主键值所在的对应的属性即可
java@Options(useGeneratedKeys = true, keyProperty = "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);
-
该注解是用于与 MyBatis 框架集成的 Java 对象映射(ORM)中的一个配置。它的含义如下:
-
@Options
: 这是一个 MyBatis 注解,用于指定一些选项配置。 -
useGeneratedKeys = true
: 该选项指示 MyBatis 是否应该使用数据库生成的键来填充对象的属性。当插入一条记录时,如果数据库自动生成了一个主键值,设置为true
将使 MyBatis 将该值赋给相应对象的id
属性。 -
总结起来,这个注解表示在执行插入操作时,使用数据库生成的键来填充对象的
id
属性。 -
keyProperty = "id"
: 该选项指定了用于保存生成的键值的对象属性名。在这个例子中,生成的键值将被赋给对象的id
属性。
-
-
测试方法
*java@Test public void testInsert() { // 设置要插入的员工信息 Emp emp = new Emp(); emp.setUsername("法老20"); emp.setName("孙权"); emp.setImage("1.jpg"); emp.setGender((short) 1); emp.setJob((short) 1); emp.setEntrydate(LocalDate.of(2021, 12, 23)); emp.setCreateTime(LocalDateTime.now()); emp.setUpdateTime(LocalDateTime.now()); emp.setDeptId(1); empMapper.Insert(emp); System.out.println(emp.getId()); }
-
运行结果如下
-
-
更新员工信息 (U)
根据主键修改员工信息
-
SQL语句
*sql-- todo 根据主键修改员工信息 update emp set username = '', name='', gender='', image='', job='', entrydate='', dept_id='', update_time='' where id = 1;
-
接口方法
java@Update("update emp\n" + "set username = #{username},\n" + " name=#{name},\n" + " gender=#{gender},\n" + " image=#{image},\n" + " job=#{job},\n" + " entrydate=#{entrydate},\n" + " dept_id=#{deptId},\n" + " update_time=#{updateTime}\n" + "where id = #{id};") public void Update(Emp emp);
-
测试方法
java@Test public void testUpdate() { Emp emp = new Emp(); emp.setId(18); emp.setUsername("TOM"); emp.setName("汤姆"); emp.setGender((short) 1); emp.setImage("1.jpg"); emp.setJob((short) 1); emp.setEntrydate(LocalDate.of(2000, 1, 25)); emp.setUpdateTime(LocalDateTime.now()); emp.setDeptId(1); empMapper.Update(emp); }
查询员工信息(R)
根据id查询
-
SQL语句
*sqlselect id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time from emp where id = 5;
-
接口方法
java@Select("select id,\n" + " username,\n" + " password,\n" + " name,\n" + " gender,\n" + " image,\n" + " job,\n" + " entrydate,\n" + " dept_id,\n" + " create_time,\n" + " update_time\n" + "from emp\n" + "where id = #{id};") public Emp SelectByID(Integer id);
-
测试方法
java@Test public void testSelectByID() { Emp emp = empMapper.SelectByID(5); System.out.println(emp); }
-
运行结果
-
在上述的运行结果中,最后有三个数据为null,但是在数据库中,这三个数据都是有值的,该问题的解决下面会提及
-
MyBatis数据封装
- 实体类属性名和数据库表查询返回的字段名一致,mybatis会自动封装
- 如果实体类属性名和数据库表查询返回的字段名不一致 ,不能自动封装
-
解决方案
- 方案1:给字段起别名,让别名与实体类中属性名一致
java@Select("select id,\n" + " username,\n" + " password,\n" + " name,\n" + " gender,\n" + " image,\n" + " job,\n" + " entrydate,\n" + " dept_id as deptId,\n" + " create_time as createTime,\n" + " update_time as updateTime\n" + "from emp\n" + "where id = #{id};") public Emp SelectByID(Integer id);
-
方案2:如果@Results,@Result注解手动映射封装
java@Results({ // column为字段名,property为对象的属性名 @Result(column = "dept_id", property = "deptId"), @Result(column = "create_time", property = "createTime"), @Result(column = "update_time", property = "updateTime") }) @Select("select id,\n" + " username,\n" + " password,\n" + " name,\n" + " gender,\n" + " image,\n" + " job,\n" + " entrydate,\n" + " dept_id ,\n" + " create_time ,\n" + " update_time \n" + "from emp\n" + "where id = #{id};") public Emp SelectByID(Integer id);
-
运行结果
-
常用方法:开启MyBatis驼峰命名自动映射开关
-
使用该方法必须严格遵守数据库中字段名为a_column,对象中的属性名为aColumn,才可以自动完成映射
-
即自动将a_column字段名封装到aColumn属性名中
-
在配置文件中进行配置
java#数据库连接驱动 spring.datasourde.driver-class-name=com.mysql.cj.jdbc.Driver # 数据库连接url spring.datasource.url=jdbc:mysql://localhost:3306/mybatis # 数据库用户名 spring.datasource.username=root # 数据库用户名密码 spring.datasource.password=123456 # 配置MyBatis日志,指定输出到控制台 mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl # 开启MyBatis的驼峰命名自动映射开关 a_column-->aColumn mybatis.configuration.map-underscore-to-camel-case=true
-
-
条件查询
-
SQL语句
*sqlselect id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time from emp where name like '%张%' and gender = 1 and entrydate between '2010-01-01' and '2020-01-01' order by update_time desc;
-
接口方法
java@Select("select id,\n" + " username,\n" + " password,\n" + " name,\n" + " gender,\n" + " image,\n" + " job,\n" + " entrydate,\n" + " dept_id,\n" + " create_time,\n" + " update_time\n" + "from emp\n" + "where name like '%${name}%'\n" + " and gender = #{gender}\n" + " and entrydate between #{begin} and #{end}\n" + "order by update_time desc;") public List<Emp> List(String name, short gender, LocalDate begin, LocalDate end);
-
测试方法
java@Test public void TestList() { List<Emp> list = empMapper.List("张", (short) 1, LocalDate.of(2010, 01, 01), LocalDate.of(2020, 01, 01)); System.out.println(list); }
-
运行结果
-
在上述的接口方法中,对于名字name的查询条件是模糊查询,使用的是{}占位符,#{}和{}的区别具体参见文章:[详细分析一下 #{}和{}的区别是什么_黄泥川水猴子的博客-CSDN博客](https://blog.csdn.net/qq_40277163/article/details/124756536?ops_request_misc=&request_id=&biz_id=102&utm_term=%E8%AF%A6%E7%BB%86%E4%BB%8B%E7%BB%8D&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-1-124756536.nonecase&spm=1018.2226.3001.4187#%7B%7D%E5%92%8C%7B%7D%E5%8D%A0%E4%BD%8D%E7%AC%A6&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-1-124756536.nonecase "详细分析一下 #{}和${}的区别是什么_黄泥川水猴子的博客-CSDN博客")
但使用上述${}占位符存在性能低、不安全、存在SQL注入问题,解决办法如下
使用MySQL中concat函数(字符串拼接函数)进行解决
示例代码
sql
select concat('hello','MySQL')
运行结果为:
上述示例中接口方法代码改造如下:
运行结果如下