Mybatis框架保姆级教程,看这一篇就够了

Mybatis

1.什么是mybatis

1.1概念

MyBatis 是一款优秀的**持久层**框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

1.2优点

  • sql和代码的分离,提高了可维护性
  • 提供映射标签,支持对象与数据库的orm字段关系映射
  • 提供对象关系映射标签,支持对象关系组建维护
  • 提供xml标签,支持编写动态sql。

1.3帮助文档

官网:https://github.com/mybatis

中文文档:https://mybatis.org/mybatis-3/zh/index.html

1.4原理图示

在这里插入图片描述

2.用法简单示例

2.1搭建环境

2.1.1搭建数据库

在这里插入图片描述

1715831845715)

sql文件代码:


SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for grade
-- ----------------------------
DROP TABLE IF EXISTS `grade`;
CREATE TABLE `grade`  (
  `gradeId` int(4) NOT NULL AUTO_INCREMENT,
  `gradeName` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  PRIMARY KEY (`gradeId`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;

-- ----------------------------
-- Records of grade
-- ----------------------------
INSERT INTO `grade` VALUES (1, 'S1');
INSERT INTO `grade` VALUES (2, 'S2');
INSERT INTO `grade` VALUES (3, 'S3');
INSERT INTO `grade` VALUES (4, 'S4');

-- ----------------------------
-- Table structure for score
-- ----------------------------
DROP TABLE IF EXISTS `score`;
CREATE TABLE `score`  (
  `scoreId` int(10) NOT NULL AUTO_INCREMENT,
  `scoreResult` int(5) NOT NULL,
  `studentId` int(5) NOT NULL,
  `subjectId` int(5) NOT NULL,
  `examDate` datetime NOT NULL,
  PRIMARY KEY (`scoreId`) USING BTREE,
  INDEX `studentId`(`studentId`) USING BTREE,
  INDEX `subjectId`(`subjectId`) USING BTREE,
  CONSTRAINT `score_ibfk_1` FOREIGN KEY (`studentId`) REFERENCES `student` (`studentId`) ON DELETE RESTRICT ON UPDATE RESTRICT,
  CONSTRAINT `score_ibfk_2` FOREIGN KEY (`subjectId`) REFERENCES `subject` (`subjectId`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB AUTO_INCREMENT = 101 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;

-- ----------------------------
-- Records of score
-- ----------------------------
INSERT INTO `score` VALUES (1, 367, 4, 9, '2009-10-09 07:24:31');
INSERT INTO `score` VALUES (2, 893, 1, 1, '2022-05-16 04:55:07');
INSERT INTO `score` VALUES (3, 380, 5, 11, '2021-09-11 08:32:27');
INSERT INTO `score` VALUES (4, 626, 6, 2, '2010-12-29 16:57:23');
INSERT INTO `score` VALUES (5, 496, 5, 10, '2011-12-18 23:11:37');
INSERT INTO `score` VALUES (6, 539, 8, 12, '2003-06-23 01:43:19');
-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student`  (
  `studentId` int(5) NOT NULL AUTO_INCREMENT,
  `studentName123` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `studentAddress` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `gradeId` int(4) NOT NULL,
  PRIMARY KEY (`studentId`) USING BTREE,
  INDEX `gradeId`(`gradeId`) USING BTREE,
  CONSTRAINT `student_ibfk_1` FOREIGN KEY (`gradeId`) REFERENCES `grade` (`gradeId`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB AUTO_INCREMENT = 11 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;

-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES (1, '张三', '223 Lodge Ln, Toxteth', 3);
INSERT INTO `student` VALUES (2, 'Patricia Black', '752 Huaxia St, Jinghua Shangquan', 2);
INSERT INTO `student` VALUES (3, 'Mori Ikki', '762 Cyril St, Braunstone Town', 3);
INSERT INTO `student` VALUES (4, 'Ho Sau Man', '320 Portland St', 4);
INSERT INTO `student` VALUES (5, 'Mui Hok Yau', '648 Zhongshan 5th Rd, Zimaling Shangquan', 2);
INSERT INTO `student` VALUES (6, 'Tam Wing Fat', '2-3-7 Yoyogi, Shibuya-ku', 3);
INSERT INTO `student` VALUES (7, 'Che Tsz Hin', '352 Tianhe Road, Tianhe District', 1);
INSERT INTO `student` VALUES (8, 'Endo Ryota', '746 Papworth Rd, Trumpington', 2);
INSERT INTO `student` VALUES (9, 'Wei Ziyi', '589 Huaxia St, Jinghua Shangquan', 1);
INSERT INTO `student` VALUES (10, 'Masuda Nanami', '326 Collier Road', 3);

-- ----------------------------
-- Table structure for subject
-- ----------------------------
DROP TABLE IF EXISTS `subject`;
CREATE TABLE `subject`  (
  `subjectId` int(5) NOT NULL AUTO_INCREMENT,
  `subjectName` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `gradeId` int(4) NOT NULL,
  PRIMARY KEY (`subjectId`) USING BTREE,
  INDEX `gradeId`(`gradeId`) USING BTREE,
  CONSTRAINT `subject_ibfk_1` FOREIGN KEY (`gradeId`) REFERENCES `grade` (`gradeId`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB AUTO_INCREMENT = 13 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;

-- ----------------------------
-- Records of subject
-- ----------------------------
INSERT INTO `subject` VALUES (1, 'java', 1);
INSERT INTO `subject` VALUES (2, 'html', 1);
INSERT INTO `subject` VALUES (3, 'C#', 1);
INSERT INTO `subject` VALUES (4, 'winform', 1);
INSERT INTO `subject` VALUES (5, 'joop', 2);
INSERT INTO `subject` VALUES (6, 'mysql', 2);
INSERT INTO `subject` VALUES (7, 'js', 2);
INSERT INTO `subject` VALUES (8, 'jsp', 2);
INSERT INTO `subject` VALUES (9, '框架基础', 3);
INSERT INTO `subject` VALUES (10, 'ssm', 3);
INSERT INTO `subject` VALUES (11, 'springboot', 3);
INSERT INTO `subject` VALUES (12, 'bootstrap+vue', 3);

SET FOREIGN_KEY_CHECKS = 1;

2.1.2idea创建项目(以手动添加jar包依赖为例)
2.1.2.1创建普通java项目

在这里插入图片描述

2.1.2.2添加webproject支持(在web-info目录下创建lib目录用)

在这里插入图片描述
在这里插入图片描述

2.1.2.3添加依赖:mysql-connector-java-8.0.19.jar mybatis-3.5.1.jar

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.1.2.4创建resources资源根目录、测试根目录

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

2.1.3添加配置文件:datadase.properties mybatis-config.xml

在这里插入图片描述

  • database.properties 数据源配置文件

  • log4j.properties log4j日志配置文件

  • mybatis-config.xml mybatis核心配置文件

    mybatis-config.xml为了方便下次使用,可以在idea创建模板,下次右键可以直接创建,创建方式如图:

在这里插入图片描述
在这里插入图片描述

我自己使用的模板内容,仅供参考,注释部分,便于理解,可以忽略

<?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>
    <!--引入数据库配置文件:连接数据库的各种参数-->
<!--    属性    -->


    <properties resource="database.properties">
    </properties>
    <!--框架运行时的一些设置:如log4j-->
<!--    设置  -->


    <settings>
<!--   数据库字段是下划线格式的,实体类是驼峰命名的     student_name     studentName-->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
<!--        自动映射方式           自动    映射    行为      全部     FULL 全     PARTIAL 部分的     NONE   不-->
        <setting name="autoMappingBehavior" value="FULL"/>
    </settings>
<!--别名-->
    <typeAliases>
        <package name="cn.bdqn.demo144.entity"/>
<!--        <typeAlias type="cn.bdqn.demo144.entity.Student" alias="Student"/>-->
    </typeAliases>
    <!--运行的环境,可以是多个之间切换,default选中要切换的单个环境id-->
<!--  环境 s  -->
    <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>-->
<!--&lt;!&ndash;        告诉mybatis     mapper对应的XXXXmapper.xml文件在哪&ndash;&gt;-->

<!--        <mapper resource="cn/bdqn/demo144/mapper/StudentMapper.xml"></mapper>-->
<!--        <mapper resource="cn/bdqn/demo144/mapper/GradeMapper.xml"></mapper>-->
<!--    </mappers>-->
   
<mappers>
    <package name="cn.bdqn.demo144.mapper"/>
</mappers>
</configuration>

注意:

2.2编写接口、xml映射文件

在这里插入图片描述
在这里插入图片描述

mapper映射文件:GradeMapper.xml也可以创建模板,方式与创建mybatis核心配置文件一样,内容如下,仅供参考

<?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="">
    
    
</mapper>

注意:

  1. xml映射文件:mapper namespace=""的和对应的接口名一致,如cn.bdqn.demo.mapper.GradeMapper,不能用“/”符号
  2. xml映射文件里面的select/delete标签的id属性值和接口的方法名一致,标识这个标签是为了哪个方法服务的
    在这里插入图片描述

2.3main方法测试

     String mybatisConfig = "mybatis-config.xml";//数据源
        InputStream inputStream = null;
        try {
            inputStream = Resources.getResourceAsStream(mybatisConfig);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
//核心创建sqlSession对象,负责操作数据库
      //SqlSession sqlSession = sqlSessionFactory.openSession(true);//true  为自动提交事务,增删改的操作
        SqlSession sqlSession = sqlSessionFactory.openSession();//

//sqlSession可以将所有接口按照对应的XXXMapper.xml实现,使用时需要通过getMapper(GradeMapper.class)方式,具体实现某个接口
        System.out.println(sqlSession.getMapper(GradeMapper.class).selectGradeCount());
//        sqlSession.commit();//增删改操作,需要提交
//       SqlSession sqlSession = sqlSessionFactory.openSession(true);
//        可以省略
        sqlSession.close();

3.核心配置文件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>
    <!--属性:引入数据库配置文件:连接数据库的各种参数   -->
    <!--如果没有设置资源根目录(resourcesRoot) : <properties resource="cn/bdqn/XX/database.properties">-->
    <properties resource="database.properties"/>
    <!--设置-->
    <settings>
        <!--解决数据库字段是下划线格式的,实体类是驼峰命名的映射如:   数据库命名:  student_name    实体类: studentName  -->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
        <!--结果集列名和实体类属性  自动映射方式 自动  映射   行为       FULL 全     PARTIAL 部分的  嵌套的子查询的结果集不映射      NONE 不-->
        <setting name="autoMappingBehavior" value="FULL"/>
        <!--配置日志实现-->
        <setting name="logImpl" value="LOG4j"/>
    </settings>
    <!--实体类或者Mapper的别名:cn.bdqn.demo144.entity.Student   简写成student,默认首字母小写-->
    <typeAliases>
        <!--方式一:设置需要起别名的实体类的包,不用一一起别名-->
          <!--注意:映射文件的返回值类型,默认简写成student,也可以通过在实体类加@Alias("Student123")注解的方式使用Student123为别名,前提是设置过别名的包-->
        <package name="cn.bdqn.demo144.entity"/>
        <!--方式二:为单独某一个实体类设置别名-->
        <!--<typeAlias type="cn.bdqn.demo144.entity.Student" alias="Student"/>-->
        <!--<typeAlias type="cn.bdqn.demo144.mapper.StudentMapper" alias="StudentMapper"/>-->
    </typeAliases>
    <!--运行的环境,可以是多个之间切换,default选中要切换的单个环境id-->
    <environments default="development">
        <!--开发/测试,可以设置多个,id被default调用-->
        <environment id="development">
            <transactionManager type="JDBC"/>
            <!--数据源-->
            <dataSource type="POOLED">
                <!--连接数据库所需要的四个字符串:驱动类、路径、数据库用户名、密码,可以直接赋值,也可以如下图,通过${变量名}的方式获取
                   注意这里的用户名必须是:username,读取值的配置文件里可以是user
                -->
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <!--注意配置文件中的个参数名是否匹配-->
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
    <!--映射:指定映射文件的位置-->
    <!--方式一:指定所有mapper映射文件所在的包的位置,注意书写方式: .  -->
    <mappers>
        <package name="cn.bdqn.demo144.mapper"/>
    </mappers>
    <!--方式二:分别指定每一个映射文件的位置,注意书写方式:  /  -->
    <!--    <mappers>-->
    <!--        <mapper resource="cn/bdqn/demo144/mapper/StudentMapper.xml"></mapper>-->
    <!--        <mapper resource="cn/bdqn/demo144/mapper/GradeMapper.xml"></mapper>-->
    <!--    </mappers>-->
</configuration>

4.mapper映射文件:XXXMapper.xml详解

          mapper接口:定义dao层方法                   

在这里插入图片描述
mapper映射文件:定义dao层接口方法实现需要的sql语句、参数类型、返回值类型 |
在这里插入图片描述

xml映射文件中编写sql语句,idea自动提示设置

网上的各种解决方案本质上其实都是配置SQL方言和SQL解析范围,但其实本质上的解决方案是语言注入

1.File->Settings->Languages&Frameworks->SQL Dialects

在这里插入图片描述

2.File->Settings->Languages&Frameworks->SQL Resolution Scopes

在这里插入图片描述
在这里插入图片描述

5.接口返回值映射问题

执行sql语句的结果集与返回值的类型属性不一致的问题:

实体类:

public class Student {

  private int studentId;
  private String studentName;
  private String studentAddress;
  //其余省略
  private String bornDate;
  //年级属性,  Grade对象
  private Grade grade;
  //分数集合属性,List<Score>  分数对象集合
  private List<Score> scoreList;
  }

sql语句:

select student.studentId, studentName123, studentAddress, grade.gradeId, grade.gradeName, bornDate, score.*
from student
         inner join grade on student.gradeId = grade.gradeId
         inner join score on student.studentId = score.studentId

结果集:
在这里插入图片描述

解决结果集合实体类属性映射不一致问题:

5.1 resultMap标签

解决问题:结果集的列名与实体类字段不一致

  <!--不再写返回值类型resultType    而是通过   id    引用结果映射 resultMap-->
    <select id="selectAllStudentList" resultMap="studentResultMap">
        select student.studentId, studentName123, studentAddress, grade.gradeId, grade.gradeName, bornDate, score.* from student
                 inner join grade on student.gradeId = grade.gradeId
                 inner join score on student.studentId = score.studentId
    </select>
    <!--结果集映射-->
    <resultMap id="studentResultMap" type="cn.bdqn.demo144.entity.Student">
        <!--        id 是查询结果的主键,写上增加查询效率,性能-->
        <id property="studentId" column="studentId"/>
        <!--     实体类的属性名:studentName   结果集的列名:studentName123-->
        <result property="studentName" column="studentName123"/>
        <!--        其余属性名和列名一致的,如果mybatis-config.xml设置过自动映射,可以不用写,如果没有设置,属性不会被赋值,显示null-->
      
    </resultMap>

5.2 association标签

解决问题:实体类的属性为某个对象,结果集里的列名不是对象名,而是该对象的各个属性名

 
<!--  实体类的属性为某个对象,结果集里的列名不是对象名,而是该对象的各个属性名,解决办法:association标签-->
<!--  方式一:-->
        <association property="grade" javaType="Grade">
            <id property="gradeId" column="gradeId"/>
            <result property="gradeName" column="gradeName"/>
        </association>

或者新建resultMap,association通过resultMap引用:

 <resultMap id="studentResultMap" type="cn.bdqn.demo144.entity.Student">
        <!--        id 是查询结果的主键,写上增加查询效率,性能-->
        <id property="studentId" column="studentId"/>
        <!--     实体类的属性名:studentName   结果集的列名:studentName123-->
        <result property="studentName" column="studentName123"/>
        <!--        其余属性名和列名一致的,如果mybatis-config.xml设置过自动映射,可以不用写,如果没有设置,属性不会被复制,显示null-->
     <!--  方式二:-->
        <association property="grade" resultMap="gradeResultMap">
        </association>
    </resultMap>
    <resultMap id="gradeResultMap" type="Grade">
        <id property="gradeId" column="gradeId"/>
        <result property="gradeName" column="gradeName"/>
    </resultMap>
5.3 collection标签

实体类的属性为某种对象的集合,结果集里的列名不是集合名,而是该集合里泛型的各个属性名,解决办法:在resultMap添加collection标签

<resultMap id="studentResultMap" type="cn.bdqn.demo144.entity.Student">
        <!--        id 是查询结果的主键,写上增加查询效率,性能-->
        <id property="studentId" column="studentId"/>
        <!--     实体类的属性名:studentName   结果集的列名:studentName123-->
        <result property="studentName" column="studentName123"/>
    <!--       方式一:-->
     <!--       注意ofType为该集合的泛型,写法为ofType不是javaType-->
    
        <collection property="scoreList" ofType="Score">
            <id property="scoreId" column="scoreId"/>
            <result property="studentId" column="studentId"/>
            <!-- 其余属性略-->
        </collection>
    </resultMap>

或者新建resultMap,collection通过resultMap引用,与问题二相似

<!--结果集映射-->
<resultMap id="studentResultMap" type="cn.bdqn.demo144.entity.Student">
    <!--        id 是查询结果的主键,写上增加查询效率,性能-->
    <id property="studentId" column="studentId"/>
    <!--     实体类的属性名:studentName   结果集的列名:studentName123-->
    <result property="studentName" column="studentName123"/>
 <!--方式二:  通过Id引入resultMap-->
    <collection property="scoreList" resultMap="scoreresultMap">
    </collection>
</resultMap>
<resultMap id="scoreresultMap" type="cn.bdqn.demo144.entity.Score">
    <id property="scoreId" column="scoreId"></id>
    <result property="studentId" column="studentId"/>
    <result property="scoreResult" column="scoreResult"/>
    <result property="subjectId" column="subjectId"/>
    <result property="examDate" column="examDate"/>
</resultMap>

6.接口不同参数类型传递

6.1 单个参数:不用加注解
  int deleteGradeByGradeId(int gradeId);

通过#{gradeId}方式,拼接sql语句,形如:

String sql= “delete from Grade where gradeId = ?”;

preparedStatement.setInt(1,gradeId);

<delete id="deleteGradeByGradeId" parameterType="integer">
    delete
    from Grade
    where gradeId = #{gradeId};
</delete>
6.2 多个参数: 参数名加param注解
//接口方法:
int insertGrade(@param(“gradeId”)int gradeId,@param(“gradeId”)String gradeName);
<insert id="insertGrade">
    insert 
    into Grade
    (gradeId,gradeName) values (#{gradeId},#{gradeName});
</insert>
6.3 引用类型对象
//接口方法:
int insertGrade(Grade grade);
<insert id="insertGrade" parameterType="grade">
    insert 
    into Grade
    <!--gradeId,gradeName为提示的grade对象的属性名-->
    (gradeId,gradeName) values (#{gradeId},#{gradeName});
</insert>
6.4 Map类型参数
//接口方法:
int insertGrade(Map<String,String> map);
<insert id="insertGrade" parameterType="map">
    insert 
    into Grade
    <!--gradeId,gradeName为map的key,引用的是对应的value-->
    (gradeId,gradeName) values (#{gradeId},#{gradeName});
</insert>
6.5 数组、List类型参数,拼接
// 接口方法:参数数组  int studentIdS[]={2,3}
    List<Student> selectStudentListByStudentIds(int [] studentIds);
<!--遍历数组,拼接sql语句:select * from student where studentId in (2,3)-->
    <select id="selectStudentListByStudentIds" resultType="cn.bdqn.demo144.entity.Student">
        select * from student where studentId in
        <!--如果是list集合,此处换成     collection="list" -->
        <foreach collection="array" item="studentId" open="(" close=")" separator=",">
            #{studentId}
        </foreach>
    </select>
6.6 Map类型参数,遍历拼接
//假设map的key为要遍历拼接的studentId    
//注意此处的@Param("map"),必须要加,便于xml映射文件调用
List<Student> selectStudentListByMap(@Param("map") Map<Integer,String> map);
    <select id="selectStudentListByMap" resultType="cn.bdqn.demo144.entity.Student">
        select studentId, studentName123, studentAddress, gradeId, bornDate from myschool.student 
        where studentId in
        <!--map.entrySet()为map的键值对,既包含key,也包含value,其中index代表key,item代表值-->
        <foreach collection="map.entrySet()" index="studentId" item="studentName" open="(" close=")" 		           separator=",">
            #{studentId}
        </foreach>
    </select>

7.动态sql语句(过于简单,不想整理了,望包涵,哈哈)

if标签

choose标签(when、otherwise)

where标签

set标签

trim标签

8.日志配置

8.1 log4j日志配置文件

#log4j.properties配置文件
log4j.rootLogger=debug,stdout

log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%d{yyyy-MM-dd HH/:mm/:ss}]%-5p %c(line/:%L) %x-%m%n

log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=log4jDemo.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss}%l-%F-%p-%m%

#all < debug < info < warn < error < fatal < off
#%p:输出日志信息的优先级
#%d:输出日志时间点的日期或时间
#%r:输出自应用程序启动到输出该log信息耗费的毫秒数
#%t:输出产生该日志事件的线程名。
#%%:输出一个"%"字符。
#%L::输出代码中的行号。
#%F:输出日志消息产生时所在的文件名称。
#%M:输出产生日志信息的方法名。
#%c:输出日志信息所属的类的全名。
#%l:输出日志事件的发生位置

8.2 jar包:以 log4j-1.2.17.jar为例 org.apache.log4j

8.3 mybatis-config.xml设置

<!--配置日志实现-->
        <setting name="logImpl" value="LOG4j"/>

效果:提示sql预编译语句,参数传递,结果

在这里插入图片描述

9.注解方式实现接口 或者 不定义接口,只定义映射文件实现数据库增删改查

9.1注解实现接口

//注解的方式实现接口,映射文件不用编写对应的标签
@Select("select * from myschool.student")
    List<Student> selectStudentList();
@Delete("delete from myschool.student WHERE studentId=#{studentId}")
    int deleteStudentById(int studentId);

9.2直接定义映射文件,不定义接口,sqlSession调用方法

<!--定义修改方法的映射文件,注意参数的名字-->
<update id="updateStudent" parameterType="cn.bdqn.demo144.entity.Student">
        update myschool.student set studentName123=#{studentName} where studentId=#{studentId}
    </update>
		//main方法测试
		Student student = new Student();
        student.setStudentId(2);
        student.setStudentName("周杰伦");
//            调用sqlSession的公共的update方法,注意
//第一个参数为:StudentMapper.xml里面的nameSpace 例:<mapper namespace="cn.bdqn.demo144.mapper.StudentMapper">     //   继续.映射文件的方法id
//第二个参数是映射文件定义的方法所需要的参数
        sqlSession.update("cn.bdqn.demo144.mapper.StudentMapper.updateStudent", student);

10.使用maven构建springboot项目,解决找不到映射文件问题

问题:使用maven构建springboot项目,默认所有的配置文件和资源文件要存放在resources里面,如果初学者习惯上将mapper.xml放在项目的src下的mapper下,默认是找不到这些mapper.xml文件的

解决方案:

1、需要通过修改pom.xml配置,声明xml文件的位置,除了在默认的resources下,还有src下的mapper下,具体操作如下:

在这里插入图片描述

      <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>

            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.yml</include>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>

        </resources>

2、改变使用习惯,将mapper.xml存放在resources下
下:

[外链图片转存中…(img-5e0gR75B-1715831845727)]

      <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>

            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.yml</include>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>

        </resources>

2、改变使用习惯,将mapper.xml存放在resources下

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT攻城狮培训龙哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值