网站seo平台,商城微网站如何做,十大营销案例分析,优畅wordpressMybatis 知识点
1.1 Mybatis 简介
1.1.1 什么是 Mybatis
Mybatis 是一款优秀的持久层框架支持定制化 SQL、存储过程及高级映射Mybatis 几乎避免了所有的 JDBC 代码和手动设置参数以及获取结果集MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO…Mybatis 知识点
1.1 Mybatis 简介
1.1.1 什么是 Mybatis
Mybatis 是一款优秀的持久层框架支持定制化 SQL、存储过程及高级映射Mybatis 几乎避免了所有的 JDBC 代码和手动设置参数以及获取结果集MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO 为数据库中的记录
1.1.2 为什么需要 Mybatis
更方便的将数据存入到数据库中传统的 JDBC 代码太复杂。简化自动化减少了50%以上的代码量比JDBC更简洁Mybatis 的优点 简单易学灵活sql 和代码分离提高了可维护性提供映射标签支持对象与数据库的 orm 字段关系映射提供对象关系映射标签支持对象关系组建维护提供 xml 标签支持编写动态 sql
1.1.3 如何获取 Mybatis
maven 仓库获取
可直接用以下代码引入自己的 maven 仓库中
!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --
dependencygroupIdorg.mybatis/groupIdartifactIdmybatis/artifactIdversion3.5.13/version
/dependencyGithub 获取源码
下载地址Releases · mybatis/mybatis-3 (github.com) 中文文档
可以帮助你更好的了解 Mybatis文档地址mybatis – MyBatis 3 | 入门
1.2 第一个 Mybatis 程序 编写第一个 Mybatis 程序首先需要有一个具体步骤 搭建环境– 导入 Mybatis–编写代码–测试 1.2.1 搭建环境
新建数据库随便添加一张表添加一些数据便于测试 SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS 0;-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS user;
CREATE TABLE user (userId int(11) NOT NULL AUTO_INCREMENT COMMENT 用户id,userName varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 用户名称,userAge varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 用户年龄,PRIMARY KEY (userId) USING BTREE
) ENGINE InnoDB AUTO_INCREMENT 4 CHARACTER SET utf8 COLLATE utf8_general_ci ROW_FORMAT Dynamic;-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO user VALUES (1, 张三, 12);
INSERT INTO user VALUES (2, 李四, 15);
INSERT INTO user VALUES (3, 王五, 18);SET FOREIGN_KEY_CHECKS 1;
创建一个 maven 项目导入三个 maven依赖 mysql驱动mybatisjunit dependencies!-- mybatis --dependencygroupIdorg.mybatis/groupIdartifactIdmybatis/artifactIdversion3.5.13/version/dependency!-- mysql 驱动 --dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion8.0.33/version/dependency!-- junit --dependencygroupIdjunit/groupIdartifactIdjunit/artifactIdversion4.13.2/versionscopetest/scope/dependency/dependencies1.2.2 编写 mybatis 的核心配置文件
在 resources 文件夹新建一个名为 mybatis-config.xml 的 xml 文件 将以下代码粘贴进核心配置文件
?xml version1.0 encodingUTF-8 ?
!DOCTYPE configurationPUBLIC -//mybatis.org//DTD Config 3.0//ENhttps://mybatis.org/dtd/mybatis-3-config.dtd
configurationenvironments defaultdevelopmentenvironment iddevelopmenttransactionManager typeJDBC/dataSource typePOOLEDproperty namedriver value${driver}/property nameurl value${url}/property nameusername value${username}/property namepassword value${password}//dataSource/environment/environmentsmappersmapper resourceorg/mybatis/example/BlogMapper.xml//mappers
/configuration以上 property 标签中的 value 值就是我们在 JDBC 中编写配置文件对应的例如 driver 代表驱动类的位置等等下面按照我自己的项目中的写法示例
?xml version1.0 encodingUTF-8 ?
!DOCTYPE configurationPUBLIC -//mybatis.org//DTD Config 3.0//ENhttps://mybatis.org/dtd/mybatis-3-config.dtd
configurationenvironments defaultdevelopmentenvironment iddevelopmenttransactionManager typeJDBC/dataSource typePOOLEDproperty namedriver valuecom.mysql.cj.jdbc.Driver/property nameurl valuejdbc:mysql://localhost:3306/mybatis?TRUEamp;useUnicodeTRUEamp;characterEncodingUTF-8amp;serverTimezoneGMT%2B8/property nameusername valueroot/property namepassword valueroot//dataSource/environment/environmentsmappersmapper resourceorg/mybatis/example/BlogMapper.xml//mappers
/configuration1.2.3 编写 Mybatis 工具类 每个 Mybatis 的应用都是一个以 SqlSessionFactory 的实例为核心的 SqlSessionFactory 可以通过 SqlSessionFactoryBuilder 来获取 **而 SqlSessionFactoryBuilder 可以从 XML 配置文件来构建出 SqlSessionFactory ** 从 SqlSessionFactory 可以获取 SqlSession 实例 通过 SqlSession 可以直接执行已经映射的 SQL 语句 创建一个 dao 包和 utils 工具包 在 utils 包下创建一个工具类 MybatisUtils 编写 MybatisUtils 类获取 SqlSessionFactory 实例
package com.qiaoer.utils;import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.IOException;
import java.io.InputStream;public class MybatisUtils {private static SqlSessionFactory sqlSessionFactory;static {//获取资源String resource mybatis-config.xml;InputStream inputStream null;try {inputStream Resources.getResourceAsStream(resource);sqlSessionFactory new SqlSessionFactoryBuilder().build(inputStream);} catch (IOException e) {throw new RuntimeException(e);}}
}String resource 的值是刚刚编写的 resource 文件夹下的 xml 文件路径 通过已经获取的 SqlSessionFactory 实例来获取 SqlSession 实例 编写 getSqlSession() 方法来获取 SqlSession 实例
package com.qiaoer.utils;import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.IOException;
import java.io.InputStream;public class MybatisUtils {private static SqlSessionFactory sqlSessionFactory;static {//获取资源String resource mybatis-config.xml;InputStream inputStream null;try {inputStream Resources.getResourceAsStream(resource);sqlSessionFactory new SqlSessionFactoryBuilder().build(inputStream);} catch (IOException e) {throw new RuntimeException(e);}}//获取 SqlSession 实例public static SqlSession getSqlSession(){return sqlSessionFactory.openSession();}
}获取 SqlSession 实例后可以使用 SqlSession 中的很多方法来对数据库进行操作
1.2.4 测试编写代码
编写实体类 User 实体类代码
package com.qiaoer.entity;public class User {private int userId;private String userName;private String userAge;public int getUserId() {return userId;}public void setUserId(int userId) {this.userId userId;}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName userName;}public String getUserAge() {return userAge;}public void setUserAge(String userAge) {this.userAge userAge;}public User() {}public User(int userId, String userName, String userAge) {this.userId userId;this.userName userName;this.userAge userAge;}Overridepublic String toString() {return User{ userId userId , userName userName \ , userAge userAge \ };}
}
编写 dao 接口 UserDao 接口代码
package com.qiaoer.dao;import com.qiaoer.entity.User;import java.util.List;public interface UserDao {//获取所有用户ListUser getUsers();
}
编写 dao 的接口实现类在 Mybatis 中不需要在编写接口的实现类只需要编写一个 xml 文档即可由原来的 UserDaoImpl 转换为一个 UserMapper.xml 文件
?xml version1.0 encodingUTF-8 ?
!DOCTYPE mapperPUBLIC -//mybatis.org//DTD Mapper 3.0//ENhttps://mybatis.org/dtd/mybatis-3-mapper.dtd
mapper namespacecom.qiaoer.dao.UserDao
!-- SQL 语句查询--select idselectBlog resultTypecom.qiaoer.entity.Userselect * from user/select
/mapper其中 mapper namespacecom.qiaoer.dao.UserDao 中的 namespace 的值对应的是要实现的接口类 select idselectBlog resultTypecom.qiaoer.entity.User 中 id 的值为对应的方法名 resultType属性表示返回一个结果 resultType 的值为返回值类型的返回类型对应的实体类 编写完 UserMapper.xml 后需要在 Mybatis 的核心配置文件 mybatis-config.xml 进行 Mapper 注册
?xml version1.0 encodingUTF-8 ?
!DOCTYPE configurationPUBLIC -//mybatis.org//DTD Config 3.0//ENhttps://mybatis.org/dtd/mybatis-3-config.dtd
configurationenvironments defaultdevelopmentenvironment iddevelopmenttransactionManager typeJDBC/dataSource typePOOLEDproperty namedriver valuecom.mysql.cj.jdbc.Driver/property nameurl valuejdbc:mysql://localhost:3306/mybatis?TRUEamp;useUnicodeTRUEamp;characterEncodingUTF-8amp;serverTimezoneGMT%2B8/property nameusername valueroot/property namepassword valueroot//dataSource/environment/environmentsmappersmapper resourcecom/qiaoer/dao/UserMapper.xml//mappers
/configuration这段代码中 mappers 则表现 Mapper 注册每一个 Mapper.xml 文件都需要进行注册resource 属性的值就是对应的 Mapper.xml 文件路径但是这样也存在一定的 资源过滤问题可能会导致你填写的 Mapper.xml 路径找不到**因此需要在我们的 maven 中的 build 中配置 resources 来防止资源导出失败的问题 **将以下代码赋值到自己的 maven 中即可
!--在build中配置resources来防止我们资源导出失败的问题--buildresourcesresourcedirectorysrc/main/resources/directoryincludesinclude**/*.properties/includeinclude**/*.xml/include/includes/resourceresourcedirectorysrc/main/java/directoryincludesinclude**/*.properties/includeinclude**/*.xml/include/includesfilteringtrue/filtering/resource/resources/build测试代码
import com.qiaoer.dao.UserDao;
import com.qiaoer.entity.User;
import com.qiaoer.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import java.util.List;public class Test01 {public static void main(String[] args) {//第一步获取 SqlSession 对象SqlSession sqlSession MybatisUtils.getSqlSession();//方法一:通过 SqlSession 对象获取实现类System.out.println(方法1);UserDao mapper sqlSession.getMapper(UserDao.class);ListUser users mapper.getUsers();for (User user:users) {System.out.println(user);}//直接获取结果ListUser UserLists sqlSession.selectList(com.qiaoer.dao.UserDao.getUsers);System.out.println(方法2);for (User user:UserLists) {System.out.println(user);}//关闭 SqlSessionsqlSession.close();}
}
1.3 Mybatis 中 CRUD 增删改查的标签介绍 在 Mybatis 中编写dao层的实现类的 Mapper.xml 文件中对增删改查的标签进行介绍 1.3.1 select 标签
select 标签主要作用域 sql 语句的查询select 标签语法 select id对应方法 resultType方法的返回值类型 parameterType方法的参数类型查询的 SQL 语句/select**id**对应的 namespace 所对应的 dao 层接口类中的方法名**resultType**Sql 语句执行的返回值**parameterType**参数类型若 sql 语句中的条件需要参数来进行判读则使用 #{参数名}示例如下,若需要通过方法传递过来的参数 id来查询数据
mapper namespacecom.qiaoer.dao.UserDao
!-- SQL 语句查询--select idselectBlog resultTypecom.qiaoer.entity.User parameterTypeintselect * from user where userId#{id}/select
/mapper1.3.2 insert 标签
insert 标签主要作用域 sql 语句的增加数据insert 标签语法 insert id对应方法 parameterType方法的参数类型增加的 SQL 语句/insert当我们的参数是一个对象时在 #{} 当中直接写对象的属性名即可示例
insert idaddUser parameterTypecom.qiaoer.entity.Userinsert into user (userName, userAge) values (#{userName},#{userAge});
/insert其中 #{userName},#{userAge} 两个均是 User 对象的属性名 注意当我们执行 SQL 语句的增删改时都需要开启 SQL 的提交事务否则并不会实际添加 开启提交事务使用 SqlSession 中的 commit() 方法 代码示例
import com.qiaoer.dao.UserDao;
import com.qiaoer.entity.User;
import com.qiaoer.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import java.util.List;public class Test01 {public static void main(String[] args) {//第一步获取 SqlSession 对象SqlSession sqlSession MybatisUtils.getSqlSession();UserDao mapper sqlSession.getMapper(UserDao.class);//执行增加用户mapper.addUser(new User(-1,你好,15));//查询所有用户ListUser users mapper.getUsers();for (User user : users) {System.out.println(user);}//提交事务sqlSession.commit();//关闭 SqlSessionsqlSession.close();}
}1.3.3 update 标签
update 标签主要作用域 sql 语句的修改数据update 标签语法 insert id对应方法 parameterType方法的参数类型修改的 SQL 语句/insert它的参数设置与增加一样执行完毕也需要进行 SQL 的提交事务Mapper.xml 示例
?xml version1.0 encodingUTF-8 ?
!DOCTYPE mapperPUBLIC -//mybatis.org//DTD Mapper 3.0//ENhttps://mybatis.org/dtd/mybatis-3-mapper.dtd
mapper namespacecom.qiaoer.dao.UserDaoupdate idupdateUser parameterTypecom.qiaoer.entity.Userupdate user set userName#{userName} where userId#{userId};/update
/mapper代码示例
import com.qiaoer.dao.UserDao;
import com.qiaoer.entity.User;
import com.qiaoer.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import java.util.List;public class Test01 {public static void main(String[] args) {//第一步获取 SqlSession 对象SqlSession sqlSession MybatisUtils.getSqlSession();UserDao mapper sqlSession.getMapper(UserDao.class);//执行修改 id为1的用户mapper.updateUser(new User(1,Qiaoer,15));//查询所有用户ListUser users mapper.getUsers();for (User user : users) {System.out.println(user);}//提交事务sqlSession.commit();//关闭 SqlSessionsqlSession.close();}
}1.3.3 delete 标签
delete标签主要作用域 sql 语句的修改数据delete标签语法 delete id对应方法 parameterType方法的参数类型删除的 SQL 语句/delete增删改的操作基本一致
1.3.4 多参数传递 Map
当我们的 sql 需要多个参数时而这些参数并不只单单包含某个实体类可以使用 Map 来传递参数Map 传递参数取值时直接使用 key 值来取出 value 值示例在 dao 层接口类中编写方法通过用户年龄及用户姓名查询用户
package com.qiaoer.dao;import com.qiaoer.entity.User;import java.util.List;
import java.util.Map;
import java.util.Objects;public interface UserDao {//通过用户年龄用户姓名查询用户ListUser getUserByUserAgeAndUserName(MapString, Object map);
}
在 Mapper.xml 中编写对应的生成实现类标签
?xml version1.0 encodingUTF-8 ?
!DOCTYPE mapperPUBLIC -//mybatis.org//DTD Mapper 3.0//ENhttps://mybatis.org/dtd/mybatis-3-mapper.dtd
mapper namespacecom.qiaoer.dao.UserDaoselect idgetUserByUserAgeAndUserName resultTypecom.qiaoer.entity.User parameterTypemapselect * from user where userAge#{userAge} and userName#{userName}/select
/mapper其中 #{userAge} 和 #{userName} 都属于 map 的 key 值编写测试类调用方法
import com.qiaoer.dao.UserDao;
import com.qiaoer.entity.User;
import com.qiaoer.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;public class Test01 {public static void main(String[] args) {//获取 SqlSession 对象SqlSession sqlSessionMybatisUtils.getSqlSession();//获取实现类UserDao userDaosqlSession.getMapper(UserDao.class);//创建参数 mapMapString, Object mapnew HashMapString, Object();map.put(userAge,15);map.put(userName,Qiaoer);//调用查询方法ListUser userByUserAgeAndUserName userDao.getUserByUserAgeAndUserName(map);//输出结果for (User user : userByUserAgeAndUserName) {System.out.println(user);}//提交事务sqlSession.commit();//关闭 SqlSessionsqlSession.close();}
}
1.4 配置解析
1.4.1 核心配置文件
核心配置文件一般官方命名为mybatis-config.xmlMyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息核心配置文件的主要结构 configuration配置 properties属性settings设置typeAliases类型别名typeHandlers类型处理器objectFactory对象工厂plugins插件environments环境配置 environment环境变量 transactionManager事务管理器dataSource数据源 databaseIdProvider数据库厂商标识mappers映射器 1.4.2 environments环境配置
MyBatis 可以配置成适应多种环境但是一次只可以选择一种环境示例
?xml version1.0 encodingUTF-8 ?
!DOCTYPE configurationPUBLIC -//mybatis.org//DTD Config 3.0//ENhttps://mybatis.org/dtd/mybatis-3-config.dtd
configurationenvironments defaulttestenvironment iddevelopmenttransactionManager typeJDBC/dataSource typePOOLEDproperty namedriver valuecom.mysql.cj.jdbc.Driver/property nameurl valuejdbc:mysql://localhost:3306/mybatis?TRUEamp;useUnicodeTRUEamp;characterEncodingUTF-8amp;serverTimezoneGMT%2B8/property nameusername valueroot/property namepassword valueroot//dataSource/environmentenvironment idtesttransactionManager typeJDBC/dataSource typePOOLEDproperty namedriver valuecom.mysql.cj.jdbc.Driver/property nameurl valuejdbc:mysql://localhost:3306/mybatis?TRUEamp;useUnicodeTRUEamp;characterEncodingUTF-8amp;serverTimezoneGMT%2B8/property nameusername valueroot/property namepassword valueroot//dataSource/environment/environmentsmappersmapper resourcecom/qiaoer/dao/UserMapper.xml//mappers
/configuration在上方的environments/environments 标签内environment/environment 标签代表不同的环境 environment 标签的属性 id则对应的是自己的环境名称 environments 标签的 属性 default则表示用户要选择哪个环境与environment 标签的属性 id 的值对应 例如上方示例中我的 environments 标签的属性 default 的值为 test 则代表我选择了 环境 environment idtest transactionManager/ 标签为事务管理器 在 MyBatis 中有两种类型的事务管理器也就是 type“[JDBC|MANAGED]”只需记住 MyBatis 的默认的事务管理器为 JDBC 即可 dataSource/dataSource 标签为数据源 大多数 MyBatis 应用程序会按示例中的例子来配置数据源。虽然数据源配置是可选的但如果要启用延迟加载特性就必须配置数据源有三种内建的数据源类型也就是 type“[UNPOOLED|POOLED|JNDI]”MyBatis 的默认的数据源类型为 POOLED
1.4.3 属性properties
可以通过 properties 标签来应用外部的配置文件这些属性可以在外部进行配置并可以进行动态替换示例编写一个 配置文件放入 resources 资源文件下 在 核心配置文件中引入外部配置文件通过 properties/properties 标签引入properties/properties 必须放在 configuration/configuration 标签内部的最顶部示例 properties/properties 标签的 resource 属性则代表配置文件的路径因为引入了外部配置文件所以在下方的 dataSource 标签中可以使用配置文件中的键来调用设置好的属性可以在整个配置文件中用来替换需要动态配置的属性值示例 properties/properties 标签内也可以写入配置信息示例 properties/properties 标签内的子元素和外部配置文件 之间的顺序存在一个优先级顺序如果两个都存在同样的键那么会使用外部的配置文件当中的键对应的值 I] MyBatis 的默认的数据源类型为 POOLED
1.4.3 属性properties
可以通过 properties 标签来应用外部的配置文件这些属性可以在外部进行配置并可以进行动态替换示例编写一个 配置文件放入 resources 资源文件下
[外链图片转存中…(img-q4RXm37z-1690863007343)]
在 核心配置文件中引入外部配置文件通过 properties/properties 标签引入properties/properties 必须放在 configuration/configuration 标签内部的最顶部示例
[外链图片转存中…(img-h8xqCyEL-1690863007343)]
properties/properties 标签的 resource 属性则代表配置文件的路径因为引入了外部配置文件所以在下方的 dataSource 标签中可以使用配置文件中的键来调用设置好的属性可以在整个配置文件中用来替换需要动态配置的属性值示例
[外链图片转存中…(img-OrgPNL0u-1690863007343)]
properties/properties 标签内也可以写入配置信息示例
[外链图片转存中…(img-hqFB60K9-1690863007343)]
properties/properties 标签内的子元素和外部配置文件 之间的顺序存在一个优先级顺序如果两个都存在同样的键那么会使用外部的配置文件当中的键对应的值