MyBatis是一款优秀的持久层框架,用于简化JDBC的开发。
负责将数据保存到数据库的那一层代码叫做持久层
mybatis快速入门
在pom文件中导入坐标
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.9</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
<dependency>
<groupId>org.junit</groupId>
<artifactId>junit-bom</artifactId>
<version>5.8.2</version>
<scope>test</scope>
</dependency>
</dependencies>
在resources中创建xml文件
一个logback.xml 一个mybatis-config.xml 一个xxxMapper.xml
编写mybatis核心配置文件mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="已经定义的文件Mapper.xml"/>
</mappers>
</configuration>
编写SQL映射文件mapper.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="对应的类">
<select id="selectBlog" resultType="Blog">
select * from Blog where id = #{id}
</select>
</mapper>
定义pojo类
并写使用类
用alt+鼠标左键 整列编辑从sql中复制的代码,形成定义变量,格式化完成后alt+insert选中所有属性完成get set的方法,然后自动添加一个tostring方法
在文件同级写一个类Mybatis_demo
在main中写此代码 加载mybatis核心配置文件,并获得sqlsessionfactory
String resource = "org/mybatis/example/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory =new SqlSessionFactoryBuilder().build(inputStream);
获取sqlsession对象,用它来执行SQL语句
SqlSession sqlSession=sqlSessionFactory.openSession();
执行SQL
执行语句:类 对象 = sqlsession.方法;
释放资源;
Mapper代理开发
目的是解决原生方式中的硬编码,简化后期执行SQL
方式:
1定义与SQL映射文件同名的Mapper接口,并且将Mapper接口和SQL映射文件放置在同一目录下
其实就是现在java中创建Mapper接口,再在resources中创建同名的Mapper文件,将resources中和Mapper接口同名的映射文件加入这个文件。
2设置SQL映射文件的namespace属性为Mapper接口全限定名
就是将上述映射文件的xml中的namespace值改写成Mapper接口的目录文件名。
3在Mapper接口中定义方法,方法名就是sql映射文件中SQL语句的id,并保持参数类型和返回值类型一致
4编码:通过sqlsession的getMapper方法获取Mapper接口的代理对象,调用对应方法完成SQL的执行。
Mybatis核心配置文件
再pojo中配置要使用的表的类格式化为驼峰命名
配置mybatisxml文件
配置文件完成增删改查
完成Mybatis功能的三个步骤:
1、编写接口方法 编写Mapper接口
参数:???
结果:List< Brand > 对象
2、通过插件生成sql映射文件,并编写语句
3、执行方法
查询所有功能
ps:brand类已经在pojo中使用驼峰命名格式完成
1、`package com.itheima.mapper;
import java.util.List;
public interface BrandMapper {
public List<Brand> selectAll();
}
`
2、`<?xml version="1.0" encoding="UTF-8" ?>
<select id="selectAll" resultType="brand">
select *
from stu;
</select>
`
3、`package com.itheima.test;
import com.itheima.mapper.BrandMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.testng.annotations.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class MybatisTest {
@Test
public void testSelectAll() throws IOException {
//获取参数
//封装参数
//获取sqlsession
String resource = "org/mybatis/example/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//获取sqlsession对象
SqlSession sqlSession=sqlSessionFactory.openSession();
//获取mapper接口代理对象
BrandMapper brandMapper=sqlSession.getMapper(BrandMapper.class);
//执行方法
List<BrandMapper> brands = BrandMapper.selectAll();
System.out.println(brands);
//释放资源
sqlSession.close();
}
}
`
当我们测试了测试类以后,发现使用驼峰命名的行列字段与数据表的命名有出入,因此打印出的东西的值变成了null。
为了解决这个问题,我们手动设置,第一个方案是对不一样的类名起别名sth as sth,第二个方案是在外面设置SQL片段日后可以引用。然而这两者都有比较大的局限性,因此我们使用resultmap来解决,
查看详情
流程与上述类似
不过在Mapper接口中返回的类型变成了brand,增加参数id,
在映射文件中参数传递使用#{} id=占位符#{id}。防止sql注入。
parameterType:用于设置参数类型
SQL语句中特殊字符处理:1、转义字符2、cdata
条件查询
三种不同的参数接受方式
1、散装参数: 多参数要注解@param(“字段名”) 类型 字段名,
2、实体类封装的参数 类名 对象
3、map集合参数 new一个hashmap ,对每一个键值进行打印排列
编写SQL语句:使用=等值连接,模糊查询时使用like,并且所有参数都使用#{}连接。
动态条件查询(条件查询的优化)
SQL语句会随着外部输入的变化而变化,我们称之为动态SQL
动态SQL书写语法表
多条件sql动态
使用多条件if的时候在前面添加where 1=1可以防止报错,或者使用< where >将if包裹起来
单条件sql动态
使用choose when
为了保底也就是用户一个都不选的时候使用otherwise。
添加
在释放资源之前需要提交事务
sqlSession.commit();
主键返回:
在数据获取成功后需要获取添加的主键的值。
在insert中添加属性值即可。
修改
1、修改全部字段
与添加测试语法相似
2、修改动态字段
需要改写映射文件中的sql语句,使用< if >包裹对应传值
删除
删除一个使用标准代码进行void deleteById(id)
批量删除void deleteByIds(@param(“ids”) int[]ids)
注解开发
(适合简单的功能)