Mybatis操作数据库的步骤:
- 准备工作(创建springboot工程、数据库表user、实体类User)
- 引入Mybatis的相关依赖,配置Mybatis(数据库连接信息)
- 编写SQL语句(注解/XML
1.创建springboot工程,并导入 mybatis的起步依赖、mysql的驱动包
2.在springboot项目中,可以编写application.properties文件,配置数据库连接信息
#驱动类名称
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#数据库连接的url
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis
#连接数据库的用户名
spring.datasource.username=root
#连接数据库的密码
spring.datasource.password=1234
3.在创建出来的springboot工程中,在引导类所在包下,在创建一个包 mapper。在mapper包下创建
一个接口 UserMapper
import com.itheima.pojo.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import java.util.List;
@Mapper
public interface UserMapper {
//查询所有用户数据
@Select("select id, name, age, gender, phone from user")
public List<User> list();
}
4.单元测试
@SpringBootTest
public class MybatisQuickstartApplicationTests {
@Autowired
private UserMapper userMapper;
@Test
public void testList(){
List<User> userList = userMapper.list();
for (User user : userList) {
System.out.println(user);
}
}
}
lombok使用
1在pom.xml文件中引入依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
2.在实体类上添加注解
import lombok.Data;
@Data
public class User {
private Integer id;
private String name;
private Short age;
private Short gender;
private String phone;
}
MybatisCrud
删除操作
接口方法:
@Mapper
public interface EmpMapper {
@Delete("delete from emp where id=#{id}")
public void delect( Integer id);
}
测试方法:
@SpringBootTest
class SpringbootMybatisCrudApplicationTests {
@Autowired //从Spring的IOC容器中,获取类型是EmpMapper的对象并注入
private EmpMapper empMapper;
@Test
public void testDel(){
//调用删除方法
empMapper.delete(16);
}
日志输入:
1. 打开application.properties文件
2. 输入mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
新增操作:
接口实现:
@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 insertEmp(Emp emp);
测试代码:
@Test
public void InEmp(){
Emp emp = new Emp();
emp.setUsername("tom");
emp.setName("汤姆");
emp.setImage("1.jpg");
emp.setGender((short)1);
emp.setJob((short)1);
emp.setEntrydate(LocalDate.of(2000,1,1));
emp.setCreateTime(LocalDateTime.now());
emp.setUpdateTime(LocalDateTime.now());
emp.setDeptId(1);
empMapper.insertEmp(emp);
}
主键返回操作:
@Options(useGeneratedKeys = true,keyProperty = "id")
在insert的接口中插入注解
其中keyProperty="实体类属性名",useGeneratedKeys为true
根据主键id更新数据库
接口的实现:
@Update("update emp set username=#{username},password=#{password},name=#{name},gender=#{gender}," +
"image=#{image},job=#{job},entrydate=#{entrydate},update_time=#{updateTime} where id=22;")
public void updata(Emp emp);
测试类的实现:
@Test
public void updateEmp(){
Emp emp = new Emp();
emp.setUsername("jierui");
emp.setName("杰瑞");
emp.setImage("1.jpg");
emp.setGender((short)1);
emp.setJob((short)1);
emp.setEntrydate(LocalDate.of(2000,1,1));
emp.setCreateTime(LocalDateTime.now());
emp.setUpdateTime(LocalDateTime.now());
emp.setDeptId(1);
empMapper.updata(emp);
}
根据主键查询数据库的信息
接口实现:
@Select("select * from emp where id=#{id};")
public Emp selet(Integer id);
测试类实现:
@Test
public void selEmp(){
System.out.println(empMapper.selet(22));
}
数据封装
实体类属性名和数据库表查询返回的字段名一致,mybatis会自动封装。
如果实体类属性名和数据库表查询返回的字段名不一致,不能自动封装。
解决方案:
# 在application.properties中添加:
mybatis.configuration.map-underscore-to-camel-case=true
条件查询
接口实现:
@Select("select * from emp where name like concat('%',#{name},'%') and gender= #{gender} and entrydate between #{start}" +
" and #{end} order by entrydate desc ;")
public List<Emp> seletPan(String name, Short gender, LocalDate start , LocalDate end);
测试方法:
@Test
public void selectTest(){
List<Emp> emp= empMapper.seletPan("张",(short)1,LocalDate.of(2000,1,1),
LocalDate.of(2010,1,1));
emp.forEach(new Consumer<Emp>() {
@Override
public void accept(Emp emp) {
System.out.println(emp);
}
});
}
注意:使用MySQL提供的字符串拼接函数:concat('%' , '关键字' , '%')防止sql注入的风险
使用XML文件配置sql语句
1.创建XML映射文件:需要与接口同包同名放在resources目录下
2.编写XML映射文件:mybatis中文网下载
3.配置:XML映射文件的namespace属性为Mapper接口全限定名;
XML映射文件中sql语句的id与Mapper接口中的方法名一致,并保持返回类型一致
接口实现:
public List<Emp> seletPan(String name, Short gender, LocalDate start , LocalDate end);
XML文件实现:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itheima.mapper.EmpMapper">
<select id="seletPan" resultType="com.itheima.pojo.Emp">
select * from emp where name like concat('%',#{name},'%') and gender= #{gender} and entrydate between #{start}
and #{end} order by entrydate desc ;
</select>
</mapper>
mybatis动态SQL
if动态sql
XML里面的where语句改写:
<where>
<if test="name != null">
name like concat('%', #{name}, '%')
</if>
<if test="gender != null">
and gender = #{gender}
</if>
<if test="start != null and end != null">
and entrydate between #{start} and #{end}
</if>
</where>
set动态标签用于update操作
动态的在SQL语句中插入set关键字,并会删掉额外的逗号。(用于update语句中)
<if>
用于判断条件是否成立,如果条件为true,则拼接SQL
形式:<if test="name != null"> … </if>
<where>
where元素只会在子元素有内容的情况下才插入where子句,而且会自动去除子句的开头的
AND或OR
<set>
动态地在行首插入 SET 关键字,并会删掉额外的逗号。(用在update语句中)
动态SQL-foreach实现循环控制
标签实现:实现根据员工id删除员工信息:
<delete id="delectEmp">
delete from emp where id in
<foreach collection="list" item="id" separator=","
open="(" close=")">
#{id}
</foreach>
</delete>
参数含义:
<foreach collection="集合名称" item="集合遍历出来的元素/项" separator="每
一次遍历使用的分隔符"
open="遍历开始前拼接的片段" close="遍历结束后拼接的片段">
</foreach>
动态SQL代码复用:
<sql> :定义可重用的SQL片段
<include> :通过属性refid,指定包含的SQL片段
<sql id="reuse" >
delete from emp where id in
</sql>
inchude实现复用
<include refid="reuse">
</include>
<foreach collection="list" item="id" separator=","
open="(" close=")">
#{id}
</foreach>
</delete>