02-框架--Mybatis
1.为什么要学习Mybatis框架
Mybatis是持久层框架
JDBC缺点:
1、操作的复杂度偏高
2、数据的查询结果集处理繁琐
3、sql硬编码,sql和java代码混合写了
Mybatis:
1、需要配置文件
2、直接把查询结果集的数据映射到实体类属性中
3、把所有的sql统一的在文件中进行编写映射文件xxx.xml
2. 运行流程
配置文件+sqlsession及其封装(不分内容需要改动,比如数据库名字)
<?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"> <!-- MyBatis 的核心配置文件,它是整个 MyBatis 框架的"总指挥",负责配置 MyBatis 的全局行为和数据库连接信息 --> <configuration> <!--在控制台打印sql语句的配置--> <settings> <!-- 打印sql日志 --> <setting name="logImpl" value="STDOUT_LOGGING" /> </settings> <!-- 别名设置 ,设置完之后再EmpMapper里面的parameterType直接等于emp--> <typeAliases> <!-- 实体类:bean、pojo、entity、domain --> <!-- 指定包下面的所有类型都可以指定别名 ,默认是实体类名首字母小写--> <package name="org.example"/> </typeAliases> <!--配置数据库--> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.cj.jdbc.Driver"/> <!--jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC--> <property name="url" value="jdbc:mysql://localhost:3306/tongda_88_95?serverTimezone=UTC"/> <property name="username" value="root"/> <property name="password" value="123456"/> </dataSource> </environment> </environments> <mappers> <mapper resource="EmpMapper.xml"/> <mapper resource="DeptMapper.xml"/> </mappers> </configuration>package org.example; 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 java.io.IOException; import java.io.InputStream; //是对GetSqlSession的封装,二者作用一致,MybatisUtil更便捷 /** * @Author: Administrator * @Date: 2026/8/8 * @Description: */ public class MybatisUtil { public static SqlSession getSqlSession() { SqlSession sqlSession = null; try { InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml"); //SqlSessionFactory SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //默认不提交事务 true:提交事务 sqlSession = sqlSessionFactory.openSession(true); } catch (IOException e) { throw new RuntimeException(e); } return sqlSession; } }3. Mybatis实现基本的CRUD操作
3.1增加
<!--添加员工 为了防止sql注入,把?用#{}替换 标签、标签的属性、内部sql parameterType:必须要写入自己的包名:org.example然后写上.Emp--> <insert id="addEmp" parameterType="emp"> insert into emp values (#{EMPNO},#{ENAME},#{JOB},#{MGR}, #{HIREDATE},#{SAL},#{COMM},#{DEPTNO}) </insert>@Test public void add() { SqlSession sqlSession = MybatisUtil.getSqlSession(); Emp emp = new Emp(); emp.setEMPNO("6666"); emp.setENAME("王力"); emp.setJOB("扫厕所"); emp.setMGR("7782"); emp.setHIREDATE("2010-10-10"); emp.setSAL("20000"); emp.setCOMM("100"); emp.setDEPTNO("30"); //参数一: namespace.id的值 //参数二:实际传入的参数 sqlSession.insert("emp.addEmp", emp); }3.2删除
<!--删除,一般根据主键来删除--> <!--parameterType可以写string和int string==java.lang.String int==int --> <delete id="deleteEmp" parameterType="java.lang.String"> delete from emp where EMPNO=#{EMPNO} </delete>@Test public void text03(){ SqlSession sqlSession = MybatisUtil.getSqlSession(); Emp emp = new Emp(); sqlSession.delete("emp.deleteEmp", "6666"); }3.3修改(更新)
<!--修改,除了主键以外的数据都需要写上,此为小测试可忽略--> <update id="updateEmp" parameterType="emp"> update emp set JOB=#{JOB} where ENAME="王力" </update>@Test public void text02(){ SqlSession sqlSession = MybatisUtil.getSqlSession(); Emp emp = new Emp(); emp.setJOB("敲代码"); sqlSession.update("emp.updateEmp", emp); }3.4查找
3.4.1单个查询
<!--查询单个,查找(根据主键查询),resultType写表名,并且必须写,parameterType可以省略--> <select id="queryById" parameterType="emp" resultType="emp"> select*from emp where EMPNO=#{EMPNO} </select>@Test public void text04(){ SqlSession sqlSession = MybatisUtil.getSqlSession(); Emp emp=sqlSession.selectOne("emp.queryById", "6666"); System.out.println(emp); }3.4.2全部查询
<!--查询所有,查找(根据主键查询)--> <select id="queryAll" parameterType="emp" resultType="emp"> select*from emp </select>@Test public void text05(){ SqlSession sqlSession = MybatisUtil.getSqlSession(); List<Emp> emps= sqlSession.selectList("emp.queryAll"); for (Emp emp : emps) { System.out.println(emp); } }3.4.3模糊查询
<!--模糊查询(直接写#{ENAME} '%'的话二者中间必须要空格,所以改用concat),查找(根据主键查询)--> <select id="queryLike" parameterType="emp" resultType="emp"> select*from emp where ENAME like concat(#{ENAME},'%') </select>@Test public void text06(){ SqlSession sqlSession = MybatisUtil.getSqlSession(); List<Emp> emps= sqlSession.selectList("emp.queryLike","S"); for (Emp emp : emps) { System.out.println(emp); } }3.5注意事项
1、需要手动配置在控制台打印sql
2、什么是Statement
3、参数列表如果是类类型,可以指定别名,parameterType该属性可以不用写
4、#{}:等同于PS中的?占位符 {实体类中对应属性的属性名}
5、resultType属性不能少,如果是集合类型,只需要写出集合对应的泛型类型
4. Mybatis代理开发
4.1. 包结构
4.2. 条件
条件:
1、映射文件中的namespace必须是mapper接口的类路径
2、statement的id的值必须和mapper接口中对应的方法的名字要一致
3、statement的parameterType类型必须和接口中对应的方法的参数类型一致
4、statement的resultType类型必须和接口中对应方法的返回值类型一致
