MyBatis框架( 项目构建笔记 )

2023-11-07

基本功能实现的项目结构,将SqlSessionFactory 使用工具类进行封装。映射文件的名称要与接口的名称一致,在映射文件中实现接口中定义的方法的sql语句。核心配置文件用于配置数据库连接的基本信息和引入映射文件。

项目结构

(一)框架

Maven导入MyBatis配置

<dependencies>
  <!-- Mybatis核心 -->
  <dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.7</version>
  </dependency>

  <!-- junit测试 -->
  <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
  </dependency>

  <!-- MySQL驱动 -->
  <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.16</version>
  </dependency>
  
  <!-- log4j日志 -->
  <dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
  </dependency>
  
</dependencies>

Log4j日志配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
    <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
        <param name="Encoding" value="UTF-8" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS}%m (%F:%L) \n" />
        </layout>
    </appender>
    <logger name="java.sql">
        <level value="debug" />
    </logger>
    <logger name="org.apache.ibatis">
        <level value="info" />
    </logger>
    <root>
        <level value="debug" />
        <appender-ref ref="STDOUT" />
    </root>
</log4j:configuration>

Mybatis核心配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!--设置连接数据库的环境-->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/test?serverTimezone=UTC"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    <!--引入映射文件-->
    <mappers>
        <package name="mapper/UserMapper.xml"/>
    </mappers>
</configuration>

创建接口

public interface UserMapper {
    int insertUser();
}

映射文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="mybatis.mapper.UserMapper">
    <!--int insertUser();-->
    <insert id="insertUser">
        insert into User values('admin','22','admin')
    </insert>
</mapper>

进行测试

@Test
public void InsertTest() throws IOException {
    // 获取核心配置文件的输入流
    InputStream is = Resources.getResourceAsStream("mybatis-config.xml");

	SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
	SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);

	// 获取sql的会话对象sqlsession,是mybatis提供的操作数据库的对象
    SqlSession sqlSession = sqlSessionFactory.openSession();
    
    // 获取接口的代理实现类对象
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    // 调用mapper接口中的方法
    int result = mapper.insertUser();
    System.out.println("结果:" + result);
    // 提交事务
    sqlSession.commit();
    
    sqlSession.close();

}

使用工具类封装,openSession(true)可以自动提交事务

public static SqlSession getSqlSession(){
    SqlSession sqlSession = null;

    try {
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");

        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
        sqlSession = sqlSessionFactory.openSession(true);
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
    return sqlSession;
}

select 语句返回值的获取(单条,多条)

@Test
public void testSelect(){
    SqlSession sqlSession = SqlSessionUtils.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    User user = mapper.getUsername();
    System.out.println(user);
    sqlSession.close();
}

@Test
public void testSelectAllUser(){
    SqlSession sqlSession = SqlSessionUtils.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    List<User> list = mapper.getAllUser();
    list.forEach(System.out::println);
    sqlSession.close();
}

(二)获取参数

单个参数输入

 <select id="getUsername" resultType="mybatis.pojo.User">
        select * from user where name = #{name}
</select>
@Test
public void testGetUserByName(){
    SqlSession sqlSession = SqlSessionUtils.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    User user = mapper.getUsername("w");
    System.out.println(user);
}

多个参数输入

<select id="checkLogin" resultType="mybatis.pojo.User">
    select * from user where name = #{arg0} and password = #{arg1}
</select>
@Test
public void testCheckLogin(){
    SqlSession sqlSession = SqlSessionUtils.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    User user = mapper.checkLogin("w","123");
    System.out.println(user);
}

map集合类型的参数输入

<select id="checkLoginByMap" resultType="mybatis.pojo.User">
    select * from user where username = #{username} and password = #{password}
</select>
@Test
public void testCheckLoginByMap(){
    SqlSession sqlSession = SqlSessionUtils.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    Map<String, Object> map = new HashMap<>();
    map.put("username","w");
    map.put("password","123");
    User user = mapper.checkLoginByMap(map);
    System.out.println(user);
}

使用param注解

User checkLoginByParam(@Param("username") String username,@Param("password") String password);
<select id="checkLoginByParam" resultType="mybatis.pojo.User">
    select * from user where username = #{username} and password = #{password}
</select>
@Test
public void testCheckLoginByParam(){
    SqlSession sqlSession = SqlSessionUtils.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    User user = mapper.checkLoginByParam("w","123");
    System.out.println(user);
}

(三)查询

创建接口

public interface SelectMapper {
    User1 getUsername(@Param("id") int age);

    List<User1> getAllUser();

    Integer getCount();

    Map<String,Object> getUserByAgeToMap(@Param("id") int age);

    //    List<Map<String,Object>> getAllUserToMap();
    @MapKey("age")
    Map<String,Object> getAllUserToMap();

}

映射文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="mybatis.mapper.SelectMapper">

    <select id="getUsername" resultType="mybatis.pojo.User1">
        select * from t_user where age = #{id}
    </select>


    <select id="getAllUser" resultType="mybatis.pojo.User1">
        select * from t_user
    </select>

    <select id="getCount" resultType="Integer">
        select count(*) from t_user
    </select>

    <select id="getUserByAgeToMap" resultType="map">
        select * from t_user where age = #{id}
    </select>

    <select id="getAllUserToMap" resultType="map">
        select * from t_user
    </select>

</mapper>

测试类

public class SelectMapperTest {

    @Test
    public void testGetUserByAge(){
        SqlSession sqlSession = SqlSessionUtils.getSqlSession();
        SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
        User1 user1 = mapper.getUsername(1);
        System.out.println(user1);
    }

    @Test
    public void testGetAllUser(){
        SqlSession sqlSession = SqlSessionUtils.getSqlSession();
        SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
        List<User1> list = mapper.getAllUser();
        list.forEach(System.out::println);
    }

    @Test
    public void testGetCount(){
        SqlSession sqlSession = SqlSessionUtils.getSqlSession();
        SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
        Integer count = mapper.getCount();
        System.out.println(count);
    }

    @Test
    public void testGetUserToMap(){
        SqlSession sqlSession = SqlSessionUtils.getSqlSession();
        SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
        Map<String,Object> map = mapper.getUserByAgeToMap(1);
        System.out.println(map);
    }

    @Test
    public void testGetAllUserToMap(){
        SqlSession sqlSession = SqlSessionUtils.getSqlSession();
        SelectMapper mapper = sqlSession.getMapper(SelectMapper.class);
        //        List<Map<String,Object>> list = mapper.getAllUserToMap();
        Map<String,Object> map = mapper.getAllUserToMap();
        System.out.println(map);
    }
}

(四)模糊查询、批量删除

public interface SpecialSQLMapper {

    List<Map<String,Object>> getUserByLike(@Param("mohu") String mohu);

    void DeleteMoreUser(@Param("ids") String ids);

}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="mybatis.mapper.SpecialSQLMapper">

  <select id="getUserByLike" resultType="map">
    select * from t_user where name like '%${mohu}%'
  </select>

  <delete id="DeleteMoreUser" >
    delete from t_user where age in(${ids})
  </delete>


</mapper>

测试类

public class SpecialSQLTest {

    @Test
    public void testSpecialSQL(){
        SqlSession sqlSession = SqlSessionUtils.getSqlSession();
        SpecialSQLMapper mapper = sqlSession.getMapper(SpecialSQLMapper.class);
        List<Map<String, Object>> list = mapper.getUserByLike("E");
        System.out.println(list);
    }

    @Test
    public void testDeleteMoreUser(){
        SqlSession sqlSession = SqlSessionUtils.getSqlSession();
        SpecialSQLMapper mapper = sqlSession.getMapper(SpecialSQLMapper.class);
        mapper.DeleteMoreUser("1,2");
    }
}

(五)resultMap和映射关系

在MyBatis核心配置中来处理字段(将下划线映射为驼峰)

<settings>
  <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>

使用resultMap将数据库的字段与实现类匹配

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="mapper.EmpMapper">

  <resultMap id="empResultMap" type="pojo.Emp">
    <id column="emp_id" property="empId"></id>
    <result column="emp_name" property="empName"></result>
    <result column="age" property="age"></result>
    <result column="gender" property="gender"></result>
  </resultMap>


  <select id="getEmpByEmpId" resultMap="empResultMap">
    select * from t_emp where emp_id = #{empId}
  </select>

</mapper>

级联方式处理多对一映射

<resultMap id="empAndDeptResultMap" type="pojo.Emp">
  <id column="emp_id" property="empId"></id>
  <result column="emp_name" property="empName"></result>
  <result column="age" property="age"></result>
  <result column="gender" property="gender"></result>
  <result column="dept_id" property="dept.deptId"></result>
  <result column="dept_name" property="dept.deptName"></result>
</resultMap>

<select id="getEmpAndDeptByEmpId" resultMap="empAndDeptResultMap">
  select t_emp.*,t_dept.*
  from t_emp
  left join t_dept on t_emp.dept_id = t_dept.dept_id
  where t_emp.emp_id = ${empId}
</select>

association:处理实体类类型的属性

<resultMap id="empAndDeptResultMap" type="pojo.Emp">
  <id column="emp_id" property="empId"></id>
  <result column="emp_name" property="empName"></result>
  <result column="age" property="age"></result>
  <result column="gender" property="gender"></result>

  <association property="dept" javaType="pojo.Dept">
    <id column="dept_id" property="deptId"></id>
    <result column="dept_name" property="deptName"></result>
  </association>
</resultMap>

<select id="getEmpAndDeptByEmpId" resultMap="empAndDeptResultMap">
  select t_emp.*,t_dept.*
  from t_emp
  left join t_dept on t_emp.dept_id = t_dept.dept_id
  where t_emp.emp_id = ${empId}
</select>

(五)动态SQL

if标签

public interface dynamic {
    List<Emp> getEmpByCondition(Emp emp);
}
<mapper namespace="dynamic">

  <select id="getEmpByCondition" resultType="Emp">
    select * from t_emp where
    <if test="empName != null and empName != ''">
      emp_name = #{empName}
    </if>
    <if test="age != null and age != ''">
      and age = #{age}
    </if>
    <if test="gender != null and gender != ''">
      and gender = #{gender}
    </if>
  </select>

</mapper>
@Test
    public void TestIf(){
    SqlSession sqlSession = SqlSessionUtils.getSqlSession();
    dynamic mapper = sqlSession.getMapper(dynamic.class);
    Emp emp = new Emp(null,"张三",20,"男");
    List<Emp> list = mapper.getEmpByCondition(emp);
    list.forEach(System.out::println);
}

where标签

<select id="getEmpByCondition" resultType="Emp">
  select * from t_emp
  <where>
    <if test="empName != null and empName != ''">
      emp_name = #{empName}
    </if>
    <if test="age != null and age != ''">
      and age = #{age}
    </if>
    <if test="gender != null and gender != ''">
      and gender = #{gender}
    </if>
  </where>
</select>

trim标签

<select id="getEmpByCondition" resultType="Emp">
  select * from t_emp
  <trim prefix="where" suffixOverrides="and">
    <if test="empName != null and empName != ''">
      emp_name = #{empName} and
    </if>
    <if test="age != null and age != ''">
      age = #{age} and
    </if>
    <if test="gender != null and gender != ''">
      gender = #{gender}
    </if>
  </trim>
</select>

choose、when、otherwise标签

<select id="getEmpByCondition" resultType="Emp">
  select * from t_emp
  <where>
    <choose>
      <when test="empName != null and empName != ''">
        emp_name = #{empName}
      </when>
      <when test="age != null and age != ''">
        age = #{age}
      </when>
      <when test="gender != null and gender != ''">
        gender = #{gender}
      </when>
      <otherwise>
        emp_id = 2
      </otherwise>
    </choose>
  </where>
</select>

foreach标签,用于批量操作

void insertMoreEmp(@Param("emps") List<Emp> emps);

void deleteMoreEmp(@Param("empIds") Integer[] empIds);
<insert id="insertMoreEmp">
  insert into t_emp values
  <foreach collection="emps" item="emp" separator=",">
    (null,#{emp.empName},#{emp.age},#{emp.gender},null)
  </foreach>
</insert>


<delete id="deleteMoreEmp">
  delete from t_emp where emp_id in
  <foreach collection="empIds" item="empId" separator="," open="(" close=")">
    #{empId}
  </foreach>
</delete>
@Test
    public void TestForeach(){
    SqlSession sqlSession = SqlSessionUtils.getSqlSession();
    dynamic mapper = sqlSession.getMapper(dynamic.class);
    Emp emp1 = new Emp(null,"小明1",20,"男");
    Emp emp2 = new Emp(null,"小明1",20,"男");
    Emp emp3 = new Emp(null,"小明1",20,"男");
    List<Emp> list1 = Arrays.asList(emp1, emp2, emp3);
    mapper.insertMoreEmp(list1);
}
@Test
    public void TestForeach2(){
    SqlSession sqlSession = SqlSessionUtils.getSqlSession();
    dynamic mapper = sqlSession.getMapper(dynamic.class);
    Integer[] empIds = new Integer[]{6,7};
    mapper.deleteMoreEmp(empIds);
}

sql标签

<sql id="empColumns">
  emp_id,emp_name,age,gender,dept_id
</sql>

select <include refid="empColumns"></include> from t_emp
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MyBatis框架( 项目构建笔记 ) 的相关文章

随机推荐

  • Python---字典添加元素

    1 8 5 cvar 字典 特点 1 符号 2 关键字 dict 3 保存元素是 key value 一对 定义 dict1 空字典 dict2 dict 空字典 dict3 ID 123156489795 name lucky age 1
  • VUE---7.事件&循环

    目录 一 事件 二 按键 1 按键修饰符 内置 2 自定义修饰符 event key 3 系统修饰符 4 组合修饰符 三 循环 一 事件 1 绑定事件 2 event事件对象 3 修饰符 stop 阻止冒泡 prevent 阻止默认事件 c
  • 华为服务器近端连接显示绿屏,故障诊断说明 - 华为服务器 iMana 200 用户指南 26 - 华为...

    MCE Error Diagnose DIMMxxx memory fault is doubted of this error Error Handling Suggestion Please shut down system and c
  • Rancher2.x入门教程

    1 x教程请参考上篇 容器管理Rancher1 x及监控工具入门 1 简介 为了更好的管理Kubernetes Rancher的大部分功能经过重新设计 并且Rancher2 0延续了大多数1 0版本的友好功能 如简洁的UI和应用商店等 2
  • nohup和screen的比较

    在实际工作中 我们ssh等到远程的Linux上 运行一个程序 但是当我们关闭掉我们的连接终端断开ssh后 刚才运行着的程序也会自动被中断结束 当ssh连接断开后 如何让我们的程序继续在后台运行呢 下面介绍我常使用的两个方法 A 使用nohu
  • Qt简易闹钟

    配置文件 QT core gui texttospeech greaterThan QT MAJOR VERSION 4 QT widgets CONFIG c 11 The following define makes your comp
  • Leetcode 632最小区间

    632 最小区间 难度 困难 标签 哈希表 双指针 字符串 Description 你有 k 个 非递减排列 的整数列表 找到一个 最小 区间 使得 k 个列表中的每个列表至少有一个数包含在其中 我们定义如果 b a lt d c 或者在
  • linux top详解

    语法 root incloudos logs top h procps ng version 3 3 10 Usage top hv bcHiOSs d secs n max u U user p pid s o field w cols
  • nginx服务器

    一 介绍 Nginx engine x 是一个高性能的HTTP和反向代理服务器 也是一个IMAP POP3 SMTP服务 Nginx是由伊戈尔 赛索耶夫为俄罗斯访问量第二的Rambler ru站点 俄文 开发的 第一个公开版本0 1 0发布
  • 【算法/剑指Offer】如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。

    题目描述 如何得到一个数据流中的中位数 如果从数据流中读出奇数个数值 那么中位数就是所有数值排序之后位于中间的数值 如果从数据流中读出偶数个数值 那么中位数就是所有数值排序之后中间两个数的平均值 我们使用Insert 方法读取数据流 使用G
  • Angular4.0_数据绑定和管道

    单向数据绑定 使用插值表达式将一个表达式的值显示在模板上 h1 productTitle h1 事件绑定 使用小括号将组建控制器的一个方法绑定为模板上一个事件的处理器
  • ROS机器人语音模块

    ROS机器人语音模块 文章目录 ROS机器人语音模块 零 乘骐骥以驰骋兮 来吾道夫先路 壹 路漫漫其修远兮 吾将上下而求索 贰 苟余情其信姱以练要兮 长顑颔亦何伤 叁 不吾知其亦已兮 苟余情其信芳 肆 虽体解吾犹未变兮 岂余心之可惩 末 亦
  • 【仿真】Carla介绍与使用 [1] (附代码手把手讲解)

    0 参考与前言 主要介绍无人驾驶的仿真环境CARLA 开源社区维护 以下为相关参考链接 Carla官方文档 建议后续找的时候 先按好版本号 有些功能 api 是新版本里有的 Carla官方github Youtube Python Wind
  • vue css >>> , /deep/ 深度选择器

    vue引用了第三方组件 有时候我们需要改写第三方组件的样式 而又不想去除scoped属性造成组件之间的样式污染 此时只能通过 gt gt gt 穿透scoped 有些Sass 之类的预处理器无法正确解析 gt gt gt 这时可以使用 de
  • stm32 利用链表和定时器动态实现led等器件周期性控制

    stm32 esp8266 ota系列文章 stm32 esp8266 ota 快速搭建web服务器之docker安装openresty stm32 esp8266 ota升级 tcp模拟http stm32 esp8266 ota升级 h
  • 初探 ModBus4j -简单使用指南

    目录 前言 开发环境 工具准备 具体实现 下载Modbus4j 解决空指针异常 解决数组越界 测试 测试环境准备 正式测试 前言 之前提到过 由于项目需求 需要封装 ModBus协议 ModBus协议较早 网上开源开源库也不少 可参见 Mo
  • STM32驱动8266-----8266AP模式

    找了很久 一直没有找到驱动的程序 查一些资料 字写了一个简单程序 记录分享一下 void esp8266 inittcp void printf AT CIPMODE 2 r n 设置AP模式 delay ms 10000 延时函数 pri
  • vue3.0教程——搭建Vue脚手架【简化版】

    目录 哈喽 大家好丫 你们的小郭子又来啦 一 环境要求 1 node安装 前端开发环境 2 vue cli脚手架安装 二 安装依赖 1 使用命令行安装以下依赖 2 通过 vue ui 命令以图形化界面来管理项目依赖 3 导入你刚刚项目的地址
  • 装系统使用默认administrator用户

    在设置键盘布局界面按下Ctrl Shift F4重启 进入系统后 见到一个 系统准备工具 3 14 开始 运行 输入 XCOPY windir System32 svchost exe windir System32 oobe audit
  • MyBatis框架( 项目构建笔记 )

    MyBatis框架 项目构建笔记 一 框架 二 获取参数 三 查询 四 模糊查询 批量删除 五 resultMap和映射关系 五 动态SQL 基本功能实现的项目结构 将SqlSessionFactory 使用工具类进行封装 映射文件的名称要