欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 能源 > SSM复习——M(MyBatis)一

SSM复习——M(MyBatis)一

2025/2/23 14:44:05 来源:https://blog.csdn.net/qq_63843408/article/details/143402298  浏览:    关键词:SSM复习——M(MyBatis)一

MyBatis 介绍

简介

MyBatis 是一个开源的、轻量级的数据持久化框架,前身为 IBatis。其内部封装了 JDBC,简化了数据库连接和表的CRUD操作,开发者只需要关注 SQL 语句本身。

MyBatis 支持定制化 SQL、存储过程以及高级映射,可以在实体类和 SQL 语句之间建立映射关系,是一种半自动化的 ORM 实现。

数据持久化:内存数据持久保存到外存(文件、数据库等)中。常见的持久化方式有:IO流、JDBC、MyBatis、Hibernate 。

ORM: Object Relational Mapping,对象关系映射。是一种数据持久化思想,它在对象模型和关系型数据库之间建立起对应关系,通过 Java对象去操作数据库表中的数据。Hibernate 完全实现了 ORM 思想,而 MyBatis 是一个半自动化的 ORM 实现。

IBatis: 2002 年由 Clinton Begin 发布。2010 年从 Apache 迁移到 Google,并改名为 MyBatis,2013 年又迁移到了 Github。

官方文档

英文:mybatis – MyBatis 3 | Introduction

中文:https://mybatis.org/mybatis-3/zh/

其它教程参考:

MyBatis 教程_w3cschool

MyBatis是什么 - C语言中文网

MyBatis 优缺点

  • 免费、开源。

  • 轻量、小巧、易学。

  • 与 JDBC 相比,极大的减少了java代码量。

  • MyBatis 相当灵活,不会对应用程序或者数据库的现有设计强加任何影响,SQL 写在 XML 中,和程序逻辑代码分离,降低耦合度,便于管理和优化,提高了代码的可重用性。

  • 支持动态 SQL 语句。

  • 支持对象与数据库记录间的关系映射。

  • 支持存储过程。MyBatis 以存储过程的形式封装 SQL,可以将业务逻辑保留在数据库之外,增强应用程序的可移植性、更易于部署和测试。

缺点

  • 编写 SQL 语句工作量较大,对开发人员编写 SQL 语句的功底有一定要求。

  • SQL 语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。

扩展

Mybatis-Plus(简称 MP)是 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变,支持 Mybatis 所有原生的特性,为简化开发、提高效率而生。可参考 MyBatis-Plus 官网。

总结:

简化数据库连接

简化增删改查操作

第一个MyBatis程序

准备表和POJO

  • CREATE TABLE `user` (`yhbh` varchar(32) NOT NULL COMMENT '用户编号(主键)',`yhm` varchar(32) DEFAULT NULL COMMENT '用户名(唯一)',`pwd` varchar(6) DEFAULT NULL COMMENT '密码',`yhnc` varchar(32) DEFAULT NULL COMMENT '用户昵称',`yhsf` int DEFAULT NULL COMMENT '用户身份(1:卖家(管理员),2:普通管理员,3:买家)',`sex` varchar(4) DEFAULT NULL COMMENT '性别',`yhtx` varchar(64) DEFAULT NULL COMMENT '用户头像URL',`sjh` varchar(11) DEFAULT NULL COMMENT '手机号',`email` varchar(32) DEFAULT NULL COMMENT '邮箱',`zcsj` varchar(14) DEFAULT NULL COMMENT '用户注册时间',PRIMARY KEY (`yhbh`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  • POJO

    package com.lsy.eshop.pojo;
    import lombok.*;@Data
    public class User implements Serializable{/** 用户编号(主键)*/private String yhbh;/** 用户名(唯一)*/private String yhm;/** 密码*/private String pwd;/** 用户昵称*/private String yhnc;/** 用户身份(1:卖家(管理员),2:普通管理员,3:买家)*/private Integer yhsf;/** 性别*/private String sex;/** 用户头像URL */private String yhtx;/** 手机号*/private String sjh;/** 邮箱*/private String email;/** 用户注册时间*/private String zcsj;
    }
    

准备日志

MyBatis 通过日志框架管理日志信息,可将 log4j 日志框架引入项目。不引入日志并不影响项目运行,如果想查看 mybatis 的运行信息,则需引入。

<!-- log4j 日志框架 -->
<dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.12</version>
</dependency>

日志配置文件

引入MyBatis

项目中使用 MyBatis,只需在classpath下导入 mybatis.jar 包即可。下面是通过maven导入的。

<!-- mybatis -->
<dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.9</version>s
</dependency>

创建映射器:mapper.xml

UserMapper.xml 文件位于 resources 目录下。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.lsy.eshop.mapper.UserMapper">
//就可以在这里写增删改查的sql语句
//调用sql语句就是通过id<insert id="addUser" parameterType="com.lsy.eshop.pojo.User">insert into user(yhbh, yhm, pwd, zcsj)values (#{yhbh},#{yhm},#{pwd},#{zcsj})</insert><select id="selectUser" resultType="com.lsy.eshop.pojo.User">select * from user where yhbh = #{yhbh}</select>
</mapper>

mapper是映射器的意思,在mapper里面写各种sql语句

命名空间namespace就取名,包名.文件名

sql语句中id,就用方法名即可,

传参类型parameType,返回类型resultType,指明是哪种类

占位符,传参的问题:把“?”替换为“#{ 传过来的参数属性}”

通过映射文件(mapper),实现了java对象和数据库表的数据一一映射的思想

通过映射文件来封装sql语句操作,通过和sql语句同名的关键字的标签来映射指定(封装)

id的作用就是程序调用的时候通过id来找

注意

如果 UserMapper.xml 文件没有位于 resources 目录下,而是在其它位置比如 com.lsy.ibook.dao 包下,则在 pom.xml 文件中的 <build> 标签下需添加如下配置,因为 maven 默认只会构建 resources 目录下的资源文件,其它目录下的文件需显示配置说明。

<resources><!-- 构造项目时,加载所有 src/main/java 目录下的 xml 文件 --><resource><directory>src/main/java</directory><includes><include>**/*.xml</include></includes></resource>
</resources>

管理配置文件: mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!-- 引入数据源文件 --><properties resource="jdbc.properties" /><!-- environments 包含一组数据库使用环境,default值决定了使用哪一个 environment --><environments default="dev"><!-- 开发环境 --><environment id="dev"><transactionManager type="JDBC"/><dataSource type="POOLED"><!-- 通过表达式语法,获取 jdbc.properties 中的数据源信息 --><property name="driver" value="${jdbc.driverClassName}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/></dataSource></environment></environments><!--mappers 元素包含一组映射器(mapper),这些映射器包含了 SQL 代码和映射定义信息。--><mappers>//引入映射文件,拷贝资源路径,斜杠<mapper resource="UserMapper.xml"/><mapper class="com.lsy.projs.mapper.UserMapper"/></mappers>
</configuration>

jdbc.properties 数据源信息

jdbc.driverClassName=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/eshop?characterEncoding=utf8&allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true
jdbc.username=root
jdbc.password=rootpool.initialSize=5
pool.maxActive=20
pool.minIdle=5
pool.maxWait=6000

测试

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;public static void main(String[] args) throws Exception{// 1. 读取配置文件 mybatis-config.xmlInputStream is = Resources.getResourceAsStream("mybatis-config.xml");// 2. 根据配置文件构建SqlSessionFactorySqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(is);// 3. 通过SqlSessionFactory创建SqlSessiontry(SqlSession session = ssf.openSession(true)){//新增User yh = new User("05","张三","123456",null,3,null,null,null,null,null);int ret = session.insert("com.lsy.eshop.mapper.UserMapper.addUser",yh);session.commit();       //增删改是事务性的操作,需提交事务System.out.println(ret);//查询User user = session.selectOne("com.lsy.eshop.mapper.UserMapper.selectUser","01");System.out.println(user);}
}

第一步,读取配置文件

第二步,通过会话工厂构造器SqlSessionFactoryBuilder把流资源读进来创建一个会话工厂SqlSessionFactory

第三步,由会话工厂创建会话对象SqlSession(用于跟数据库会话),默认是false,要改为true(才会自动提交)

第四步,开始调用sqi语句

namespace用来区分是哪个映射文件

通过namespace然后再找id相同,调用sql语句

封装逻辑,同名映射封装

如果不同名,那就用别名as同名,

也可以自定义映射规则:标签<resultMap>映射

补:查询的,selectOne查一个,selestList查询多个,返回值记得做一下类型转换

动态sql语句  

sql语句没法固定,需要拼接,如查询

直通拼接where和去掉and

条件类拼接

内容就是,不为空,也不为空字符

if标签

set标签,

逗号会自动去掉

日志 log4j

配置文件 :log4j.properties

放在resources里面

#log level: off fatal error warn info debug all
log4j.rootCategory=debug,con#log to console
log4j.appender.con=org.apache.log4j.ConsoleAppender
log4j.appender.con.layout=org.apache.log4j.PatternLayout
#log4j.appender.con.layout.ConversionPattern=%d{MM-dd HH:mm:ss} %5p %c{5}:%L %m%n
log4j.appender.con.layout.ConversionPattern=[%5p] %c{5}:%L %m%n

Log4j 是一个用于 Java 应用程序的日志记录库,它提供了灵活和可配置的日志记录功能。其主要作用包括:

  1. 日志记录:Log4j 可以帮助开发者记录应用程序的运行状态、错误信息和调试信息,便于后期分析和故障排查。

  2. 灵活的配置:Log4j 允许通过配置文件(如 XML 或 properties 文件)定义日志记录的格式、输出目标和日志级别,使得调整日志行为变得简单。

  3. 多种输出目标:支持将日志输出到多个目的地,例如控制台、文件、数据库、远程服务器等,方便开发者选择适合的记录方式。

  4. 日志级别管理:提供多种日志级别(如 DEBUG、INFO、WARN、ERROR、FATAL),允许开发者根据不同的需求调整记录的详细程度。

  5. 性能优化:Log4j 设计时考虑了性能,可以异步记录日志,从而减少对应用程序主线程的影响。

  6. 日志格式化:支持自定义日志格式,可以定义输出日志的结构和样式,方便阅读和分析。

平常开发的时候,更建议用日志的形式输出

先注解@Log4j

然后按照定级输出

切换级别

切换 Log4j 的级别输出会影响日志记录的行为,具体来说,主要有以下几个方面的变化:

  1. 输出的日志信息量

    • 低级别(如 DEBUG、INFO):当设置为 DEBUG 或 INFO 时,日志会记录更多详细信息,包括调试信息、普通运行状态等。适合开发和调试阶段。
    • 高级别(如 WARN、ERROR、FATAL):当设置为 WARN 或更高时,只会记录警告、错误和致命信息,减少输出的日志量,适合生产环境中使用。
  2. 日志文件的大小

    • 级别越低,生成的日志文件通常会越大,因为记录的信息更多。将级别提高,可以有效控制日志文件的大小。
  3. 调试与监控

    • 在开发和调试阶段,较低的日志级别可以帮助开发者更好地理解程序的运行情况。切换到较高级别则更适合上线后的监控,关注系统的稳定性和潜在问题。
    • 演示的时候,把级别调到off,直接关闭,不用再去注释代码

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com