目录
准备环境
配置Mybatis(数据库连接信息)
在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=root
一定要注意数据库的名字和密码是否相同
查询所有用户数据
mapper接口
package com.example.springbootmybatis.mapper;
import com.example.springbootmybatis.Pojo.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import java.util.List;
@Mapper//在运行时,会自动生成该接口的实现类对象(代理对象),并且将该对象交给I0C容器管理
public interface UserMapper {
//查询全部用户信息
@Select("select * from user")
public List<User> list();
}
数据库连接池
是一个容器,负责分配、管理数据库连接(Connection)优势:资源复用、提升系统响应速度
接口:DataSource
产品:C3P0、DBCP、Druid、Hikari
介绍一个数据库连接池
Druid(德鲁伊)
Druid连接池是阿里巴巴开源的数据库连接池项目,功能强大,性能优秀,是Java语言最好的数据库连接池之一
这是坐标,放入pom里👇
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.8</version>
</dependency>
lombok
Lombok是一个实用的Java类库,能通过注解的形式自动生成构造器、getter/setter、equals、hashcode、tostring等方法,并可以自动化生成日志变量,简化java开发、提高效率。
@Getter/@Setter 为所有的属性提供get/set方法
@ToString 会给类自动生成易阅读的 toString 方法
@EqualsAndHashCode 根据类所拥有的非静态字段自动重写 equals 方法和 hashcode 方法
@Data提供了更综合的生成代码功能(@Getter+@Setter+@ToString+@EqualsAndHashCode)为实体类
@NoArgsConstructor 生成无参的构造器方法
@AllArgsConstructor 为实体类生成除了static修饰的字段之外带有各参数的构造器方法。
要想使用lombok还得加入他的依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
删除数据
mapper接口:
package com.example.springbootmybatis.mapper;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface EmpMapper {
//根据ID删除数据
@Delete("delete from emp where id=#{id}")
public void delete(Integer id);
}
测试:
package com.example.springbootmybatis;
import com.example.springbootmybatis.Pojo.User;
import com.example.springbootmybatis.mapper.EmpMapper;
import com.example.springbootmybatis.mapper.UserMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
@SpringBootTest
class SpringbootMybatisApplicationTests {
@Autowired
private EmpMapper empMapper;
@Test
public void testListUser(){
empMapper.delete(17);
}
}
如果mapper接口方法形参只有一个普通类型的参数,#{..}里面的属性名可以随便写,如:#{id}、#{value},但是尽量与形参保持一致
mybatis的日志输出
在application.properties里配置
#配置mybatis的日志,指定输出到控制台
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
这个问号是一个参数占位符,最后在运行的时候会用下面的参数去替代
预编译SQL
优势 :性能更高,更安全(防止SQL注入)
新增操作
mapper接口:
package com.example.springbootmybatis.mapper;
import com.example.springbootmybatis.Pojo.Emp;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface EmpMapper {
//新增员工操作
@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);
}
测试
package com.example.springbootmybatis;
import com.example.springbootmybatis.Pojo.Emp;
import com.example.springbootmybatis.Pojo.User;
import com.example.springbootmybatis.mapper.EmpMapper;
import com.example.springbootmybatis.mapper.UserMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
@SpringBootTest
class SpringbootMybatisApplicationTests {
@Autowired
private EmpMapper empMapper;
@Test
public void testListUser(){
/*empMapper.delete(17);*/
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.insert(emp);
}
}
新增(主键返回)
描述:在数据添加成功后,需要获取插入数据库数据的主键。
在mapper接口中
@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);
更新
mapper接口:
//更新员工
@Update("update emp set username=#{username},name=#{name},gender=#{gender},image=#{image}," +
"job=#{job},entrydate=#{entrydate},dept_id=#{deptId},update_time=#{updateTime} where id=#{id}")
public void update(Emp emp);
}
查询(根据ID查询)
mapper接口:
//根据id查询员工
@Select("select * from emp where id=#{id}")
public Emp getById(int i);
测试
@Test
public void getByIdTest(){
Emp byId = empMapper.getById(20);
System.out.println(byId);
}
数据封装
实体类属性名 和 数据库表查询返回的字段名一致,mybatis会自动封装如果实体类属性名 和 数据库表查询返回的字段名不一致,不能自动封装
可以发现这三个并没有值 ,实体类属性名 和 数据库表查询返回的字段名不一致
可以给字段起别名,让别名与实体类属性一致
//根据id查询员工
@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 getById(int i);
通过@Results,@Result注解手动映射封装
column表示字段名,property表示属性名
@Results({
@Result(column = "dept_id",property = "deptId"),
@Result(column = "create_time",property = "createTime"),
@Result(column = "update_time",property = "updateTime"),
})
@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 getById(int i);
开启mybatis的驼峰命名自动映射开关
在application.properties里配置
#开启mybatis的驼峰命名自动映射开关
mybatis.configuration.map-underscore-to-camel-case=true
查询(条件查询)
其中员工姓名,支持模糊匹配;性别 进行精确查询 ;入职时间 进行范围查询。并对查询的结果,根据最后修改时间进行倒序排序
#{}不能出现在引号中,所以用${}
//条件查询
@Select("select * from emp where name like '%${name}%' and gender =#{gender} and entrydate between #{begin} and #{end} order by update_time desc ")
public List<Emp> Emplist(String name,Short gender, LocalDate begin , LocalDate end);
@Test
public void TestEmpList(){
List<Emp> empList = empMapper.Emplist("张", (short) 1, LocalDate.of(2010, 1, 1), LocalDate.of(2020, 1, 1));
System.out.println(empList);
}
可以用concat字符串拼接函数处理 #{}不能出现在引号中,所以用${}
//条件查询
@Select("select * from emp where name like concat('%',#{name},'%') and gender =#{gender} and entrydate between #{begin} and #{end} order by update_time desc ")
public List<Emp> Emplist(String name,Short gender, LocalDate begin , LocalDate end);
}
XML映射文件
规范
- XML映射文件的名称与Mapper接口名称一致,并且将XML映射文件和Mapper接口放置在相同包下(同包同名)
- XML映射文件的namespace属性为Mapper接口全限定名一致
- XML映射文件中sql语句的id与Mapper接口中的方法名一致,并保持返回类型一致。
MyBatis动态sql
<if>
<if>:用于判断条件是否成立。使用test属性进行条件判断,如果条件为true,则拼接SQL
<where>:where 元素只会在子元素有内容的情况下才插入where子句。而且会自动去除子句的开头的AND 或OR。
<select id="Emplist" resultType="com.example.springbootmybatis.Pojo.Emp">
select *
from emp
<where>
<if test="name!=null">
name like concat('%', #{name}, '%')
</if>
<if test="gender!=null">
and gender = #{gender}
</if>
<if test="begin!=null and end!=null">
and entrydate between #{begin} and #{end}
</if>
</where>
order by update_time desc
</select>
再来看看在更新员工信息时会不会出现报错
mapper.xml映射文件中:
<update id="update2">
update emp
set
<if test="username!=null">
username=#{username},
</if>
<if test="name!=null">
name=#{name},
</if>
<if test="gender!=null">
gender=#{gender},
</if>
<if test="image!=null">
image=#{image},
</if>
<if test="job!=null">
job = #{job},
</if>
<if test="entrydate!=null">
entrydate=#{entrydate},
</if>
<if test="deptId!=null">
dept_id=#{deptId},
</if>
<if test="updateTime!=null">
update_time=#{updateTime}
</if>
where id = #{id}
</update>
测试
@Test
public void testUpdate2(){
Emp emp=new Emp();
emp.setId(18);
emp.setUsername ("Tom111" );
empMapper.update2(emp);
}
这个地方有个逗号
我们可以加个set标签
<update id="update2">
update emp
<set>
<if test="username!=null">
username=#{username},
</if>
<if test="name!=null">
name=#{name},
</if>
<if test="gender!=null">
gender=#{gender},
</if>
<if test="image!=null">
image=#{image},
</if>
<if test="job!=null">
job = #{job},
</if>
<if test="entrydate!=null">
entrydate=#{entrydate},
</if>
<if test="deptId!=null">
dept_id=#{deptId},
</if>
<if test="updateTime!=null">
update_time=#{updateTime}
</if>
</set>
where id = #{id}
</update>
<set>:动态地在行首插入 SET关键字,并会删掉额外的逗号。(用在update语句中)
<foreach>
一般用在批量删除
collection:集合名称
item:集合遍历出来的元素/项
separator:每一次遍历使用的分隔符
open:遍历开始前拼接的片段
close:遍历结束后拼接的片段
<!--批量删除(18,19,20)-->
<delete id="deleteByIds">
delete from emp where id in
<foreach collection="ids" item="id" separator="," open="(" close=")">
#{id}
</foreach>
</delete>
<sql> <include>
<sql>:定义可重用的 SQL 片段。
<include>:通过属性refid,指定包含的sql片段。
以后项目如果要修改字段名的话,会很麻烦
这个时候就可以用<sql> <include>
<sql id="commonSelect">
select id,
username,
password,
name,
gender,
image,
job,
entrydate,
dept_id,
create_time,
update_time
from emp
</sql>
<select id="Emplist" resultType="com.example.springbootmybatis.Pojo.Emp">
<include refid="commonSelect"></include>
Mybatis就先说到这里啦
努力遇见更好的自己!!!