Mybatis
基本使用
- 创建工具类来构造SqlSessionFactory
| public class MybatisUtil { |
| |
| |
| private static SqlSessionFactory sqlSessionFactory; |
| static { |
| try { |
| sqlSessionFactory = new SqlSessionFactoryBuilder().build(new FileInputStream("mybatis-config.xml")); |
| } catch (FileNotFoundException e) { |
| e.printStackTrace(); |
| } |
| } |
| |
| |
| |
| |
| |
| |
| public static SqlSession getSession(boolean autoCommit){ |
| return sqlSessionFactory.openSession(autoCommit); |
| } |
| } |
| |
- main方法更简单
| package com.test; |
| |
| import com.test.Util.MybatisUtil; |
| import com.test.mapper.TestMapper; |
| import org.apache.ibatis.session.SqlSession; |
| |
| import java.awt.print.Book; |
| import java.util.List; |
| |
| public class Main { |
| public static void main(String[] args) { |
| MybatisUtil.getSession(true).getMapper(TestMapper.class).selectStudent().forEach(System.out::println); |
| } |
| } |
| |
| |
- entity.Student
| package com.test.entity; |
| |
| |
| import lombok.Data; |
| |
| @Data |
| public class Student { |
| int sid; |
| String name; |
| String sex; |
| int grade; |
| } |
| |
| |
- mapper.TestMapper.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.test.mapper.TestMapper"> |
| <select id="selectStudent" resultType="com.test.entity.Student"> |
| select * from book_manage.student |
| </select> |
| </mapper> |
- mapper.TestMapper
| package com.test.mapper; |
| |
| import com.test.entity.Student; |
| |
| import java.awt.print.Book; |
| import java.util.List; |
| |
| public interface TestMapper { |
| List<Student> selectStudent(); |
| } |
| |
- 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="com.mysql.cj.jdbc.Driver"/> |
| <property name="url" value="jdbc:mysql://localhost:3306/book_manage"/> |
| <property name="username" value="root"/> |
| <property name="password" value="123456"/> |
| </dataSource> |
| </environment> |
| </environments> |
| <mappers> |
| <mapper resource="com/test/mapper/TestMapper.xml"/> |
| </mappers> |
| |
| |
| </configuration> |
| |
起别名
-
Student.java
| @Alias("MiKu") |
| public class Student { |
| int sid; |
| String name; |
| String sex; |
| int grade; |
| } |
mybatis-config.xml
| <typeAliases> |
| <package name="com.test.entity"/> |
| </typeAliases> |
TestMapper.xml
| <mapper namespace="com.test.mapper.TestMapper"> |
| <select id="selectStudent" resultType="MiKu"> |
| select * from book_manage.student |
| </select> |
| </mapper> |
- mybatis-config.xml
| <!-- 需要在environments的上方 --> |
| <typeAliases> |
| <typeAlias type="com.test.entity.Student" alias="Student"/> |
| </typeAliases> |
| |
TestMapper.xml
| <mapper namespace="com.test.mapper.TestMapper"> |
| <select id="selectStudent" resultType="Student"> |
| select * from book_manage.student |
| </select> |
| </mapper> |
- mybatis-config.xml
| <typeAliases> |
| <package name="com.test.entity"/> |
| </typeAliases> |
TestMapper.xml
| <select id="selectStudent" resultType="student"> |
| select * from book_manage.student |
| </select> |
增
| <insert id="addStudent" > |
| insert into student(name,age) values (#{name},#{age}) |
| </insert> |
| int addStudent(Student student); |
| System.out.println(mapper.addStudent(new Student().setName("白牛").setAge(88))); |
删
| <delete id="deleteStudent"> |
| delete from student where id = #{id} |
| </delete> |
| int deleteStudent(int id); |
| System.out.println(mapper.deleteStudent(16)); |
改
| <update id="updateStudent"> |
| update student |
| set name=#{name},age=#{age} |
| where id = #{id} |
| </update> |
| int updateStudent(Student student); |
| System.out.println(mapper.updateStudent(new Student(2,"cat",999))); |
查
| <select id="selectStudentById" resultType="Student"> |
| select * from student where id = #{id} |
| </select> |
| Student selectStudentById(int id); |
| System.out.println(mapper.selectStudentById(3)); |
用Map映射
| <resultMap id="Test" type="Student"> |
| <result column="id" property="age"/> |
| <result column="name" property="name"/> |
| <result column="age" property="id"/> |
| </resultMap> |
| <select id="selectStudent" resultType="Map"> |
| select * from student |
| </select> |
| List<Student> selectStudent(); |
| mapper.selectStudent().forEach(System.out::println); |
构造器问题
一个类中存在多个构造方法,会报错
| <resultMap id="Test" type="Student"> |
| <constructor> |
| <arg column="id" javaType="int"/> |
| <arg column="name" javaType="String"/> |
| </constructor> |
| </resultMap> |
| |
| <select id="selectStudent" resultMap="Test"> |
| select * from student |
| </select> |
| @Data |
| @Accessors(chain = true) |
| public class Student { |
| |
| public Student(Integer id, String name) { |
| this.id = id; |
| this.name = name; |
| } |
| |
| int id; |
| String name; |
| int age; |
| |
| |
| } |
驼峰命名
数据库是下划线命名,java是驼峰命名,可以进行转换
| <settings> |
| <setting name="mapUnderscoreToCamelCase" value="true"/> |
| </settings> |
下划线命名 -> 驼峰命名
事务操作
| SqlSession session = MybatisUtil.getSession(false); |
| session.rollback(); |
| session.commit(); |
缓存机制
概念
把一部分内容放入缓存,下次获取数据,直接从缓存读取,直接从内存获取,而不是向数据库索要,效率更高
一级缓存
Mybatis默认启动一级缓存
作用范围有限,作用于一个会话,我们希望缓存扩展到所有会话,通过二级缓存,默认关闭
| <cache |
| eviction="FIFO" |
| flushInterval="60000" |
| size="512" |
| readOnly="true"/> |
| |
某个方法关闭缓存
| <select id="getStudentBySid" resultType="Student" useCache="false"> |
| select * from student where sid = #{sid} |
| </select> |
| |
操作完成后清空缓存
| <select id="getStudentBySid" resultType="Student" flushCache="true"> |
| select * from student where sid = #{sid} |
| </select> |
| |
读取顺序:二级缓存 => 一级缓存 => 数据库
注解开发
| @Insert("insert into student(name, sex) values(#{name}, #{sex})") |
| int addStudent(Student student); |
| |
| <mappers> |
| <mapper class="com.test.mapper.MyMapper"/> |
| |
| </mappers> |
| |
指定构造方法
| @ConstructorArgs({ |
| @Arg(column = "sid", javaType = int.class), |
| @Arg(column = "name", javaType = String.class) |
| }) |
| @Select("select * from student where sid = #{sid} and sex = #{sex}") |
| Student getStudentBySidAndSex(@Param("sid") int sid, @Param("sex") String sex); |
| |
指定参数类型
| @Select("select * from student where sid = #{sid} and sex = #{sex}") |
| Student getStudentBySidAndSex(@Param("sid") int sid, @Param("sex") String sex); |
| |
注解控制缓存
| @CacheNamespace(readWrite = false) |
| public interface MyMapper { |
| |
| @Select("select * from student") |
| @Options(useCache = false) |
| List<Student> getAllStudent(); |
| |
Mybatis是半自动框架,SQL语句需要自己写,有一定麻烦,JPA框架这种全自动框架,几乎没有SQL语句!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现