前端页面展示提供对于数据的删除操作,后端为其实现
delete from emp where id =17;
@Delete("delete from emp where id =#{id} ")
public int DeleteByID(Integer id);
@Test
public void testDelete() {
int delete = empMapper.DeleteByID(17);
System.out.println(delete);
}
insert 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());
接口方法
@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对象中成员变量的名称,就可完成对应数据的传递
测试方法
@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);
}
主键返回
描述:在数据添加成功后,需要获取插入数据库数据的主键
实现:在接口中加入对应的注解,然后在测试的方法中获取主键值所在的对应的属性即可
@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
属性。 @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());
}
运行结果如下
-- todo 根据主键修改员工信息
update emp
set username = '',
name='',
gender='',
image='',
job='',
entrydate='',
dept_id='',
update_time=''
where id = 1;
接口方法
@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);
测试方法
@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);
}
select id,
username,
password,
name,
gender,
image,
job,
entrydate,
dept_id,
create_time,
update_time
from emp
where id = 5;
接口方法
@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);
测试方法
@Test
public void testSelectByID() {
Emp emp = empMapper.SelectByID(5);
System.out.println(emp);
}
运行结果
@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注解手动映射封装
@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属性名中
在配置文件中进行配置
#数据库连接驱动
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
select 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;
接口方法
@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 List(String name, short gender, LocalDate begin, LocalDate end);
测试方法
@Test
public void TestList() {
List list = empMapper.List("张", (short) 1, LocalDate.of(2010, 01, 01), LocalDate.of(2020, 01, 01));
System.out.println(list);
}
运行结果
在上述的接口方法中,对于名字name的查询条件是模糊查询,使用的是${}占位符,#{}和${}的区别具体参见文章:详细分析一下 #{}和${}的区别是什么_黄泥川水猴子的博客-CSDN博客
但使用上述${}占位符存在性能低、不安全、存在SQL注入问题,解决办法如下
使用MySQL中concat函数(字符串拼接函数)进行解决
示例代码
select concat('hello','MySQL')
运行结果为:
上述示例中接口方法代码改造如下: