Mybatis 快速入门程序
1.准备工作(创建springboot项目,实体类User,数据库表User)
2.引入Mybatis的相关依赖,配置Mybatis(数据库连接信息如下)
#驱动类名称
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=
3. 编写sql语句 (注解/xml)
@Mapper
//在运行时,会自动生成该接口的实现类对象(代理对象),并且会将该对象交给ioc容器管理
public interface UserMapper{
//这是一个接口 然后执行SQL语句
@Select("select * from user")
public List<User> list();
}
4.单元测试 (查询所有用户信息)
@SpringBootTest
class SpringbootMybatisQuickstart1ApplicationTests{
@Autowired
//进行依赖注入
private UserMapper userMapper;
@Test
public void test1(){
List<User> userList = userMapper.list();
//利用stream流的方式进行遍历输出
userList.stream().forEache(user->{
System.out.println(user);
});
}
}
jdbc是sum公司提供的一套操作关系型数据库的api(规范)(接口) ,需要各个厂商自己提供实现(驱动)(jar包),真正实现的代码是驱动里的实现类。
数据库连接池
切换Druid数据库连接池,添加配置文件到pom.xml即可
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.8</version>
</dependency>
Lombok
一个实用的Java类库,通过注解的形式自动生成构造器,并可以自动化生成日志变量,简化Java开发、提高效率。
Lombok会在编译时,自动生成对应的Java代码。可以在package下找到自编译的代码。
基于注释 使用SQL语句进行增删改查
根据主键删除
sql语句:
delete from emp where id = 17;
接口方法:
这里使用到了mybatis中的参数占位符 #{ },其中参数就是传进去的参数。
注意:如果mapper接口方法形参只有一个普通类型的参数, #{ ...}里面的属性名可以随便写,如:#{id}、#{abc}..,因为这个接口传入的参数只有一个参数,只能给这一个占位符,但是建议是名称保持一致。
@Delete("delete from emp where id = #{id}")
public void delete(Inter id);
预编译
性能更高;更安全(防止sql注入)
SQL注入:通过操作输入的数据来修改事先定义好的SQL语句,以达到执行代码对服务器进行攻击的方法。
譬如:
预编译会将输入作为一整个字符串从而预防SQL注入。占位符会先用?代替。
一般使用#占位符。
新增
接口方法
@insert("insert into emp (username,name,gender,image,job,entrydata,dept_id,create_time,update_time)"+"values(#{username},#{name},#{gender},#{image},#{jod},#{entrydate},#{depId},#{createTime},#{updateTime})")
public void insert(Emp emp);
注意: 属性名都是驼峰命名的,注意表格中为下划线的需要做出更改,不要写成字段型;
当需要传入的参数过多时候,可以封装成一个参数,然后再从中获取,例子中恰好有Emp这样一个实体类。
新增(主键返回)
在数据添加成功后,需要获取插入数据库数据的主键 。
如:添加套餐数据时,还需要维护套餐菜品关系表数据。
实现就是在上述新增代码前加上一行代码
@Options(keyProperty = "id ", userGeneratedKeys=true) //会自动将生成的主键值,赋值给emp对象的id属性
更新
和新增一样,先确定需要填写的SQL语句,然后编写接口方法,合理使用实体对象,在测试类里创建测试方法,在其中构造更新过的员工对象,执行更新员工信息操作(一开始自动注入生成了empmapper即bean实现类对象,直接调用update方法即可)
根据ID查询员工
在Mapper接口中添加方法
// 根据ID查询员工
//查询是有返回值的
@Select("select *from emp where id = #{id} ")
public Emp getById(Interger id);
在测试类中定义test方法
@Test
public void testGetById(){
Emp emp= empMapper.getById(20);
// 使用empMapper的getById方法,然后得到其Emp类型的返回值
System.out.println(emp);
}
数据封装
实体类属性名和数据库表查询返回的字段名一致,mybatis会自动封装。
如果实体类属性名和数据库表查询返回的字段名不一致,不能自动封装。
这里由于字段名具有下划线,而实际变量名使用驼峰命名,两者不一致,不能实现自动封装,故有以下的解决方案。
方案一和方案二过于臃肿,一般不使用。
方案三:在application.properties 配置文件中添加配置
查询(条件查询)
由于like模糊匹配,需要在name这个字段前后加上百分号,所以这一块是一个字符串,但是在字符串中是不可以有#{ }的,所以改为${ },$是字符串拼接符号,生成的不是预编译的sql。
为了解决不安全的问题,使用concat 字符串拼接函数。
譬如:concat ('a','b','c') 拼接得到的字符串就是abc
XML映射文件
使用mybatis的注解,主要是来完成一些简单的增删改查功能。如果需要实现复杂的SQL功能,建议使用xml来配置映射语句。
Mybatis动态SQL
随着用户的输入或外部条件的变化而变化的SQL语句
<if> 标签
用于判断条件是否成立。使用test属性进行条件判断,如果条件为true,则拼接SQL。
譬如以下代码:
但是有问题,如果有条件不成立,可能会多与一个and或者是where,所以使用<where>标签。
<where>标签
where元素只会在子元素有内容的情况下才插入where子句。而且会自动去除子句的开头的AND或OR。
<if test = "name !=null">
name like concat('%',#{name},'%')
</if> // 注意这里没有分号作为结束符
<set>标签
可以将所有的更新字段进行包裹,可以去除字段之后多余的逗号。
<foreach>标签
sql语句
delete from emp where id in (1,2,3);
接口方法
// 批量删除
public void deleteByIds(List <Integer> ids);
XML映射文件
<delete id = "deleteByIds">
delete from emp where id in
<foreach collection = "ids" itea = "id" separator ="," open ="(" close =")" >
#{id}
</foreach>
</delete>
foreach 属性
<include>标签
通过属性refid,指定包含的SQL片段
<sql>标签
定义可重用的SQL片段