• Mybatis -- 使用


    目录

     

    官网

    依赖

    简单使用

    Mapper代理方式

    字段属性名映射

    请求参数

    1.普通类型参数

     2.多个参数

    3.对象参数

    4.Map参数

    动态参数

    IF 判断

    Choose判断 

    特殊字符

    插入insert

    更新update

    删除delete

    单个删除

    多个删除

    参数封装

    单个参数

    多个参数

    一对一查询

    一对多查询

    自定义列查询

    注解方式执行SQL

    Idea 辅助工具

    整合Springboot + 分页插件


    官网

    入门_MyBatis中文网

    依赖

    1. <dependency>
    2. <groupId>org.mybatisgroupId>
    3. <artifactId>mybatisartifactId>
    4. <version>3.5.5version>
    5. dependency>
    6. <dependency>
    7. <groupId>mysqlgroupId>
    8. <artifactId>mysql-connector-javaartifactId>
    9. <version>5.1.46version>
    10. dependency>

    引入Logback

    Logback -- 使用_naki_bb的博客-CSDN博客

    简单使用

    配置文件目录结构

     mybatis-config.xml  -- 数据库连接以及Mappers信息

    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. <environments default="development">
    7. <environment id="development">
    8. <transactionManager type="JDBC"/>
    9. <dataSource type="POOLED">
    10. <property name="driver" value="com.mysql.jdbc.Driver"/>
    11. <property name="url" value="jdbc:mysql:///mybatis?useSSL=false"/>
    12. <property name="username" value="root"/>
    13. <property name="password" value="root"/>
    14. dataSource>
    15. environment>
    16. environments>
    17. <mappers>
    18. <mapper resource="UserMapper.xml"/>
    19. mappers>
    20. configuration>

    UserMapper.xml

    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="test">
    6. <select id="selectAll" resultType="com.lb.pojo.User">
    7. select * from tb_user;
    8. select>
    9. mapper>

    测试:

    1. public class MybatisDemo {
    2. public static void main(String[] args) throws IOException {
    3. //加载mybatis配置文件
    4. String resource = "mybatis-config.xml";
    5. InputStream inputStream = Resources.getResourceAsStream(resource);
    6. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    7. //获取sqlSession对象
    8. SqlSession sqlSession = sqlSessionFactory.openSession();
    9. //通过UserMapper.xml中的namespace和id,调用对应的sql
    10. List users = sqlSession.selectList("test.selectAll");
    11. System.out.println(users);
    12. //关闭sqlSession
    13. sqlSession.close();
    14. }
    15. }

    通过入门已经可以使用的mybatis了,但是当Mapper过多时,每个都要添加,以及根据namespace的调用,不是很方便,则使用Mapper代理方式简化配置,以及方法调用

    Mapper代理方式

    注意事项:

    1.定义与SQL映射文件同名的Mapper接口,并且Mapper接口和SQL映射文件放置在同一目录下

    Mapper接口的目录需要和Mapper.xml文件目录一致,并且Resouce下创建文件不能使用“.”分割需要使用文件分隔符,否则编译完成,文件没有在同一目录下

     2.SQL映射文件的namespace属性为Mapper接口的全限定名

     3.在Mapper接口中定义方法,方案名就是SQL映射文件中sql语句的id,并保持参数类型和返回值类型一致

     4.如果Mapper接口名称和SQL映射文件名称相同,并在同一目录下,则可以使用包扫描的方式简化SQL文件的加载

    全部配置如下:

    1. public interface UserMapper {
    2. List selectAll();
    3. User selectById(Integer id);
    4. }

     mybatis-config.xml

    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. <environments default="development">
    7. <environment id="development">
    8. <transactionManager type="JDBC"/>
    9. <dataSource type="POOLED">
    10. <property name="driver" value="com.mysql.jdbc.Driver"/>
    11. <property name="url" value="jdbc:mysql:///mybatis?useSSL=false"/>
    12. <property name="username" value="root"/>
    13. <property name="password" value="root"/>
    14. dataSource>
    15. environment>
    16. environments>
    17. <mappers>
    18. <package name="com.lb.mapper"/>
    19. mappers>
    20. configuration>

     UserMapper.xml

    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.lb.mapper.UserMapper">
    6. <select id="selectAll" resultType="com.lb.pojo.User">
    7. select * from tb_user;
    8. select>
    9. <select id="selectById" parameterType="Integer" resultType="com.lb.pojo.User">
    10. select * from tb_user where id = #{id};
    11. select>
    12. mapper>

    测试:

    1. public class MybatisDemo {
    2. public static void main(String[] args) throws IOException {
    3. //加载mybatis配置文件
    4. String resource = "mybatis-config.xml";
    5. InputStream inputStream = Resources.getResourceAsStream(resource);
    6. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    7. //获取sqlSession对象
    8. SqlSession sqlSession = sqlSessionFactory.openSession();
    9. UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    10. List users = mapper.selectAll();
    11. User user = mapper.selectById(1);
    12. System.out.println(users);
    13. System.out.println(user);
    14. //关闭sqlSession
    15. sqlSession.close();
    16. }
    17. }

    字段属性名映射

    当数据库列名与对象属性名称不一致时,建立映射关系

    1. @Data
    2. public class Brand {
    3. private Integer brandId;
    4. private String brandName;
    5. private String companyName;
    6. private String ordered;
    7. private String description;
    8. private String status;
    9. }
    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.lb.mapper.BrandMapper">
    6. <resultMap id="brandResultMap" type="com.lb.pojo.Brand">
    7. <id column="id" property="brandId"/>
    8. <result column="brand_name" property="brandName"/>
    9. <result column="company_name" property="companyName"/>
    10. resultMap>
    11. <select id="selectAll" resultMap="brandResultMap">
    12. select * from tb_brand;
    13. select>
    14. mapper>

    返回类型 从resultType 替换 成 resultMap

    请求参数

    1.普通类型参数

        Brand selectByBrandId(int id);
    
    1. <select id="selectByBrandId" parameterType="int" resultMap="brandResultMap">
    2. select * from tb_brand where id = #{id};
    3. select>

     2.多个参数

    1. List selectByParameter(
    2. @Param("status") int status,
    3. @Param("brandName") String brandName,
    4. @Param("companyName") String companyName);

     @Param 的 value 和 sql中的参数名必须一致

    1. <select id="selectByParameter" resultMap="brandResultMap">
    2. select * from tb_brand where
    3. status = #{status}
    4. and brand_name like #{brandName}
    5. and company_name like #{companyName}
    6. select>

    3.对象参数

    List selectByBrand(Brand brand);

     对象的属性名必须和sql中的参数名一致

    1. <select id="selectByBrand" resultMap="brandResultMap">
    2. select * from tb_brand where
    3. status = #{status}
    4. and brand_name like #{brandName}
    5. and company_name like #{companyName}
    6. select>

    4.Map参数

    1. Map map = new HashMap();
    2. map.put("status",status);
    3. map.put("brandName",brandName);
    4. map.put("companyName",companyName);
    5. List selectByMap(Map map);
    1. <select id="selectByMap" resultMap="brandResultMap">
    2. select * from tb_brand where
    3. status = #{status}
    4. and brand_name like #{brandName}
    5. and company_name like #{companyName}
    6. select>

    动态参数

    IF 判断

    1. <select id="selectByBrand" resultMap="brandResultMap">
    2. select * from tb_brand
    3. where
    4. <if test="status != null">
    5. status = #{status}
    6. if>
    7. <if test="brandName != null and brandName != ''">
    8. and brand_name like #{brandName}
    9. if>
    10. <if test="companyName != null and companyName != ''">
    11. and company_name like #{companyName}
    12. if>
    13. select>

    上面的sql,可以根据参数值是否存在动态的拼接sql,当除了status没值外,都可以正常运行。

    当status没值时,报错,生成的sql如下

     因为where后的第一个参数不能带有and,所以需要使用 标签来优化,它可以动态检查,看是否需要添加 and 关键字,需要给每一个参数添加 and 关键字

    1. <select id="selectByBrand" resultMap="brandResultMap">
    2. select * from tb_brand
    3. <where>
    4. <if test="status != null">
    5. and status = #{status}
    6. if>
    7. <if test="brandName != null and brandName != ''">
    8. and brand_name like #{brandName}
    9. if>
    10. <if test="companyName != null and companyName != ''">
    11. and company_name like #{companyName}
    12. if>
    13. where>
    14. select>

    Choose判断 

    单一条件成立类似于Java 中的 switch

    1. <select id="selectByBrandSingle" resultMap="brandResultMap">
    2. select * from tb_brand
    3. <where>
    4. <choose>
    5. <when test="status != null">
    6. status = #{status}
    7. when>
    8. <when test="brandName != null and brandName != ''">
    9. brand_name like #{brandName}
    10. when>
    11. <when test="companyName != null and companyName != ''">
    12. company_name like #{companyName}
    13. when>
    14. choose>
    15. where>
    16. select>

    当参数都有值时,也会按照顺序判断,走第一个满足的条件。

    特殊字符

      在xml中 < 是特殊字符
            解决方法:
            1.转义字符 <
            2.  

    插入insert

    void addBrand(Brand brand);
    1. <insert id="addBrand" useGeneratedKeys="true" keyProperty="brandId">
    2. insert into tb_brand (brand_name, company_name, ordered, description, status) values
    3. (#{brandName},#{companyName},#{ordered},#{description},#{status});
    4. insert>

    注意

    要添加 useGeneratedKeys="true" keyProperty="brandId" 设置ID回填,并且设置id的属性名.

    在获取sqlSession时,sqlSessionFactory.openSession默认是手动提交事务,所以insert后需要手动提交,所以

    SqlSession sqlSession = sqlSessionFactory.openSession(true);

    使用以上获取sqlSession设置自动提交为true。则不需要手动提交事务。

    更新update

    1. /**
    2. * @return 影响的行数
    3. */
    4. int updateBrand(Brand brand);
    1. <update id="updateBrand">
    2. update tb_brand
    3. <set>
    4. <if test="brandName != null and brandName != ''">
    5. brand_name = #{brandName},
    6. if>
    7. <if test="companyName != null and companyName != ''">
    8. company_name = #{companyName},
    9. if>
    10. <if test="ordered != null and ordered != ''">
    11. ordered = #{ordered},
    12. if>
    13. <if test="description != null and description != ''">
    14. description = #{description},
    15. if>
    16. <if test="status != null">
    17. status = #{status},
    18. if>
    19. <if test="brandId != null">
    20. id = #{brandId},
    21. if>
    22. set>
    23. where id = #{brandId}
    24. update>

     update可能参数为空,所以使用if标签动态添加,多余的“," set标签会处理。

    为什么我的例子中set标签中会添加一个set id的 if标签,是为了防止当除了id以外其他的所有属性都不存在时,生成update tb_brand where id = ?这个sql,会到报错。所以设置一个恒等的标签,即使所有属性都为空,也不会报错。

    删除delete

    单个删除

    1. // 返回值为删除的个数
    2. int deleteByBrandId(int id);
    1. <delete id="deleteByBrandId">
    2. delete from tb_brand where id = #{id} ;
    3. delete>

    多个删除

    使用循环foreach,如果不使用@Param进行变量命名的化,sql直接写ids是不识别的,mybatis默认的变量名为array,所以如果不适用@Param则使用array来接受数组参数

    1. //返回值是删除的个数
    2. int deleteByIds(@Param("ids") int[] ids);
    1. <delete id="deleteByIds">
    2. delete from tb_brand
    3. where id in
    4. <foreach collection="ids" item="id" separator="," open="(" close=")">
    5. #{id}
    6. foreach>
    7. delete>

    参数封装

    单个参数

    1.POJO 类型: 直接使用,属性名 和参数占位符名称一致

    2.Map集合:直接使用,键名 和 参数占位符名称一致

    3.Collection: 封装成Map集合,可以使用@Param 注解,替换Map集合默认的arg键名

            map.put("arg0",collection集合);

            map.put("collection",collection集合)

    4.List: 封装成Map集合,可以使用@Param 注解,替换Map集合默认的arg键名

            map.put("arg0",list集合);

            map.put("collection",list集合)

            map.put("list",list集合)

    5.Array:封装成Map集合,可以使用@Param 注解,替换Map集合默认的arg键名

            map.put("arg0",数组);

            map.put("array",数组)

    6.其他类型,直接使用

    多个参数

    封装成Map集合,可以使用@Param 注解,替换Map集合默认的arg键名

            map.put("arg0",参数1);

            map.put("param1",参数1);

            map.put("arg1",参数2);

            map.put("param2",参数2);

    --------------------------------------@Param("username")

            map.put("username",参数1);

            map.put("param1",参数1);

            map.put("arg1",参数2);

            map.put("param2",参数2);

    一对一查询

    1. @Data
    2. public class Employee {
    3. private Integer id;
    4. private String name;
    5. private String gender;
    6. private Dept dept;
    7. }
    8. @Data
    9. public class Dept {
    10. private Integer id;
    11. private String name;
    12. }
    13. public interface EmployeeMapper {
    14. List selectAll();
    15. }
    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.lb.mapper.EmployeeMapper">
    6. <resultMap id="employeeResultMap" type="com.lb.pojo.Employee">
    7. <id property="id" column="id">id>
    8. <result property="name" column="name">result>
    9. <result property="gender" column="gender">result>
    10. <association property="dept" javaType="com.lb.pojo.Dept">
    11. <id property="id" column="dept_id">id>
    12. <result property="name" column="dept_name">result>
    13. association>
    14. resultMap>
    15. <select id="selectAll" resultMap="employeeResultMap">
    16. select e.*, d.id dept_id, d.name dept_name from tb_emp e, tb_dept d where e.dept_id = d.id
    17. select>
    18. mapper>

    注意 

    如果resultMap包含association标签,即使其他属性和列名一致,也需要声明,否则映射不到

    一对多查询

    1. @Data
    2. public class Dept {
    3. private Integer id;
    4. private String name;
    5. List employees;
    6. }
    7. @Data
    8. public class Emp {
    9. private Integer id;
    10. private String name;
    11. private String gender;
    12. }
    13. public interface DeptMapper {
    14. List selectAll();
    15. }
    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.lb.mapper.DeptMapper">
    6. <resultMap id="deptResultMap" type="com.lb.pojo.Dept">
    7. <id property="id" column="dept_id"/>
    8. <result property="name" column="dept_name"/>
    9. <collection property="employees" ofType="com.lb.pojo.Emp">
    10. <id property="id" column="id"/>
    11. <result property="name" column="name"/>
    12. <result property="gender" column="gender"/>
    13. collection>
    14. resultMap>
    15. <select id="selectAll" resultMap="deptResultMap">
    16. select d.id dept_id, d.name dept_name, e.* from tb_emp e, tb_dept d where e.dept_id = d.id
    17. select>
    18. mapper>

     注意collection 使用的是ofType属性。

    自定义列查询

    List> selectHotels(String brandNm);
    1. <select id="selectHotels" resultType="java.util.HashMap">
    2. select mchnt_nm, brand_id, brand_nm
    3. from tbl_test_hotel
    4. where brand_nm = #{brandNm,jdbcType=VARCHAR} limit 3
    5. select>

    注解方式执行SQL

    注解的方式只能执行一些简单的sql,如果sql比较复杂还是推荐使用xml的方式进行书写,如果使用注解会产生sql复杂,不易阅读,不易书写等诸多问题

    1. @Select("select * from tb_user where username = #{name}")
    2. User selectByName(String name);
    3. @Insert("insert into tb_user values(null,#{username},#{password},#{gender},#{addr})")
    4. @Options(useGeneratedKeys = true, keyProperty = "id")
    5. int insert(User user);
    6. @Update("update tb_user set username = #{username} where id = #{id}")
    7. int updateUserName(@Param("username") String username, @Param("id") int id);
    8. @Delete("delete from tb_user where id = #{id}")
    9. int delete(int id);

    Idea 辅助工具

    1.连接数据库

    2.安装MybatisX 插件 -- 方便开发

     3.取消mapper.xml中的黄色以及绿色背景

    去掉IDEA生成的mapper.xml中黄色和绿色的背景_一只小程序员啊的博客-CSDN博客_idea xml去掉绿色背景

    整合Springboot + 分页插件

    SpringBoot 整合 Mybatis_naki_bb的博客-CSDN博客

    分页插件:

    SpringBoot整合mybatis+mybatis分页插件_普通网友的博客-CSDN博客_springboot mybatis分页插件

  • 相关阅读:
    Android Jetpack系列(五):LiveData(使用篇)
    redis入门-1-redis概念和基础
    2020华数杯全国大学生数学建模竞赛C题-脱贫帮扶绩效评价(五)(附MATLAB和SPSS代码)
    高频微观结构:日内及隔夜动量因子
    多线程详细介绍
    MySQL binlog时间异常分析
    iperf+natapp做4g模块网络带宽测试
    远程服务调用的简单应用,并轻松解决LinkedHashMap无法转成相关实体类的问题
    Python 的四舍五入的两个方法,你学会了吗?
    python3调用阿里云openapi脚本 - 生产环境
  • 原文地址:https://blog.csdn.net/qq_33753147/article/details/126893719