• Web学习day04


    mybatis


    目录

    mybatis

    文章目录

    一、查询

    1.1结果映射

    1.2多条件查询

    1.3模糊查询

    二、XML

    书写规范

    三、动态SQL

    四、配置文件

    4.1settings标签

    4.2mappers标签

    4.3environments标签

    五、案例

    5.1数据表

    5.2实现类

    5.3mapper实现

    5.4工具类实现

    5.5XML动态SQL实现

    5.6XML配置实现

    5.7测试实现

    5.8pom.xml配置

    总结


    一、查询

    1.1结果映射

    开启驼峰映射:如果字段名与属性名符合驼峰命名规则,mybatis会自动通过驼峰命名规则映射

    字段起别名:SQL语句中,对不一样的列名起别名,别名和实体类属性名一样。

    @Results @Result:通过 @Results@Result 进行手动结果映射。

    1.2多条件查询

    @Param 标注在方法参数的前面,用于声明参数在#{}中的名字

    1.3模糊查询

    ${}性能低,不安全,存在SQL注入问题:

    #{}推荐:

    二、XML

    书写规范

    XML文件的名称与Mapper接口名称一致,并且放置在相同包下(同包同名)。

    XML文件的namespace属性为Mapper接口全限定名一致。

    XML文件中sql语句的id与Mapper 接口中的方法名一致。

    XML文件中sql语句的返回类型与Mapper 接口中的方法返回类型一致。

    三、动态SQL

    用于判断条件是否成立,如果条件为true,则拼接SQL

    where 元素只会在子元素有内容的情况下才插入where子句

    而且会自动去除子句的开头的AND OR

    动态地在行首插入SET关键字,并会删掉额外的逗号(用在update语句中)

    用来批量处理的 比如批量删除拼接 in后面的值

    定义一个sql片段 就是提取公共的sql

    引入sql片段

    四、配置文件

    4.1settings标签

    控制一些全局配置项的开闭

    4.2mappers标签

    加载Mapper接口位置

    4.3environments标签

    Druid(德鲁伊):  阿里巴巴提供的数据库连接池技术,国内使用率很高,提供了完善的监控机制

    HikariCP:  日本人开发的连接池技术,号称性能之王,速度最快,SpringBoot2.0默认使用此连接池

    五、案例

    5.1数据表

    5.2实现类

    代码如下(示例):

    1. import lombok.AllArgsConstructor;
    2. import lombok.Data;
    3. import lombok.NoArgsConstructor;
    4. import java.time.LocalDate;
    5. import java.time.LocalDateTime;
    6. @Data
    7. @NoArgsConstructor
    8. @AllArgsConstructor
    9. public class Emp {
    10. private Integer id;
    11. private String username;
    12. private String password;
    13. private String name;
    14. private Short gender;
    15. private String image;
    16. private Short job;
    17. //注意:这四个属性跟数据表中的字段不一致
    18. private LocalDate ed;
    19. private Integer deptId;
    20. private LocalDateTime createTime;
    21. private LocalDateTime updateTime;
    22. }

    5.3mapper实现

    代码如下:

    1. import org.apache.ibatis.annotations.Param;
    2. import org.apache.ibatis.annotations.Result;
    3. import org.apache.ibatis.annotations.Results;
    4. import org.apache.ibatis.annotations.Select;
    5. import java.time.LocalDate;
    6. import java.util.Date;
    7. import java.util.List;
    8. public interface EmpMapper {
    9. @Select("select * from emp")
    10. public List findAll();
    11. @Select("select * from emp")
    12. public List findAll1();
    13. @Select("select id,username,password,name,gender,image,job,entrydate ed,dept_id,create_time,update_time from emp")
    14. public List findAll2();
    15. @Select("select * from emp")
    16. @Results({
    17. @Result(column = "entrydate",property = "ed")
    18. })
    19. public List findAll3();
    20. @Select("select * from emp where name =#{name} and gender = #{gender} and entrydate between #{begin} and #{end} ")
    21. @Results({
    22. @Result(column = "entrydate",property = "ed")
    23. })
    24. public List findByCondition(@Param("name") String name,@Param("gender") Integer gender,@Param("begin") LocalDate begin,@Param("end") LocalDate end);
    25. @Select("select * from emp where name like concat('%',#{name},'%') and gender = #{gender} and entrydate between #{begin} and #{end} ")
    26. @Results({
    27. @Result(column = "entrydate",property = "ed")
    28. })
    29. public List findByCondition2(@Param("name") String name,@Param("gender") Integer gender,@Param("begin") LocalDate begin,@Param("end") LocalDate end);
    30. public Emp findById(Integer id);
    31. List findByCondition3(@Param("name") String name,@Param("gender") Short gender,@Param("begin") LocalDate begin,@Param("end") LocalDate end);
    32. void update(Emp emp);
    33. void deleteByIds(@Param("ids") List ids);
    34. }

    5.4工具类实现

    代码如下:

    1. import org.apache.ibatis.io.Resources;
    2. import org.apache.ibatis.session.SqlSession;
    3. import org.apache.ibatis.session.SqlSessionFactory;
    4. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    5. import java.io.InputStream;
    6. public class MybatisUtil {
    7. private static SqlSessionFactory sqlSessionFactory = null;
    8. //保证SqlSessionFactory仅仅创建一次
    9. static {
    10. try {
    11. //读取配置文件
    12. InputStream stream = Resources.getResourceAsStream("SqlMapConfig.xml");
    13. //创建SqlSessionFactory
    14. sqlSessionFactory = new SqlSessionFactoryBuilder().build(stream);
    15. } catch (Exception e) {
    16. e.printStackTrace();
    17. }
    18. }
    19. //获取sqlSession
    20. public static SqlSession getSqlSession() {
    21. return sqlSessionFactory.openSession();
    22. }
    23. //提交事务 关闭sqlSession
    24. public static void close(SqlSession sqlSession) {
    25. if (sqlSession != null) {
    26. //提交事务
    27. sqlSession.commit();
    28. //释放资源
    29. sqlSession.close();
    30. }
    31. }
    32. }

    5.5XML动态SQL实现

    代码如下:

    1. "1.0" encoding="UTF-8" ?>
    2. mapper
    3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    5. <mapper namespace="com.itheima.mapper.EmpMapper">
    6. <sql id="mySql">
    7. select * from emp
    8. sql>
    9. <resultMap id="MyMap" type="com.itheima.domain.Emp">
    10. <result column="entrydate" property="ed"/>
    11. resultMap>
    12. <select id="findById" resultMap="MyMap">
    13. <include refid="mySql"/>
    14. where id = #{id}
    15. select>
    16. <select id="findByCondition3" resultType="com.itheima.domain.Emp">
    17. <include refid="mySql"/>
    18. <where>
    19. <if test="name != null and name !=''">
    20. name like concat('%',#{name},'%')
    21. if>
    22. <if test="gender != null">
    23. and gender = #{gender}
    24. if>
    25. <if test="begin != null and end != null">
    26. and entrydate between #{begin} and #{end}
    27. if>
    28. where>
    29. select>
    30. <update id="update">
    31. update emp
    32. <set>
    33. <if test="username != null and username != ''">
    34. username = #{username},
    35. if>
    36. <if test="password != null and password != ''">
    37. password = #{password},
    38. if>
    39. <if test="name != null and name != ''">
    40. name = #{name},
    41. if>
    42. <if test="gender != null">
    43. gender = #{gender},
    44. if>
    45. <if test="image != null and image != ''">
    46. image = #{image},
    47. if>
    48. <if test="job != null">
    49. job = #{job},
    50. if>
    51. <if test="ed != null">
    52. entrydate = #{ed},
    53. if>
    54. <if test="deptId != null">
    55. dept_id = #{deptId},
    56. if>
    57. <if test="createTime != null">
    58. create_time = #{createTime},
    59. if>
    60. <if test="updateTime != null">
    61. update_time = #{updateTime},
    62. if>
    63. set>
    64. where id = #{id}
    65. update>
    66. <delete id="deleteByIds">
    67. delete from emp where id in
    68. <foreach collection="ids" item="id" separator="," open="(" close=")">
    69. #{id}
    70. foreach>
    71. delete>
    72. mapper>

    5.6XML配置实现

    代码如下:

    1. "1.0" encoding="UTF-8" ?>
    2. configuration
    3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
    5. <configuration>
    6. <settings>
    7. <setting name="mapUnderscoreToCamelCase" value="true"/>
    8. <setting name="logImpl" value="STDOUT_LOGGING"/>
    9. settings>
    10. <environments default="development">
    11. <environment id="development">
    12. <transactionManager type="JDBC"/>
    13. <dataSource type="POOLED">
    14. <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
    15. <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
    16. <property name="username" value="root"/>
    17. <property name="password" value="root"/>
    18. dataSource>
    19. environment>
    20. environments>
    21. <mappers>
    22. <package name="com.itheima.mapper"/>
    23. mappers>
    24. configuration>

    5.7测试实现

    代码如下:

    1. package com.itheima.test;
    2. import com.itheima.domain.Emp;
    3. import com.itheima.mapper.EmpMapper;
    4. import com.itheima.util.MybatisUtil;
    5. import org.apache.ibatis.session.SqlSession;
    6. import org.junit.Test;
    7. import java.time.LocalDate;
    8. import java.time.LocalDateTime;
    9. import java.util.Arrays;
    10. import java.util.List;
    11. public class EmpMapperTest {
    12. // 测试查询所有
    13. @Test
    14. public void testFindAll(){
    15. SqlSession sqlSession = MybatisUtil.getSqlSession();
    16. EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);
    17. List empList = empMapper.findAll();
    18. for (Emp emp : empList) {
    19. System.out.println(emp);
    20. }
    21. MybatisUtil.close(sqlSession);
    22. }
    23. // 测试结果集映射开启驼峰命名规则
    24. @Test
    25. public void testFindAll1(){
    26. SqlSession sqlSession = MybatisUtil.getSqlSession();
    27. EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);
    28. List empList = empMapper.findAll1();
    29. for (Emp emp : empList) {
    30. System.out.println(emp);
    31. }
    32. MybatisUtil.close(sqlSession);
    33. }
    34. // 测试结果集映射起别名
    35. @Test
    36. public void testFindAll2(){
    37. SqlSession sqlSession = MybatisUtil.getSqlSession();
    38. EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);
    39. List empList = empMapper.findAll2();
    40. for (Emp emp : empList) {
    41. System.out.println(emp);
    42. }
    43. MybatisUtil.close(sqlSession);
    44. }
    45. // 测试结果集映射手动结果映射@Results @Result
    46. @Test
    47. public void testFindAll3(){
    48. SqlSession sqlSession = MybatisUtil.getSqlSession();
    49. EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);
    50. List empList = empMapper.findAll3();
    51. for (Emp emp : empList) {
    52. System.out.println(emp);
    53. }
    54. MybatisUtil.close(sqlSession);
    55. }
    56. // 测试条件查询
    57. @Test
    58. public void testFindCondition(){
    59. SqlSession sqlSession = MybatisUtil.getSqlSession();
    60. EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);
    61. List empList = empMapper.findByCondition("张三丰",1, LocalDate.of(2000,1,1),LocalDate.of(2020,1,1));
    62. for (Emp emp : empList) {
    63. System.out.println(emp);
    64. }
    65. MybatisUtil.close(sqlSession);
    66. }
    67. // 测试模糊查询
    68. @Test
    69. public void testFindCondition2(){
    70. SqlSession sqlSession = MybatisUtil.getSqlSession();
    71. EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);
    72. List empList = empMapper.findByCondition2("张",1, LocalDate.of(2000,1,1),LocalDate.of(2020,1,1));
    73. for (Emp emp : empList) {
    74. System.out.println(emp);
    75. }
    76. MybatisUtil.close(sqlSession);
    77. }
    78. // 测试根据id查询
    79. @Test
    80. public void testFindById(){
    81. SqlSession sqlSession = MybatisUtil.getSqlSession();
    82. EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);
    83. Emp emp1 = empMapper.findById(4);
    84. System.out.println(emp1);
    85. MybatisUtil.close(sqlSession);
    86. }
    87. //条件查询
    88. @Test
    89. public void testFindByCondition() {
    90. SqlSession sqlSession = MybatisUtil.getSqlSession();
    91. EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);
    92. //List empList = empMapper.findByCondition3("张", (short) 1, LocalDate.of(2002, 01, 01), LocalDate.of(2023, 12, 31));
    93. //List empList = empMapper.findByCondition3("张", (short) 1, null, null);
    94. List empList = empMapper.findByCondition3("", (short) 1, null, null);
    95. empList.forEach(e -> System.out.println(e));//lambda方式打印
    96. MybatisUtil.close(sqlSession);
    97. }
    98. //更新
    99. @Test
    100. public void testUpdate() {
    101. SqlSession sqlSession = MybatisUtil.getSqlSession();
    102. EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);
    103. Emp emp = new Emp();
    104. emp.setId(2);
    105. emp.setUsername("haha2");
    106. emp.setName("sdnajn");
    107. emp.setGender( (short) 1);
    108. emp.setImage("haha.jpg");
    109. emp.setJob((short) 2);
    110. emp.setDeptId(1);
    111. emp.setCreateTime(LocalDateTime.of(2023, 1, 1, 1, 1,1));
    112. emp.setUpdateTime(LocalDateTime.now());
    113. empMapper.update(emp);
    114. MybatisUtil.close(sqlSession);
    115. }
    116. //批量删除
    117. @Test
    118. public void deleteByIds() {
    119. SqlSession sqlSession = MybatisUtil.getSqlSession();
    120. EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);
    121. empMapper.deleteByIds(Arrays.asList(13, 14, 15));
    122. MybatisUtil.close(sqlSession);
    123. }
    124. }

    5.8pom.xml配置

    1. "1.0" encoding="UTF-8"?>
    2. <project xmlns="http://maven.apache.org/POM/4.0.0"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    5. <modelVersion>4.0.0modelVersion>
    6. <groupId>com.itheimagroupId>
    7. <artifactId>day04-01-mybatisartifactId>
    8. <version>1.0-SNAPSHOTversion>
    9. <properties>
    10. <maven.compiler.source>17maven.compiler.source>
    11. <maven.compiler.target>17maven.compiler.target>
    12. properties>
    13. <dependencies>
    14. <dependency>
    15. <groupId>mysqlgroupId>
    16. <artifactId>mysql-connector-javaartifactId>
    17. <version>8.0.28version>
    18. dependency>
    19. <dependency>
    20. <groupId>org.mybatisgroupId>
    21. <artifactId>mybatisartifactId>
    22. <version>3.5.9version>
    23. dependency>
    24. <dependency>
    25. <groupId>junitgroupId>
    26. <artifactId>junitartifactId>
    27. <version>4.13.2version>
    28. <scope>testscope>
    29. dependency>
    30. <dependency>
    31. <groupId>org.projectlombokgroupId>
    32. <artifactId>lombokartifactId>
    33. <version>1.18.26version>
    34. dependency>
    35. dependencies>
    36. project>

    总结

    以上就是今天学习的内容。

  • 相关阅读:
    MAXScript - tyFlow for 3dsMax
    spring bean管理2
    Jenkins安装
    Grafana 系列-GaC-2-Grafana Terraform Provider 基础
    首发Yolov8优化:Adam该换了!斯坦福最新Sophia优化器,比Adam快2倍 | 2023.5月斯坦福最新成果
    最新SQL注入漏洞修复建议
    高性能数据访问中间件 OBProxy(四):一文讲透连接管理
    SOME/IP TTL 在各种Entry 中各是什么意思?有什么限制?
    架构师范文(AI写作)两篇
    Linux下Cmake安装或版本更新
  • 原文地址:https://blog.csdn.net/filthy555/article/details/140406602