引入
什么是MyBatis?
- MyBatis是一款优秀的持久层框架,用于简化JDBC的开发。
- MyBatis本是Apache的一个开源项目iBatis,2010年这个项目由apache迁移到了google code,并且改名为MyBatis。2013年11月迁移到Github。
- 官网:MyBatis中文网
MyBatis入门
快速入门
-
准备工作(创建SpringBoot工程、数据库表user、实体类User)
-
引入MyBatis的相关依赖,配置MyBatis(数据库连接信息)
-
创建SpringBoot工程时需要勾选依赖(MyBatis Framework与MySQL Driver)
-
在
src-main-resources-xxxx.properties
文件中配置数据库连接信息# 驱动类名称 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver # 数据库连接的url(db01表示所连数据库名) spring.datasource.url=jdbc:mysql://localhost:3306/db01 #连接数据库的用户名 spring.datasource.username=root # 连接数据库的密码 spring.datasource.password=123456
-
配置mapper接口
@Mapper public interface UserMapper{ @Select("select * from user") public List<User>list(); }
-
-
编写SQL语句(注解/XML)
-
默认在mybatis中编写SQL语句是不识别的。可以做如下配置:
(选中)@Select部分——(右键选择)显示上下文操作——(选择)注入语言或引用——(选择)MySQL
-
初次操作可能会报错,需要在Idea中配置MySQL数据库连接
-
JDBC介绍
-
JDBC:(Java DataBase Connectivity),就是使用Java语言操作关系型数据库的一套API
-
mysql依赖
<deoendency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </deoendency>
-
本质
- sun公司官方定义的一套操作所有关系型数据库的规范,即接口。
- 各个数据库厂商去实现这套接口,提供数据库驱动jar包。
- 我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类。
数据库连接池
-
介绍
- 数据库连接池是个容器,负责分配、管理数据库连接(Connection)
- 它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个
- 释放空闲实践超过最大空闲时间的连接,来避免因为没有释放连接而引起的数据库遗漏
-
优势
- 资源重用
- 提升系统响应速度
- 避免数据库连接遗漏
-
标准接口:DataSource
- 官方(SUN)提供的数据库连接池接口,由第三方组织实现此接口。
- 功能:获取连接,
Connection getConnection() throws SQLException;
-
常见产品
-
C3P0
- C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展
-
DBCP
- Apache 旗下 Commons 项目下的一个子项目,提供连接池功能
-
Druid(德鲁伊)
-
Druid连接池是阿里巴巴开源的数据库连接池项目
-
功能强大,性能优秀,是Java语言最好的数据库连接池
-
更换数据库连接池为Druid
# 只需要在项目的pom.xml中加上dependency就可以了 <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.2.8</version> </dependency>
-
-
Hikari(springboot默认)
-
lombok
-
Lombok是一个实用的Java类库,能通过注解的形式自动生成构造器、getter/setter、equals、hashcode、toString等方法,并可以自动化生成日志变量,简化java开发、提高效率
注解 作用 @Getter/@Setter 为所有的属性提供get/set方法 @ToString 会给类自动生成易阅读的toString方法 @EqualsAndHashCode 根据类拥有的非静态字段自动重写equals和hahcode方法 @Data 提供了更为综合的生成代码功能(@Getter+@Setter+@ToString+@EqualsAndHashCode) @NoArgsConstructor 为实体类生成无参的构造器方法 @AllArgsConstructor 为实体类生成除了static修饰的字段之外带有各参数的构造器方法 -
使用需要引入依赖
<dependency> <groupId>org.projectlombok/groupId> <artifactId>lombok</artifactId> </dependency>
-
注意事项
- Lombok会再编译时,自动生成对应的java代码。我们使用lombok时,还需要安装一个lombok的插件(idea自带)。
MyBatis基础操作
-
准备
- 准备数据库表emp
- 创建以恶搞心的springboot工程,选择引入对应的起步依赖(mybatis、mysql驱动、lombok)
- application.properties中引入数据库连接信息
- 创建对应的实体类Emp(实体类属性采用驼峰命名)
- 准备Mapper接口EmpMapper
-
删除
// 接口方法 @Delete("delete from emp where id = #{id}") public void delete(Integer id);
注意事项:如果mapper接口方法形参只有一个普通类型的参数,#{…}里面的属性名可以随便写,如:#{id}、#{value}。
-
插入
// 接口方法 // 主键返回 // 会自动将生成的主键值,赋值给emp对象的id属性 @Options(keyProperty="id",useGeneratedKeys=true) @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);
-
更新
// 接口方法 @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查询
@Select("select * from emp where id=#{id}") public Emp getById(Integer id);
-
数据封装
-
实体类属性名和数据库表查询返回的字段名一致,mybatis会自动封装。
-
如果实体类属性名和数据库表查询返回的字段名不一致,不能自动封装。
解决方法:
-
给字段起别名,让别名誉实体类属性名一致
-
通过
@Results
,@Result
注解手动映射封装//举例 @Results({ @Result(column = "dept_id", property = "deptId"). @Result(column = "create_time", property = "createTime") }) @Select("select * from emp where id=#{id}") public Emp getById(Integer id);
-
开启mybatis的驼峰命名自动映射开关
# 在application.properties文件中加入(例dept_id自动转换为deptID) mybatis.configuration.map-underscore-to-camel-case=true
-
-
条件查询
/* 需求: 1. 名字中带有 张 2. 性别 男 3. 出生日期 在一个区间 */ @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> list(Strin name,Short genden, LocalDate begin, LocalDate end);
-
-
-
XML映射
-
XML映射文件的名称与Mapper接口名称一致,并且将XML映射文件喝Mapper接口防止再相同包下(同包同名)。
-
在resources目录中只能创建目录,创建目录不用.分隔需要用/分隔
-
XML映射文件的namespace属性为Mapper接口全限定名一致。
-
XML映射文件中sql语句的id与Mapper接口中方法名一致,并保持返回类型一致。
-
Mapper接口
@Mapper public interface EmpMapper{ public List<Emp>list(String name, Short gender, LocalDate begin, 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="list" resultType="com.itheima.pojo.Emp"> select * from emp where name like concat('%',#{name},'%') and gender=#{gender} and entrydate between #{begin} and #{end} order by update_time desc </select> </mapper>
-
区别
- **官方解释:**使用注解来映射简单语句会使代码显得更加简洁,但对于稍微复杂一点的语句,Java注解不仅力不从心,还会让你本旧复杂的SQL语句更加混乱不堪。因此,如果你需要做一些很复杂的操作,最好用XML来映射语句。
- 使用Mybatis的注解,主要是来完成一些简单的增删改查功能。如果需要实现复杂的SQL功能,建议使用XML来配置映射语句
-
-
注意事项
-
可以在application.properties中,打开mybatis的日志,并指定输出道控制台
# 指定mybatis输出日志的位置,输出控制台 mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
-
参数占位符
- #{…}
- 执行SQL时,会将#{…}替换为?,生成预编译SQL,会自动设置参数数值。
- 使用时机:参数传递,都使用#{…}
- ${…}
- 拼接SQL。直接将参数拼接在SQL语句中,存在SQL注入问题。
- 使用时机:如果对表名、列表进行动态设置时使用。
- #{…}
-
MyBatis动态SQL
-
介绍
- 随着用户的输入或外部条件的变化而变化的SQL语句,我们称为动态SQL
-
- 用于判断条件是否成立。使用test属性进行条件判断,如果条件为tru,则拼接SQL。
-
-
where元素智慧在子元素由内容的情况下猜插入where子句,而且会自动去除子句的开头的AND或OR。
<select id="list" resultType="com.itheima.pojo.Emp"> select id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time 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> </select>
-
-
- 动态的在行首插入SET关键字,并会删掉额外的逗号。(用在update语句中)
-
-
SQL语句
delete from emp where id in (1,2,3);
-
接口方法
// 批量删除 public void deleteByIds(List<Interger> ids);
-
XMl映射文件
<delete id="deleteByIds"> delete from emp where id in <foreach collection="ids" item="id" separator="," open="(" close=")"> #{id} </foreach> </delete> <!-- collection:集合名称 item:集合遍历出来的元素/项 speparator:每一次便利使用的分隔符 open:遍历开始前拼接的片段 close:遍历结束后拼接的片段 -->
-
-
<mapper> <sql id="use"> .... </sql> <select> <include refid="use" /> </select> </mapper>· <!--将需要多次复用的语句放入sql中,然后可以用include引入-->