目录
①实体类与注解映射器一样(不过目录名从entity改为po)
②java接口文件中不需要写注解,只需要写方法(多了@Repository)
一、映射器:
Mybatis的核心组件,在其中可以配置各类SQL语句和动态SQL、缓存、级联等内容
二、实现方式:
①java接口(interface)+注解(简单SQL)
②java接口(interface)+XML文件(简单和复杂SQL都可)
推荐使用java接口+xml文件方式实现映射器
三、注解实现映射器
①创建与表对应的实体类
src→java→com.xxx下创建文件类entity,在entity中创建java类
规则:
1)实体类名对应表名
2)类中的属性名与表中的列一致
3)属性数据类型与列的数据类型匹配
注:使用idea数据库链接工具来生成实体类
idea右侧选中数据库,在弹出的工具栏中,新建→数据源→MYSQL→设置驱动程序、host、port、用户名、密码、数据库名→测试连接→成功后点击应用并确认(设置完数据源后,如果找不到想要的数据库,点击旁边的1of10添加)
在数据库工具栏中选中想要生成的表→右键→脚本扩展→转到脚本目录→左侧项目结构中找到Generate POJOs grovy→将G。。文件中的packageName属性值改为实体类文件的目录的路径→回到脚本扩展中选择Generate POJOs groovy→选中实体类目录→确认
②生成公共访问方法
右键→Generate→Getter and Setter→选中要生成方法的属性
作用:因为数据库结构要保密,对应的实体类属性为私有属性无法直接访问,所以要提供公共的访问方式。通过公共访问方法可以设置或者获取pojo中的值,比如使用mapper方法从数据库取出News实体类的pojo对象然后使用getTitle()或者getDate()方法获取值或者像下面的test类那样创建News实体对象然后使用setTitle()和getDate()方法设置对象的值。
package com.example.demo3.entity;
public class News {
private String title;
private String date;
private String content;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
③创建java接口文件
在entity同级目录下创建mapper,并在mapper中新建接口类(interface),添加方法和注解
④生成并编写测试类
方法:在mapper接口文件中用鼠标选中目标方法,按下ctrl+shift+T或者选中public interface xxx然后在左侧的黄灯泡中选择创建测试→选择你想要生成测试的方法
注:
①生成的文件在src→test→java→com.xxx→mapper下
②不能在src目录中使用@Test来创建test类
生成后,编写测试类,并运行方法(save())
运行结果:
四、XML文件实现映射器
注意:mapper是接口文件,xml放在resources中,application.properties中设置映射文件目录
①实体类与注解映射器一样(不过目录名从entity改为po)
②java接口文件中不需要写注解,只需要写方法(多了@Repository)
package com.example.demo3.mapper;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
@Repository //将数据访问层(DAO)层的类标识为 Spring Bean,
// 如果在mybatis-config的xml文件中配置过base-package 了就可以不写这个
@Mapper
public interface NewsMapper {
String getnews(String title);
}
③创建xml文件目录并配置路径
在resources中创建mappers文件夹→在application.properties中设置映射文件目录
④编写xml文件
1)先添加规范(固定内容)
<?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">
2)接口中方法的具体实现(举例)
- <mapper>标签
①namespace:写要绑定的mapper接口的全路径名称,这样mybatis会自动将你的mapper接口文件和xml文件连起来
②在<mapper>标签中写接口文件中的方法的具体实现
- 常见标签
<select>、<updata>、<delete>、<insert>
标签中可以直接使用SQL语句(因此可以先在数据库可视化软件中编写可执行的SQL语句,然后直接复制到标签中)
注:在MyBatis中insert、update、delete语句的返回值可以是Integer、Long和Boolean。是在接口文件中写,不要再xml中写
- 常见属性
①id:此段SQL执行语句对应的接口方法名称
②parameterType:接口方法传入的参数类型
③resultType:接口方法定义的返回值参数类型
注:parameterType和resultType的参数类型:
⑴基本类型:int、Integer、double、String等
⑵pojo对象(实体类对象):例如:para...="com.xxx.entity.News"
⑶Map类型
(4)数据有很多条时。比如:从数据库中提取很多条数据,返回的结果是list类型时,此时resultType(parameterType)的值仍然写成resu....="com.xxx.entity.News",而不是写成resu...="java.util.List",对应接口方法类型List<News>。因为resultType(parameterType)是集合中的元素类型,而不是集合本身
(5)多个不同的参数:mybatis parametertype 多个参数
- #{}和${}:
相同:都可以接收ParameterType传入的值。例title=#{title},第一个是数据库中的属性,第二个title是传入的参数
不同:#{}是预编译处理,给传入的数据加个“”
${}是直接替换
例:value=001 #{value}="001" ${value}=001
注:①${}不能防止sql注入,而#{}能。
例:select * from user where id = ${value} 若用户传的value是001;drop table user,这
样就直接把表删了
②${}可以用在模糊查询中
id like '%${value}%'(%是任意字符,_是一个任意字符)
- 注:使用mapper接口方式必须满足:
1.映射文件的namespace的值必须是接口的全路径名称
比如:com.sxt.dao.UserMapper
2.接口中的方法名在映射文件中必须有一个和id值对应
3.映射文件的名称必须与接口的名称一致
五、DTO
①作用:对页面和数据库间传输的数据进行封装,提供定制化服务
②原理:一张表有很多属性,而客户端只对部分属性有要求,因此将数据全部来回传输,即浪费时间和带宽又会暴露表的结构和重要数据(密码等)。而创造一个类(DTO,与PO类似)只封装客户端需要的属性,就可以避免这种问题。
注:
1)每个操作都应该有个DTO,但这样DTO就会爆炸增长,因此开发者一般复用冗余数据可以接受的DTO,而不是建很多DTO。
2)DTO的内容可以和PO相同,但不可以继承PO,他们应该独立
3)PO不可以用来传输,应该建立一个和PO内容相同的DTO
不是严格的企业开发的话,可以降低上述要求,甚至不使用DTO
六、动态SQL
①作用:使用jdbc时,会遇到多条件的情况,比如:查询人可用姓名、id、备注等,当id为空时使用姓名作为查询条件。若使用拼接的SQL语句会非常复杂,因此mybatis提供了动态SQL。
②常用标签(写在<insert>等标签里的标签):
<if>、<where>、<trim>、<set>、<foreach>、<choose>
具体写法自查
③注:
1)在xml中,<用<表示,其他不变(>、=)
2)test=“xxx”中的属性可以直接取值,不需要#{}
3)判断属性值为空:test="xxx !=null and xxx != ''(双单引号无空格)"
七、关联映射
①作用:用于SQL表中的连接查询
②步骤:(一对一映射,以dept(ename,...,deptno)和emp(deptno,dname,...)为例)
1)编写表连接的SQL语句
select e.name, d,name
from emp e, dept d
where e.deptno = d.deptno
2)在DTO中添加关联表的映射对象(从表类创建主表类的对象,外键引用的是主表)
public class Emp{
emp的属性
private Dept dept;
emp的getter and setter
}
3)xml中编写映射关系,配置列与类中的属性的对应关系,使用<resultMap>标签
<resultMap id="empMap" type="com.xxx.Dto.Emp">
<id column="empno" property="empno"/>(主键)
<result column="..." property="..."/>
....................
<!--其他类的属性和列-->
<association property="dept" javaType="com.xxx.Dto.Dept/">
<id.....>
<result...>
</association>
</resultMap>
4)编写select节点
<select id="..." resultMap="empMap" para.....>
....
</select>
③以上是一对一,一对多类似(类中多加个对象、xml中多写个<asso...>)
八、MybatisX(下载方法自查)
作用:基于 IDEA 的快速开发插件,用于快速制作Mapper映射器。
功能:java接口和xml之间跳转、自动生成xml、检查错误
九、分页插件
mybatis的插件,使用pom添加依赖