当前位置: 首页 > news >正文

mybatis 入门

 MyBatis是一款持久层框架,免除了几乎所有的JDBC代码、参数及获取结果集工作。可以通过简单的XML或注解来配置和映射原始类型、接口和Java POJO为数据库中的记录。

1 无框架下的JDBC操作

1)加载驱动:Class.forName(“com.mysql.cj.jdbc.Driver”);

2)获取连接:DriverManager.getConnection(url,user,password);

3)创建Statement对象,用于想数据库发送SQL语句:connect.createStatement();

4)用Statement执行增删查改操作。

5)关闭Connection、Statement、ResultSet对象。

public class JdbcExample {private static final String URL = "jdbc:mysql://localhost:3306/study";private static final String USER = "root";private static final String PASSWORD = "密码";public static void main(String[] args) throws SQLException {Connection connection = null;Statement statement = null;try {Class.forName("com.mysql.cj.jdbc.Driver");connection = DriverManager.getConnection(URL, USER, PASSWORD);statement = connection.createStatement();doSelect(statement);doUpdate(statement);} catch (ClassNotFoundException | SQLException e) {throw new RuntimeException(e);} finally {if (connection != null) connection.close();if (statement != null) statement.close();}}private static void doSelect(Statement statement) throws SQLException {ResultSet resultSet = null;try {resultSet = statement.executeQuery("SELECT  * FROM e_teacher");while (resultSet.next()) {String name = resultSet.getString("name");System.out.println(name);}} catch (SQLException e) {throw new RuntimeException(e);} finally {if (resultSet != null) resultSet.close();}}private static void doUpdate(Statement statement) throws SQLException {int update = statement.executeUpdate("UPDATE e_teacher SET name = 'Java测试' WHERE id = 55");System.out.println("更新数量:" + update);}}

2 MyBatis

MyBatis 相比于Hibernate,更轻量级。且对于SQL优化和细节控制可操作性更高(Hibernate 使用HQL 或原生SQL进行数据库查询,但主要关注的是对象的属性和方法,通过ORM映射自动生成SQL语句)。

2.1 SqlSession — MyBatis执行SQL语句的主要入口

SqlSession的实例用于执行数据库操作,它是由SqlSessionFactory(被视为单个数据库映射关系经过编译后的内存镜像)创建的。具体创建步骤如下:

1)定义MyBatis配置文件(定义数据库连接信息、mapper、设置等信息)。

2)定义相关mapper。

3)获取MyBatis配置文件等输入流,并根据输入流获取sessionFactory:

new SqlSessionFactoryBuilder().build(inputStram)。

4)获取sqlSession: sessionFactory.openSession()。

5)用sqlSession去执行数据库操作。

6)关闭sqlSession。

<!--mybatis.xml-->
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><properties><property name="url" value="jdbc:mysql://localhost:3306/study"/><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="username" value="root"/><property name="password" value="密码"/></properties><typeHandlers><typeHandler handler="com.huangmingfu.mybatis.handler.DescObjectTypeHandler" /></typeHandlers><environments default="dev"><environment id="dev"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="url" value="${url}"/><property name="driver" value="${driver}"/><property name="username" value="${username}"/><property name="password" value="${password}"/></dataSource></environment></environments><mappers><mapper resource="mapper/course.xml"/><mapper resource="mapper/teacher.xml"/></mappers>
</configuration>
public class SqlSessionInstance {public static SqlSession getSqlSession() {return InnerClass.sqlSession;}private SqlSessionInstance() {}private static class InnerClass {private static SqlSession sqlSession = createSqlSession();private static SqlSession createSqlSession() {try {InputStream inputStream = Resources.getResourceAsStream("mybatis.xml");SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);return sessionFactory.openSession();} catch (IOException e) {throw new RuntimeException(e);}}}
}

2.2 类型处理器

MyBatis 在设置预处理语句(PreparedStatement)中的参数或结果集中取出一个值时,会用类型处理器将获取到的值以合适的方式转换成Java类型。在插入或更新数据时同样也会用类型处理器进行转换。

MyBatis 定义了一些默认的处理器,用户也可以自定义处理器。

2.2.1 处理枚举类型

MyBatis 定义了两种枚举处理器,EnumTypeHandler(默认方式,把Enum值转换成对应的名字) 和 EnumOrdinalTypeHandler(把枚举的序数值来映射成对应的整形数值)。

如果需要把Enum 值映射成对应的整形值,全局设置不太方便,可以在resultMap中指定typeHandler。(推荐采用默认形式,这样在数据库中会更直观)

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.huangmingfu.mybatis.mapper.TeacherMapper"><resultMap id="teacherMap" type="com.huangmingfu.mybatis.entity.Teacher"><result column="grade" property="grade" typeHandler="org.apache.ibatis.type.EnumOrdinalTypeHandler"/></resultMap><select id="getByName" resultMap="teacherMap">select * from e_teacher where name LIKE CONCAT('%',#{name},'%') LIMIT 0,1</select><insert id="insert" parameterType="com.huangmingfu.mybatis.entity.Teacher">INSERT INTO e_teacher(`name`,grade,`desc`,`age`)VALUES (#{name},#{grade,typeHandler=org.apache.ibatis.type.EnumOrdinalTypeHandler},#{desc},#{age})</insert>
</mapper>

2.2.2 自定义处理器

自定义处理器可以通过继承BaseTypeHandler来实现,在配置文件中注册这个处理器。

public class DescObjectTypeHandler extends BaseTypeHandler<DescObject> {@Overridepublic void setNonNullParameter(PreparedStatement preparedStatement, int i, DescObject descObject, JdbcType jdbcType) throws SQLException {preparedStatement.setString(i,JSON.toJSONString(descObject));}@Overridepublic DescObject getNullableResult(ResultSet resultSet, String s) throws SQLException {return getFromString(resultSet.getString(s));}@Overridepublic DescObject getNullableResult(ResultSet resultSet, int i) throws SQLException {return getFromString(resultSet.getString(i));}@Overridepublic DescObject getNullableResult(CallableStatement callableStatement, int i) throws SQLException {return getFromString(callableStatement.getString(i));}private DescObject getFromString(String string) {JSONObject jsonObject = JSON.parseObject(string);DescObject descObject = new DescObject();descObject.setMessage(jsonObject.getString("message"));descObject.setTitle(jsonObject.getString("title"));return descObject;}
}

2.3 映射器实例

映射器是一个接口(Mapper接口),定义了与数据库交互的SQL语法和方法,MyBatist通过动态代理来为这些接口创建实例。

在Spring框架中,映射器通常会被声明为Spring Bean。

2.3.1 与SqlSession的关系

映射器实例通常(注意,不是一定)是通过sqlSession实例来获取。当通过映射器实例调用某个方法时,实际上是委托给sqlSession去执行相应的Sql语句。sqlSession负责根据映射器的方法名、参数等信息,找到对应的SQL语句,并通过执行器(Executor)执行这个SQL语句,最后将结果放回给映射器实例。

2.4 缓存策略

MyBatis 主要采用了两种缓存策略。

2.4.1 一级缓存(SqlSession级别缓存)

是默认的缓存机制。是局部的。作用域是sqlSession的生命周期(当sqlSession关闭或清空时,一级缓存也会被清空)。

原理:同一个sqlSession中执行的相同SQL语句和参数,只会执行一次数据库查询,然后将结果缓存起来,下次遇到相同的查询时,直接从缓存中获取结果,而不是再次访问数据库。

2.4.2 二级缓存(Mapper级别缓存)

多个SqlSession之间可共享这个缓存,需要手动开启。

原理:不同的SqlSession 在执行相同的Mapper和相同的SQL语句时,可共享二级缓存中的数据,当数据在二级缓存中未找到时,会执行数据库查询,并将结果放入二级缓存中,供后续使用。

注意:1)对同一个数据执行了增删改操作时,需要更新或清空缓存,以确保缓存中的数据与数据库中保持一致。

2)二级缓存是跨SqlSession的,需要注意并发和线程安全问题。

http://www.lryc.cn/news/339715.html

相关文章:

  • Spring-AI-上下文记忆
  • 内存函数memcpy、mommove、memset、memcmp
  • symfony框架介绍
  • 【计算机毕业设计】游戏售卖网站——后附源码
  • LabVIEW电信号傅里叶分解合成实验
  • Docker 学习笔记(六):挑战容器数据卷技术一文通,实战多个 MySQL 数据同步,能懂会用,初学必备
  • csdn怎么变得这么恶心,自动把一些好的文章分享改成了vip可见
  • 自然语言处理NLP:文本预处理Text Pre-Processing
  • 家庭网络防御系统搭建-虚拟机安装siem/securityonion网络连接问题汇总
  • 2024年外贸行业营销神器推荐
  • k8s高可用集群部署介绍 -- 理论
  • 【GDAL-Python】1-在Python中使用GDAL读写栅格文件
  • 【C++】explicit关键字详解(explicit关键字是什么? 为什么需要explicit关键字? 如何使用explicit 关键字)
  • maven引入外部jar包
  • 李沐37_微调——自学笔记
  • 【小程序】生成短信中可点击的链接
  • 欧拉函数(模板题)
  • Thingsboard PE 白标的使用
  • 智能物联网远传冷水表管理系统
  • Qt教程3-Ubuntu(x86_64)上配置arm64(aarch64)交叉编译环境及QT编译arm64架构工程
  • 2024年华为OD机试真题-最长子字符串的长度(二)-Python-OD统一考试(C卷)
  • 【24届数字IC秋招总结】正式批面试经验汇总5——蔚来、tp-link
  • 【JAVA基础篇教学】第八篇:Java中List详解说明
  • RN向上向下滑动组件封装(带有渐变色)
  • 27、Lua 学习笔记之五(Lua中的数学库)
  • 【C++成长记】C++入门 | 类和对象(中) |拷贝构造函数、赋值运算符重载、const成员函数、 取地址及const取地址操作符重载
  • OpenHarmony实战开发-页面深色模式适配。
  • 域名解析出现错误,该如何解决?
  • 从iPhone恢复已删除照片的最佳软件
  • MySQL模糊查询