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>-->
<!--<!– 告诉mybatis mapper对应的XXXXmapper.xml文件在哪–>-->
<!-- <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>
注意:
- xml映射文件:mapper namespace=""的和对应的接口名一致,如cn.bdqn.demo.mapper.GradeMapper,不能用“/”符号
- 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下