什么是mybatis

https://mybatis.net.cn/index.html
mybatis是一个用Java编写的持久层框架,它使用ORM实现了结果集的封装。
ORM是Object Relational Mapping 对象关系映射。简单来说,就是把数据库表和实体类及实体类的属性对应起来,让开发者操作实体类就实现操作数据库表,它封装了jdbc操作的很多细节,使开发者只需要关注sql语句本身,而无需关注注册驱动,创建连接等复杂过程。
ORM:Object-Relation-Mapping,也就是对象关系映射,是一种程序设计思想,mybatis就是ORM的一种实现方式,简单来说就是将数据库中查询出的数据映射到对应的实体中。
数据库层框架
1.com.mayikt.servlet或者com.mayikt.controller————控制层 springmvc
2.com.mayikt.service—-业务逻辑层
3.com.mayikt.dao——数据库访问层 hibernate或者mybatis、jpa
1.数据库连接相关配置
2.编写sql语句 jdbc 查询操作 单独取出每个值 在赋值给我们对象

mybatis、springmvc、springboot

使用mybatis orm java中 对象与数据库中表中 字段 对应
底层通过反射机制自动赋值

sql语句 自动形式得出对象
前提 orm

mybatis快速入门

数据库表结构

  1. CREATE TABLE `mayikt_users` (
  2. `id` int NOT NULL AUTO_INCREMENT,
  3. `name` varchar(255) DEFAULT NULL,
  4. PRIMARY KEY (`id`)
  5. ) ENGINE=InnoDB AUTO_INCREMENT=33 DEFAULT CHARSET=utf8mb3;

1.引入mybatis相关依赖 已经完成了
2.mybatis-config.xml(该配置文件名称是可以改) 存放就是我们数据库相关连接信息
3.定义mapper ——编写我们mybatis 相关 sql语句 每个表 对应一个mapper
4.定义java对象—需要注意下 类中的 成员属性与数据库表中字段 映射 默认 类中的 成员属性数据库表中字段名称对应的。
5.使用 mybatis api开始执行该 sql语句即可 得到结果

maven依赖

  1. <dependency>
  2. <groupId>org.mybatis</groupId>
  3. <artifactId>mybatis</artifactId>
  4. <version>3.4.5</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>mysql</groupId>
  8. <artifactId>mysql-connector-java</artifactId>
  9. <version>8.0.18</version>
  10. </dependency>

定义xml配置文件

存放数据库连接信息mybatis-config.xml

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration
  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <configuration>
  6. <environments default="development">
  7. <environment id="development">
  8. <transactionManager type="JDBC"/>
  9. <dataSource type="POOLED">
  10. <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
  11. <property name="url" value="jdbc:mysql://127.0.0.1:3306/mayikt?serverTimezone=GMT%2B8"/>
  12. <property name="username" value="root"/>
  13. <property name="password" value="root"/>
  14. </dataSource>
  15. </environment>
  16. </environments>
  17. <mappers>
  18. <mapper resource="mybatis/userMaaper.xml"/>
  19. </mappers>
  20. </configuration>

Maaper文件

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="userMapper">
  6. <select id="getByUsers" resultType="com.mayikt.entity.UserEntity">
  7. select * from mayikt_users
  8. </select>
  9. </mapper>

测试代码

  1. package com.mayikt.test;
  2. import com.mayikt.entity.UserEntity;
  3. import org.apache.ibatis.io.Resources;
  4. import org.apache.ibatis.session.SqlSession;
  5. import org.apache.ibatis.session.SqlSessionFactory;
  6. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
  7. import java.io.IOException;
  8. import java.io.InputStream;
  9. import java.util.List;
  10. /**
  11. * @author 余胜军
  12. * @ClassName Test01
  13. * @qq 644064779
  14. * @addres www.mayikt.com
  15. * 微信:yushengjun644
  16. */
  17. public class Test01 {
  18. public static void main(String[] args) throws IOException {
  19. // 1.读取加载mybatis-config.xml
  20. String resource = "mybatis-config.xml";
  21. InputStream inputStream = Resources.getResourceAsStream(resource);
  22. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  23. // 2.获取到获取到
  24. SqlSession sqlSession = sqlSessionFactory.openSession();
  25. // 3.根据 mapper id=getByUsers 执行该s ql 语句 通过 sql语句得到我们的对象 orm
  26. List<UserEntity> userEntitys = sqlSession.selectList("getByUsers", UserEntity.class);
  27. System.out.println(userEntitys);
  28. sqlSession.close();
  29. }
  30. }
  1. package com.mayikt.test;
  2. import com.mayikt.entity.UserEntity;
  3. import org.apache.ibatis.io.Resources;
  4. import org.apache.ibatis.session.SqlSession;
  5. import org.apache.ibatis.session.SqlSessionFactory;
  6. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
  7. import java.io.IOException;
  8. import java.io.InputStream;
  9. import java.util.List;
  10. /**
  11. * @author 余胜军
  12. * @ClassName Test01
  13. * @qq 644064779
  14. * @addres www.mayikt.com
  15. * 微信:yushengjun644
  16. */
  17. public class Test01 {
  18. public static void main(String[] args) throws IOException {
  19. // 1.读取加载mybatis-config.xml
  20. String resource = "mybatis-config.xml";
  21. InputStream inputStream = Resources.getResourceAsStream(resource);
  22. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  23. // 2.获取到获取到
  24. SqlSession sqlSession = sqlSessionFactory.openSession();
  25. // 3.根据 mapper id=getByUsers 执行该s ql 语句 通过 sql语句得到我们的对象 orm
  26. List<UserEntity> userEntitys = sqlSession.selectList("getByUsers", UserEntity.class);
  27. System.out.println(userEntitys);
  28. sqlSession.close();
  29. }
  30. }

mapper代理开发模式

1.mapper接口方式开发整合就必须是对应的mapper接口的全限定类名
2.接口中的方法与映射文件中的SQL语句的ID
3.需要在mybatis-config.xml 新增 加载该userMaaper

  1. <mappers>
  2. <mapper resource="mybatis/userMapper.xml"/>
  3. </mappers>

4.定义mapper 接口 需要考虑方法的名称与userMapper.xml的 sql id名称保持一致。

  1. package com.mayikt.mapper;
  2. import com.mayikt.entity.UserEntity;
  3. import java.util.List;
  4. /**
  5. * @author 余胜军
  6. * @ClassName UserMapper
  7. * @qq 644064779
  8. * @addres www.mayikt.com
  9. * 微信:yushengjun644
  10. */
  11. public interface UserMapper {
  12. List<UserEntity> getByUsers();
  13. }
  14. <?xml version="1.0" encoding="UTF-8" ?>
  15. <!DOCTYPE mapper
  16. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  17. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  18. <mapper namespace="com.mayikt.mapper.UserMapper">
  19. <select id="getByUsers" resultType="com.mayikt.entity.UserEntity">
  20. select * from mayikt_users
  21. </select>
  22. </mapper>

5.相关代码

  1. package com.mayikt.test;
  2. import com.mayikt.entity.UserEntity;
  3. import com.mayikt.mapper.UserMapper;
  4. import org.apache.ibatis.io.Resources;
  5. import org.apache.ibatis.session.SqlSession;
  6. import org.apache.ibatis.session.SqlSessionFactory;
  7. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
  8. import java.io.IOException;
  9. import java.io.InputStream;
  10. import java.util.List;
  11. /**
  12. * @author 余胜军
  13. * @ClassName Test01
  14. * @qq 644064779
  15. * @addres www.mayikt.com
  16. * 微信:yushengjun644
  17. */
  18. public class Test01 {
  19. public static void main(String[] args) throws IOException {
  20. // 1.读取加载mybatis-config.xml
  21. String resource = "mybatis-config.xml";
  22. InputStream inputStream = Resources.getResourceAsStream(resource);
  23. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  24. // 2.获取到获取到
  25. SqlSession sqlSession = sqlSessionFactory.openSession();
  26. // 3.根据 mapper id=getByUsers 执行该s ql 语句 通过 sql语句得到我们的对象 orm
  27. // List<UserEntity> userEntitys = sqlSession.selectList("getByUsers", UserEntity.class);
  28. UserMapper mapper = sqlSession.getMapper(UserMapper.class);
  29. System.out.println(mapper.getByUsers());
  30. // System.out.println(userEntitys);
  31. sqlSession.close();
  32. }
  33. }

mybatis增删改查

  1. CREATE TABLE `mayikt_flight` (
  2. `id` int NOT NULL AUTO_INCREMENT COMMENT 'id列',
  3. `flight_id` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '航号',
  4. `company` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '航空公司',
  5. `departure_airport` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '出发机场',
  6. `arrive_airport` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '达到机场',
  7. `departure_time` datetime DEFAULT NULL COMMENT '出发时间',
  8. `arrive_time` datetime DEFAULT NULL COMMENT '到达时间',
  9. `model` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '机型',
  10. `is_delete` int DEFAULT NULL COMMENT '是否隐藏0显示 1隐藏',
  11. PRIMARY KEY (`id`)
  12. ) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8mb3;

查询所有数据

  1. package com.mayikt.entity;
  2. import java.util.Date;
  3. /**
  4. * @author 余胜军
  5. * @ClassName FlightEntity
  6. * @qq 644064779
  7. * @addres www.mayikt.com
  8. * 微信:yushengjun644
  9. */
  10. public class FlightEntity {
  11. private Integer id;
  12. private String flightId;
  13. private String company;
  14. private String departureAirport;
  15. private String arriveAirport;
  16. private Date departureTime;
  17. private Date arriveTime;
  18. private String model;
  19. private Integer isDelete;
  20. @Override
  21. public String toString() {
  22. return "FlightEntity{" +
  23. "id=" + id +
  24. ", flightId='" + flightId + '\'' +
  25. ", company='" + company + '\'' +
  26. ", departureAirport='" + departureAirport + '\'' +
  27. ", arriveAirport='" + arriveAirport + '\'' +
  28. ", departureTime=" + departureTime +
  29. ", arriveTime=" + arriveTime +
  30. ", model='" + model + '\'' +
  31. ", isDelete=" + isDelete +
  32. '}';
  33. }
  34. public Integer getId() {
  35. return id;
  36. }
  37. public void setId(Integer id) {
  38. this.id = id;
  39. }
  40. public String getFlightId() {
  41. return flightId;
  42. }
  43. public void setFlightId(String flightId) {
  44. this.flightId = flightId;
  45. }
  46. public String getCompany() {
  47. return company;
  48. }
  49. public void setCompany(String company) {
  50. this.company = company;
  51. }
  52. public String getDepartureAirport() {
  53. return departureAirport;
  54. }
  55. public void setDepartureAirport(String departureAirport) {
  56. this.departureAirport = departureAirport;
  57. }
  58. public String getArriveAirport() {
  59. return arriveAirport;
  60. }
  61. public void setArriveAirport(String arriveAirport) {
  62. this.arriveAirport = arriveAirport;
  63. }
  64. public Date getDepartureTime() {
  65. return departureTime;
  66. }
  67. public void setDepartureTime(Date departureTime) {
  68. this.departureTime = departureTime;
  69. }
  70. public Date getArriveTime() {
  71. return arriveTime;
  72. }
  73. public void setArriveTime(Date arriveTime) {
  74. this.arriveTime = arriveTime;
  75. }
  76. public String getModel() {
  77. return model;
  78. }
  79. public void setModel(String model) {
  80. this.model = model;
  81. }
  82. public Integer getIsDelete() {
  83. return isDelete;
  84. }
  85. public void setIsDelete(Integer isDelete) {
  86. this.isDelete = isDelete;
  87. }
  88. }
  89. package com.mayikt.mapper;
  90. import com.mayikt.entity.FlightEntity;
  91. import java.util.List;
  92. /**
  93. * @author 余胜军
  94. * @ClassName FlightMapper
  95. * @qq 644064779
  96. * @addres www.mayikt.com
  97. * 微信:yushengjun644
  98. */
  99. public interface FlightMapper {
  100. /**
  101. * 查询
  102. * 1.查询所有
  103. * 2.根据条件查询
  104. * 3.动态查询方式
  105. */
  106. List<FlightEntity> getByFlightAll();
  107. }
  108. package com.mayikt.service;
  109. import com.mayikt.entity.FlightEntity;
  110. import com.mayikt.mapper.FlightMapper;
  111. import org.apache.ibatis.io.Resources;
  112. import org.apache.ibatis.session.SqlSession;
  113. import org.apache.ibatis.session.SqlSessionFactory;
  114. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
  115. import java.io.IOException;
  116. import java.io.InputStream;
  117. import java.util.List;
  118. /**
  119. * @author 余胜军
  120. * @ClassName FlightService
  121. * @qq 644064779
  122. * @addres www.mayikt.com
  123. * 微信:yushengjun644
  124. */
  125. public class FlightService {
  126. private FlightMapper flightMapper;
  127. public FlightService() throws IOException {
  128. // 通过无参构造方法 初始化mybatis 得到flightMapper
  129. // mybatis-config.xml 目录位置
  130. String resource = "mybatis-config.xml";
  131. // 1.解析mybatis-config.xml 得到数据库相关的配置信息
  132. InputStream inputStream = Resources.getResourceAsStream(resource);
  133. //2.创建得到一个sqlSessionFactory
  134. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  135. //3.获取到sqlSession
  136. SqlSession sqlSession = sqlSessionFactory.openSession();
  137. flightMapper = sqlSession.getMapper(FlightMapper.class);
  138. // sqlSession.close();
  139. }
  140. }
  141. <?xml version="1.0" encoding="UTF-8" ?>
  142. <!DOCTYPE configuration
  143. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  144. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  145. <!-- 数据库相关的配置-->
  146. <configuration>
  147. <environments default="development">
  148. <environment id="development">
  149. <transactionManager type="JDBC"/>
  150. <dataSource type="POOLED">
  151. <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
  152. <property name="url" value="jdbc:mysql://127.0.0.1:3306/flight?serverTimezone=GMT%2B8"/>
  153. <property name="username" value="root"/>
  154. <property name="password" value="root"/>
  155. </dataSource>
  156. </environment>
  157. </environments>
  158. <mappers>
  159. <mapper resource="mybatis/flightMapper.xml"/>
  160. </mappers>
  161. </configuration>
  162. <?xml version="1.0" encoding="UTF-8" ?>
  163. <!DOCTYPE mapper
  164. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  165. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  166. <!-- namespace=-->
  167. <mapper namespace="com.mayikt.mapper.FlightMapper">
  168. <select id="getByFlightAll" resultType="com.mayikt.entity.FlightEntity">
  169. select *
  170. from mayikt_flight;
  171. </select>
  172. </mapper>

解决数据库与类中成员属性不一致性

方式1:

使用 sql语句 as的方法 代码会非常重复。

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <!-- namespace=-->
  6. <mapper namespace="com.mayikt.mapper.FlightMapper">
  7. <select id="getByFlightAll" resultType="com.mayikt.entity.FlightEntity">
  8. select id as id,flight_id as flightId,
  9. company as company, departure_airport as departureAirport
  10. ,arrive_airport as arriveAirport, departure_time as departureTime
  11. ,arrive_time as arriveTime,model as model,is_delete as
  12. isDelete
  13. from mayikt_flight;
  14. </select>
  15. </mapper>

方式2:

resultMap 定义数据库表中字段名称与类中成员属性名称 关联映射
数据库字段:flight_id——类中成员名称 flightId

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <!-- namespace=-->
  6. <mapper namespace="com.mayikt.mapper.FlightMapper">
  7. <resultMap id="flightEntityMap" type="com.mayikt.entity.FlightEntity">
  8. <!-- 数据库中字段名称 column="" property="id" 类中成员属性名称-->
  9. <id column="id" property="id"></id>
  10. <result column="flight_id" property="flightId"></result>
  11. <result column="departure_airport" property="departureAirport"></result>
  12. <result column="departure_time" property="departureTime"></result>
  13. <result column="arrive_time" property="arriveTime"></result>
  14. <result column="model" property="model"></result>
  15. <result column="is_delete" property="isDelete"></result>
  16. </resultMap>
  17. <select id="getByFlightAll" resultType="com.mayikt.entity.FlightEntity">
  18. select id as id,flight_id as flightId,
  19. company as company, departure_airport as departureAirport
  20. ,arrive_airport as arriveAirport, departure_time as departureTime
  21. ,arrive_time as arriveTime,model as model,is_delete as
  22. isDelete
  23. from mayikt_flight;
  24. </select>
  25. <!-- 定义数据库中字段名称与我们 类中成员属性值 关联映射-->
  26. <select id="getByFlightAll2" resultMap="flightEntityMap">
  27. select * from mayikt_flight where id=10;
  28. </select>
  29. </mapper>

id查询数据

  1. /**
  2. * 就是根据主键id查询数据
  3. */
  4. FlightEntity getByIdFlight(Integer id);
  5. public FlightEntity getByIdFlight(Integer id) {
  6. return flightMapper.getByIdFlight(id);
  7. }
  8. <!--
  9. parameterType int string Double 自定义对象类型 有处理防止sql语句攻击功能
  10. -->
  11. <select id="getByIdFlight" parameterType="int" resultMap="flightEntityMap">
  12. select * from mayikt_flight where id=#{id};
  13. </select>

插入数据

  1. /**
  2. * 插入数据的结果 如果影响行数 大于0 成功的 否则 就是失败的
  3. *
  4. * @param FlightEntity FlightEntity
  5. * @return
  6. */
  7. int insertFlight(FlightEntity flightEntity);
  8. private FlightMapper flightMapper;
  9. private SqlSession sqlSession;
  10. public FlightService() throws IOException {
  11. // 通过无参构造方法 初始化mybatis 得到flightMapper
  12. // mybatis-config.xml 目录位置
  13. String resource = "mybatis-config.xml";
  14. // 1.解析mybatis-config.xml 得到数据库相关的配置信息
  15. InputStream inputStream = Resources.getResourceAsStream(resource);
  16. //2.创建得到一个sqlSessionFactory
  17. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  18. //3.获取到sqlSession
  19. sqlSession = sqlSessionFactory.openSession();
  20. flightMapper = sqlSession.getMapper(FlightMapper.class);
  21. // sqlSession.close();
  22. }
  23. public List<FlightEntity> getByFlightAll() {
  24. return flightMapper.getByFlightAll();
  25. }
  26. public FlightEntity getByIdFlight(Integer id) {
  27. return flightMapper.getByIdFlight(id);
  28. }
  29. public int insertFlight(FlightEntity flightEntity) {
  30. int result = flightMapper.insertFlight(flightEntity);
  31. // 需要提交事务事务的
  32. sqlSession.commit();// 提交事务
  33. return result;
  34. }
  35. <!--
  36. select标签查询数据
  37. insert标签 插入数据
  38. -->
  39. <insert id="insertFlight" parameterType="com.mayikt.entity.FlightEntity">
  40. INSERT INTO `flight`.`mayikt_flight` (`id`, `flight_id`, `company`, `departure_airport`, `arrive_airport`, `departure_time`, `arrive_time`, `model`, `is_delete`)
  41. VALUES (null, #{flightId}, #{company}, #{departureAirport},#{arriveAirport}, #{departureTime},#{arriveTime},#{model}, #{isDelete});
  42. </insert>

修改数据

  1. int updateFlight(FlightEntity flightEntity);
  2. public int updateFlight(FlightEntity flightEntity) {
  3. int result = flightMapper.updateFlight(flightEntity);
  4. // 需要提交事务事务的 数据增加 update 删除
  5. sqlSession.commit();// 提交事务
  6. return result;
  7. }
  8. <update id="updateFlight" parameterType="com.mayikt.entity.FlightEntity">
  9. UPDATE `flight`.`mayikt_flight` SET `id`=#{id}, `flight_id`=#{flightId}, `company`=#{company},
  10. `departure_airport`=#{departureAirport},
  11. `arrive_airport`=#{arriveAirport}, `departure_time`=#{departureTime},
  12. `arrive_time`=#{arriveTime}, `model`=#{model}, `is_delete`=#{isDelete} WHERE (`id`=#{id});
  13. </update>

删除数据

  1. int deleteByIdFlight(Integer id);
  2. public int deleteByIdFlight(Integer id) {
  3. int result = flightMapper.deleteByIdFlight(id);
  4. // 需要提交事务事务的 数据增加 update 删除
  5. sqlSession.commit();// 提交事务
  6. return result;
  7. }
  8. <delete id="deleteByIdFlight" parameterType="int">
  9. delete from mayikt_flight where id=#{id};
  10. </delete>

MyBatis - 映射文件标签

映射文件的顶级元素

select:映射查询语句
insert:映射插入语句
update:映射更新语句
delete:映射删除语句
sql:可以重用的 sql 代码块
resultMap:最复杂,最有力量的元素,用来描述如何从数据库结果集中加载你的对象
cache:配置给定命名空间的缓存
cache-ref:从其他命名空间引用缓存配置

select 标签的属性信息

  1. <select
  2.   <!--
  3.     1. id(必须配置)
  4.     id是命名空间中的唯一标识符,可被用来代表这条语句
  5.     一个命名空间(namespace)对应一个dao接口
  6.     这个id也应该对应dao里面的某个方法(sql相当于方法的实现),因此id应该与方法名一致
  7.    -->
  8.   id="selectUser"
  9.   <!--
  10.     2. parapeterType(可选配置,默认由mybatis自动选择处理)
  11.     将要传入语句的参数的完全限定名或别名,如果不配置,mybatis会通过ParamterHandler根据参数类型默认选择合适的typeHandler进行处理
  12.     paramterType 主要指定参数类型,可以是int, short, long, string等类型,也可以是复杂类型(如对象)
  13.    -->
  14.   parapeterType="int"
  15.   <!--
  16.     3. resultTyperesultType resultMap 二选一配置)
  17.     用来指定返回类型,指定的类型可以是基本类型,也可以是java容器,也可以是javabean
  18.    -->
  19.   resultType="hashmap"
  20.   
  21.   <!--
  22.     4. resultMapresultType resultMap 二选一配置)
  23.     用于引用我们通过 resultMap 标签定义的映射类型,这也是mybatis组件高级复杂映射的关键
  24.    -->
  25.   resultMap="USER_RESULT_MAP"
  26.   
  27.   <!--
  28.     5. flushCache(可选配置)
  29.     将其设置为true,任何时候语句被调用,都会导致本地缓存和二级缓存被清空,默认值:false
  30.    -->
  31.   flushCache="false"
  32.   <!--
  33.     6. useCache(可选配置)
  34.     将其设置为true,会导致本条语句的结果被二级缓存,默认值:对select元素为true
  35.    -->
  36.   useCache="true"
  37.   <!--
  38.     7. timeout(可选配置)
  39.     这个设置是在抛出异常之前,驱动程序等待数据库返回请求结果的秒数,默认值为:unset(依赖驱动)
  40.    -->
  41.   timeout="10000"
  42.   <!--
  43.     8. fetchSize(可选配置)
  44.     这是尝试影响驱动程序每次批量返回的结果行数和这个设置值相等。默认值为:unset(依赖驱动)
  45.    -->
  46.   fetchSize="256"
  47.   <!--
  48.     9. statementType(可选配置)
  49.     STATEMENT, PREPAREDCALLABLE的一种,这会让MyBatis使用选择Statement, PrearedStatementCallableStatement,默认值:PREPARED
  50.    -->
  51.   statementType="PREPARED"
  52.   <!--
  53.     10. resultSetType(可选配置)
  54.     FORWARD_ONLYSCROLL_SENSITIVE SCROLL_INSENSITIVE 中的一个,默认值为:unset(依赖驱动)
  55.    -->
  56.   resultSetType="FORWORD_ONLY"
  57. ></select>

resultMap 标签的属性信息

  1. <!--
  2.   1. type 对应的返回类型,可以是javabean, 也可以是其它
  3.   2. id 必须唯一, 用于标示这个resultMap的唯一性,在使用resultMap的时候,就是通过id引用
  4.   3. extends 继承其他resultMap标签
  5. -->
  6. <resultMap type="" id="" extends="">  
  7.   <!--
  8.     1. id 唯一性,注意啦,这个id用于标示这个javabean对象的唯一性, 不一定会是数据库的主键(不要把它理解为数据库对应表的主键)
  9.     2. property 属性对应javabean的属性名
  10.     3. column 对应数据库表的列名
  11. (这样,当javabean的属性与数据库对应表的列名不一致的时候,就能通过指定这个保持正常映射了)
  12.    -->
  13.   <id property="" column=""/>
  14.   <!--
  15.     result id相比,对应普通属性
  16.    -->
  17.   <result property="" column=""/>
  18.   <!--
  19.     constructor 对应javabean中的构造方法
  20.    -->
  21.   <constructor>
  22.     <!-- idArg 对应构造方法中的id参数 -->
  23. <idArg column=""/>
  24. <!-- arg 对应构造方法中的普通参数 -->
  25. <arg column=""/>
  26. </constructor>
  27. <!--
  28.     collection 为关联关系,是实现一对多的关键
  29.     1. property javabean中容器对应字段名
  30.     2. ofType 指定集合中元素的对象类型
  31.     3. select 使用另一个查询封装的结果
  32.     4. column 为数据库中的列名,与select配合使用
  33. -->
  34.   <collection property="" column="" ofType="" select="">
  35.     <!--
  36.       当使用select属性时,无需下面的配置
  37.      -->
  38.     <id property="" column=""/>
  39.     <result property="" column=""/>
  40.   </collection>
  41.   <!--
  42.     association 为关联关系,是实现一对一的关键
  43.     1. property javabean中容器对应字段名
  44.     2. javaType 指定关联的类型,当使用select属性时,无需指定关联的类型
  45.     3. select 使用另一个select查询封装的结果
  46.     4. column 为数据库中的列名,与select配合使用
  47.    -->
  48.   <association property="" column="" javaType="" select="">
  49.     <!--
  50.       使用select属性时,无需下面的配置
  51.      -->
  52.     <id property="" column=""/>
  53.     <result property="" column=""/>
  54.   </association>
  55. </resultMap>

insert 标签的属性信息

  1. <insert
  2.   <!--
  3.      select 标签
  4.    -->
  5.   id="insertProject"
  6.   <!--
  7.      select 标签
  8.    -->
  9.   paramterType="projectInfo"
  10.   
  11.   <!--
  12.     1. useGeneratedKeys(可选配置,与 keyProperty 相配合)
  13.     设置为true,并将 keyProperty 属性设为数据库主键对应的实体对象的属性名称
  14.    -->
  15.   useGeneratedKeys="true"
  16.   <!--
  17.     2. keyProperty(可选配置,与 useGeneratedKeys 相配合)
  18.     用于获取数据库自动生成的主键
  19.    -->
  20.   keyProperty="projectId"
  21. >

重用 sql 标签

id,username,password

完全限定名使用别名替代

每个 sql 映射文件的要元素中,都需要指定一个名称空间,用以确保每个映射语句的 id 属性不会重复。如
在 Java 代码中引用某个 sql 映射时,使用的亦是含有名称空间的全路径。如
session.update(“com.mayikt.mapper.UserMapper.udpateUser”, user);

mybatis多条件查询

mybatis多条件查询

第一种方法 传递map 型;
第二种方法:多个参数如果不封装成Map 参数值需要通过,多个参数的时候要使用 @Param 给指定参数,否则会出现找不到参数的错误
第三种方法:传递pojo ; 非常多参数 sql语句中获取参数值名称 与对象成员属性名称需要保持一致

  1. List<FlightEntity> getByIdFlightParameterMap(Map<String, String> parameterMap);
  2. List<FlightEntity> getByIdFlightParameter(@Param("company") String company,
  3. @Param("departureAirport") String departureAirport,
  4. @Param("arriveAirport") String arriveAirport);
  5. List<FlightEntity> getByIdFlightPoJo(FlightEntity flightEntity);
  1. <select id="getByIdFlightParameterMap" resultMap="flightEntityMap">
  2. SELECT * from mayikt_flight where company=#{company}
  3. and departure_airport=#{departureAirport} and arrive_airport=#{arriveAirport};
  4. </select>
  5. <select id="getByIdFlightParameter" resultMap="flightEntityMap">
  6. SELECT * from mayikt_flight where company=#{company}
  7. and departure_airport=#{departureAirport} and arrive_airport=#{arriveAirport};
  8. </select>
  9. <select id="getByIdFlightPoJo" parameterType="com.mayikt.entity.FlightEntity" resultMap="flightEntityMap">
  10. SELECT * from mayikt_flight where company=#{company}
  11. and departure_airport=#{departureAirport} and arrive_airport=#{arriveAirport};
  12. </select>

mybatis动态条件查询

动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL,可以彻底摆脱这种痛苦。
使用动态 SQL 并非一件易事,但借助可用于任何 SQL 映射语句中的强大的动态 SQL 语言,MyBatis 显著地提升了这一特性的易用性。
如果你之前用过 JSTL 或任何基于类 XML 语言的文本处理器,你对动态 SQL 元素可能会感觉似曾相识。在 MyBatis 之前的版本中,需要花时间了解大量的元素。借助功能强大的基于 OGNL 的表达式,MyBatis 3 替换了之前的大部分元素,大大精简了元素种类,现在要学习的元素种类比原来的一半还要少。

  • if
  • choose (when, otherwise)
  • trim (where, set)
  • foreach

mysql 加上输出日志

  1. <settings>
  2. <!-- 打印sql日志 -->
  3. <setting name="logImpl" value="STDOUT_LOGGING" />
  4. </settings>
  5. <?xml version="1.0" encoding="UTF-8" ?>
  6. <!DOCTYPE configuration
  7. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  8. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  9. <!-- 数据库相关的配置-->
  10. <configuration>
  11. <settings>
  12. <!-- 打印sql日志 -->
  13. <setting name="logImpl" value="STDOUT_LOGGING" />
  14. </settings>
  15. <environments default="development">
  16. <environment id="development">
  17. <transactionManager type="JDBC"/>
  18. <dataSource type="POOLED">
  19. <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
  20. <property name="url" value="jdbc:mysql://127.0.0.1:3306/flight?serverTimezone=GMT%2B8"/>
  21. <property name="username" value="root"/>
  22. <property name="password" value="root"/>
  23. </dataSource>
  24. </environment>
  25. </environments>
  26. <mappers>
  27. <mapper resource="mybatis/flightMapper.xml"/>
  28. </mappers>
  29. </configuration>

image.png

```java