【JavaEE】MyBatis

文章目录

    • 1.MyBatis介绍
    • 2.MyBatis快速入门
    • 3.Mapper代理开发
    • 4.MyBatis核心配置文件
    • 5.配置文件完成增删改查
      • 5.1 查询
      • 5.2 添加/修改
      • 5.3 删除
    • 6.MyBatis参数传递
    • 7.注解完成增删改查

1.MyBatis介绍

1.什么是MyBatis?

  • MyBatis是一款优秀的 持久层框架用于简化JDBC开发
  • MyBatis本是 Apache 的一个开源项目 iBatis,2010年这个项目由 apache software foundation 迁移到了 google code,并且改名为 MyBatis。2013年11月迁移到 Github
    官网:https://mybatis.org/mybatis-3/zh/index.html
     

2.持久层

  • 负责将数据到保存到 数据库 的那一层代码
  • JavaEE三层架构:表现层、业务层、持久层
     

3.框架

  • 框架就是一个半成品软件,是一套可重用的、通用的、软件基础代码模型
  • 在框架的基础之上构建软件编写更加高效、规范、通用、可扩展

【JavaEE】MyBatis_第1张图片
【JavaEE】MyBatis_第2张图片

 

2.MyBatis快速入门

查询 user 表中所有数据

【JavaEE】MyBatis_第3张图片

1、添加依赖:
【JavaEE】MyBatis_第4张图片
2、编写mybatis-config.xml配置文件
【JavaEE】MyBatis_第5张图片
3.编写sql语句映射文件(UserMapper.xml)
【JavaEE】MyBatis_第6张图片
4.获取工厂构造的对象,执行sql语句
【JavaEE】MyBatis_第7张图片

 

3.Mapper代理开发

【JavaEE】MyBatis_第8张图片
 【JavaEE】MyBatis_第9张图片

1.定义接口,返回值类型、方法名对应映射文件
【JavaEE】MyBatis_第10张图片
2.maper映射文件放置相同目录下,名称空间为接口全限定名
【JavaEE】MyBatis_第11张图片
3.mapper代理方式mybatis-config.xml可以使用包扫描的方式加载映射文件
【JavaEE】MyBatis_第12张图片
4.获取 Mapper 接口对象,调用相应方法执行sql语句
【JavaEE】MyBatis_第13张图片

 

4.MyBatis核心配置文件

配置的属性应符合以下顺序(官网),否则报错
【JavaEE】MyBatis_第14张图片


DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

    
    <typeAliases>
        <package name="com.eve.pojo"/>
    typeAliases>

    
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql:///mybatis?useSSL=false"/>
                <property name="username" value="root"/>
                <property name="password" value="abc123"/>
            dataSource>
        environment>
        <environment id="test">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql:///testdb?useSSL=false"/>
                <property name="username" value="root"/>
                <property name="password" value="abc123"/>
            dataSource>
        environment>
    environments>
    <mappers>
        
        
        
        <package name="com.eve.mapper"/> 
    mappers>
configuration>

 

5.配置文件完成增删改查

MyBatis动态Sql:
【JavaEE】MyBatis_第15张图片

MyBatisX插件:
【JavaEE】MyBatis_第16张图片

【JavaEE】MyBatis_第17张图片

 

5.1 查询

1、表列和与属性名不一样(resultMap标签)、特殊字符处理(转义字符、CDATA区)


DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.eve.mapper.BrandMapper">

    

    <resultMap id="brandResultMap" type="com.eve.pojo.Brand">
        
        <result column="brand_name" property="brandName"/>
        <result column="company_name" property="companyName"/>
    resultMap>

    <select id="selectAll" resultMap="brandResultMap">
        select *
        from tb_brand;
    select>

    <select id="selectById" resultMap="brandResultMap">
        select *
        from tb_brand where id = #{id};
    select>

    <select id="selectById1" resultMap="brandResultMap">
        select *
        from tb_brand where id
        
        #{id};
    select>

mapper>

 
2、多参数传递(多个参数、对象、集合)

【JavaEE】MyBatis_第18张图片

public class BrandMapperTest {

    @Test
    public void selectByCondition() throws IOException {
        // 接收参数
        int status = 1;
        String companyName = "华为";
        String brandName = "华为";

        // 处理参数
        companyName = "%" + companyName + "%";
        brandName = "%" + brandName + "%";

        // 封装对象
//        Brand brand = new Brand();
//        brand.setStatus(status);
//        brand.setCompanyName(companyName);
//        brand.setBrandName(brandName);

        Map map = new HashMap();
        map.put("status",status);
        map.put("companyName",companyName);
        map.put("brandName",brandName);

        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        BrandMapper mapper = sqlSession.getMapper(BrandMapper.class);

        List<Brand> brands = mapper.selectByCondition(map);
        System.out.println(brands);

    }
}

 
2、动态条件查询

【JavaEE】MyBatis_第19张图片
 
多条件动态查询:
【JavaEE】MyBatis_第20张图片
 
单条件查询:
【JavaEE】MyBatis_第21张图片
【JavaEE】MyBatis_第22张图片

 

5.2 添加/修改

添加:【JavaEE】MyBatis_第23张图片
 
返回主键(两个属性)

【JavaEE】MyBatis_第24张图片
 
修改:
【JavaEE】MyBatis_第25张图片
 
动态修改(set标签)
【JavaEE】MyBatis_第26张图片

 

5.3 删除

【JavaEE】MyBatis_第27张图片
 
批量删除(foreach标签)
【JavaEE】MyBatis_第28张图片

 

6.MyBatis参数传递

【JavaEE】MyBatis_第29张图片
 
封装:

【JavaEE】MyBatis_第30张图片

 
MyBatis封装参数方法源码:

public Object getNamedParams(Object[] args) {
      int paramCount = this.names.size();
       if (args != null && paramCount != 0) {
           if (!this.hasParamAnnotation && paramCount == 1) {
               Object value = args[(Integer)this.names.firstKey()];
               return wrapToMapIfCollection(value, this.useActualParamName ? (String)this.names.get(0) : null);
           } else {
               Map<String, Object> param = new MapperMethod.ParamMap();
               int i = 0;

               for(Iterator var5 = this.names.entrySet().iterator(); var5.hasNext(); ++i) {
                   Map.Entry<Integer, String> entry = (Map.Entry)var5.next();
                   param.put(entry.getValue(), args[(Integer)entry.getKey()]);
                   String genericParamName = "param" + (i + 1);
                   if (!this.names.containsValue(genericParamName)) {
                       param.put(genericParamName, args[(Integer)entry.getKey()]);
                   }
               }

               return param;
           }
       } else {
           return null;
       }
}

 
&、map传递时,如何取出里面的User对象里的username、password值
【JavaEE】MyBatis_第31张图片

<select id="selectBrandByName" resultMap="brandResultMap">
      select *
      from tb_brand
      where brand_name = #{brand.brandName}
      and company_name = #{brand.companyName};
select>

 

7.注解完成增删改查

【JavaEE】MyBatis_第32张图片

使用注解来映射简单语句会使代码显得更加简洁,但对于稍微复杂一点的语句,Java注解不仅力不从心,还会让你本就复杂的SQL语句更加混乱不堪。因此,如果你需要做一些很复杂的操作,最好用XML来映射语句。
 
选择何种方式来配置映射,以及认为是否应该要统一映射语句定义的形式,完全取决于你和你的团队。换句话说,永远不要拘泥于一种方式,你可以很轻松的在基于注解和ML的语句映射方式间自由移植和切换。

你可能感兴趣的:(JavaEE,mybatis,java-ee,java)