目录
1.简介
啥子是mybatis?
-
一款优秀的持久层框架,用于简化JDBC开发
持久层:负责将数据保存到数据库的那一层代码
啥子又是持久层?
在javaEE的开发中,几乎都是基于B/S架构开发.B/S架构包括:表现层,业务层(service),持久层(dao)
2.基于全注解的MyBatis快速入门
1.导入相关的依赖
2.建表
3.编写application.yml配置文件,删除原来的property文件
包含连接数据的核心信息
4.编写实体类(pojo包下),属性和表中字段一一对应
5.创建接口(mapper包下),用来写方法
6.测试
可以先测试是否链接成功,不报错就是成功!
打印成功啦!
3.基于配置文件的mybatis快速入门
1-4步和全注解开发一样的,不说了.
5.创建接口(mapper)写方法
6.配置application.yml文件
7.配置核心文件
每一个实体类对应一个mapper映射文件,在resources资源包下创建mapper文件里面创建sql的映射文件.Mapper.xml
在核心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">
8.测试一下
文件结构
4.简易的增删改方法
1.在接口定义增删改的方法
2.在xml配置文件编sql语句
<insert id="add" >
insert into t_user values (#{id},#{username},#{password})
</insert>
<update id="update">
update t_user set password=#{password},username=#{username} where id=#{id}
</update>
<delete id="delete">
delete from t_user where id=#{id}
</delete>
3.测试执行代码
@Test
void add(){
User user = new User(2,"法外狂徒","李四");
int add = userXmlMapper.add(user);
System.out.println(add>0?"插入成功":"");
}
@Test
void Update(){
User user = new User(2, "张三", "法外狂徒");
int updata = userXmlMapper.update(user);
System.out.println(updata>0?"更新成功":"");
}
@Test
void delete(){
int delete = userXmlMapper.delete(2);
System.out.println(delete>0?"删除成功":"");
}
5.根据条件id查询
/*
* 查询id=2的数据
* */
List<User> selectId(int id);
<select id="selectId" resultType="com.zkwf.mybatis.pojo.User">
select * from t_user where id=#{id}
</select>
@Test
void selectId(){
List<User> users = userXmlMapper.selectId(2);
System.out.println(users);
}
6.关于*.xml里面的占位符"#{}"和"${}"
1、#{}占位符是为了获取值,通常在where语句后。
2、若在Sql代码中语句为select * from users where id=#{id},执行后自动翻译为select * from users where id=?。这就相当于JDBC中的PreparedStatement预编译阶段,可以有效的防止Sql注入。
3、#{}里如何写,看parameterType参数的类型。如果parameterType的类型是简单类型(8种基本(封装)+String),则#{}里随便写;如果是实体类的类型,则#{}里只能是类中成员变量的名称,而且区分大小写。
4、${}字符串用于拼接或字符串替换。一般用于模糊查询中,建议少用,因为有Sql注入的风险。同样分两种情况:如果parameterType的类型是简单类型,则${}里随便写,但是分版本,如果是3.5.1及以下的版本,只能写value;如果是实体类的类型,则${}里只能是类中成员变量的名称(现在已经少用)。
7.@Param参数注解(指定参数名)
可增强代码的可读性
/*
* 使用@Param注解增强可读性
* */
List<User> selectParam(@Param("zhanghu") String username);
<select id="selectParam" resultType="com.zkwf.mybatis.pojo.User">
select * from t_user where username=#{zhanghu}
</select>
@Test
void selectParam(){
List<User> s = userXmlMapper.selectParam("郭靖");
s.forEach(System.out::println);
}
8.动态sql
什么是动态sql?
sql语句的内容是变化的,可以根据条件获取不同的sql语句.
如何实现?
动态sql的实现利用的是mybatis提供的标签实现的.
使用场景?
例如:我在使用淘宝进行商品筛选时,我选择了价格区间,选择了牌子,选择了颜色等等进行筛选时,静态sql查询不出来的,使用动态sql就可以很轻松的解决这个问题.
if标签
1.if标签里的test属性是必须有的
2.test属性里面的值是false或者true,if是false就不拼接是true就拼接
3.如果使用@Param注解指定的参数名,test里面出现就是自己指定的参数名
4.如果没有使用@Param那么就是实体类的属性名
5.连接的最前面使用1=1,防止第一个条件不存在出现sql语句错误
select * from t-user and id=?这种情况 很明显这里不能有and
/*
* 多条件动态sql查询
* */
List<User> selectIf(@Param("ID") Integer id,@Param("USERNAME") String username,@Param("PASSWORD") String password);
<select id="selectIf" resultType="com.zkwf.mybatis.pojo.User">
select * from t_user where
1=1
<if test="ID!=null and ID!=''">
and id=#{ID}
</if>
<if test="USERNAME!=null and USERNAME!=''">
and username=#{USERNAME}
</if>
<if test="PASSWORD!=null and PASSWORD=''">
and password=#{PASSWORD}
</if>
</select>
@Test
void selectIf(){
List<User> users = userXmlMapper.selectIf(1, "令狐冲", null);
users.forEach(System.out::println);
}
where标签
上面的代码还有一种情况就是所有的条件都不存在,那么where标签会保证不会出现where子句.
测试一下
set标签
主要使用在update语句中,用于生成set关键字,同时去掉最后的多余的","
如果提交的数据为空则不更新.
9.foreach标签
foreach标签的属性:
collection:指定数组或者集合
item:代表数组或集合中的元素
separator:循环之间的分隔符
open:在标签先添加的符号
close:在标签后添加的符号
1.批量删除
/*
* 批量删除
* */
int delectBatch(@Param("ids") int[] id );
<delete id="delectBatch" >
delete from t_user where id in
<foreach collection="ids" item="aaa" separator="," open="(" close=")">
#{aaa}
</foreach>
</delete>
@Test
void delectBatch(){
int[] ids={3,4};
int i = userXmlMapper.delectBatch(ids);
System.out.println(i>0?"删除成功":"删除失败");
}
2.批量添加
/*
* 批量插入,集合实现
* */
int addBatch(@Param("users") List<User> user);
<insert id="addBatch">
insert into t_user values
<foreach collection="users" item="user" separator=",">
(#{user.id},#{user.username},#{user.password})
</foreach>
</insert>
10.高级查询(多表查询)
一.多对一
建立学生表和班级表,一个班级有多个学生
首先建立如下表结构:
建立对应的实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Student { //Student是多的一方
private Integer sid;
private String sname;
private Class aClass;//aClass是一的一方
}
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
//教室类
public class Class {
private String cid;
private String cname;
}
新建一个mapper接口,写方法
@Mapper
public interface StudentXmlMapper {
/*
* 根据id获取学生的所有信息,包括关联的信息
* */
Student selectById(Integer sid);
}
编写xml文件
二.一对多
一对多的实现一般是在一的一方添加List集合属性.
在实体类Class上添加List<Student> xxx属性.
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
//教室类
public class Class {
private String cid;
private String cname;
private List<Student> studentList;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Student { //Student是多的一方
private Integer sid;
private String sname;
private Class aClass;//aClass是一的一方
}
/*
* 一对多,获取1001班的所有学生信息
* */
Class selectByClassId(String cid);
测试一哈