MyBatis之xml开发and注解开发--实现增删改查功能

简介: MyBatis之xml开发and注解开发--实现增删改查功能

一:注解开发


1.1 通用Mapper和注解可混用,写在同一个接口中


对于一些简单的普通的增删改查,接口可继承通用Mapper进行实现


对于一些复杂的增删改查功能可在接口方法上写明注解sql 开发实现


2.2 通用Mapper(对于单表而言)


2.2.1 准备说明


仅仅适用于单表而言的增删改查


所创建的接口只需继承mapper接口,以及在javaBean类中注释说明表名和主键


       资源:MyBatisUtils工具类  --- > 获得Mapper的会话工厂并进行会话,提交事务回滚事务等操作

package com.czxy.ums.utils;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import tk.mybatis.mapper.common.Mapper;
import tk.mybatis.mapper.common.MySqlMapper;
import tk.mybatis.mapper.entity.Config;
import tk.mybatis.mapper.mapperhelper.MapperHelper;
import java.io.InputStream;
public class MyBatisUtils {
  //会话工厂
  private static SqlSessionFactory factory;
  /**初始化:会话工厂*/
  static{
    try{
      //1、获取资源流
      InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
      //2、获取会话工厂
      factory = new SqlSessionFactoryBuilder().build(is);
    }catch(Exception e){
      throw new RuntimeException(e);
    }
  }
  /**使用ThreadLocal,管理某个线程的SqlSession*/
  private static ThreadLocal<SqlSession> local = new ThreadLocal<SqlSession>();
  /**获取新会话*/
  public static SqlSession openSession(){
    SqlSession session = null;
    session = local.get();
    if(session==null){
      session = factory.openSession();
      //创建一个MapperHelper
      MapperHelper mapperHelper = new MapperHelper();
      //特殊配置
      Config config = new Config();
      // 3.3.1版本增加
      config.setEnableMethodAnnotation(true);
      config.setNotEmpty(true);
      //设置配置
      mapperHelper.setConfig(config);
      // 注册通用Mapper接口 - 可以自动注册继承的接口
      mapperHelper.registerMapper(Mapper.class);
      mapperHelper.registerMapper(MySqlMapper.class);
      //配置完成后,执行下面的操作
      mapperHelper.processConfiguration(session.getConfiguration());
      local.set(session);
    }
    return session;
  }
  /**关闭会话*/
  public static void close(){
    SqlSession session = local.get();
    if(session!=null){
      session.close();
      //不删除会导致线程再次使用到一个关闭的SqlSession会话
      local.remove();
    }
  }
  /**提交并关闭事务*/
  public static void commitAndClose(){
    SqlSession session = local.get();
    if(session!=null){
      session.commit();
      close();
    }
  }
  /**回滚并关闭事务*/
  public static void rollbackAndClose(){
    SqlSession session = local.get();
    if(session!=null){
      session.rollback();
      close();
    }
  }
  /**获取Mapper 
   * 注:若session已被关闭,必须重新调用getMapper获取新的Dao对象
   * */
  public static <T> T getMapper(Class<T> clazz){
    return openSession().getMapper(clazz);
  }
}

图片展示工具类所在idea的位置【可自行定义】

9c1f7937d0fc4eada1ad273ff0eee0ca.png

 步骤:定义接口---》继承Mapper<类名>  --- 》 测试类调用接口中的方法

     

2.2.2步骤

------1. 创建JavaBean并对其进行注释说明表名和主键

ffe5587aa9564a6188794beee68c8124.png

-----2. 创建mapper接口继承mapper类 【Mapper<写与之相关的JavaBean类名>】

       注:接口继承了Mapper,可对单表进行简单查询

               同时接口中还可进行注解开发,在接口上书写注解 sql语句进行复杂查询

68c19ae4b5c346cca515229161d61814.png

------3.编写测试类,直接调用mapper类中的方法进行增删改查 【可供参考】


2.2.3 通用Mapper中的方法


查询方法

方法名


描述


T selectOne(T t)


根据实体中的属性进行查询,只能有一个返回值,有多个结果是抛出异常,查询条件使用等号


List select(T t)


根据实体中的属性值进行查询,查询条件使用等号


List selectAll()


查询全部结果


int selectCount(T t)


根据实体中的属性查询总数,查询条件,使用等号


T selectByPrimaryKey(Object key)


根据主键字段进行查询


boolean existsWhithPrimaryKey(Object key)


根据主键字段查询记录是否存在


List selectByExample(Object example)


根据Example条件进行查询


T selectOneByExample(Object example)


根据Example条件进行查询,只能有一个返回值


int selectCountByExample(Object example)


根据Example条件进行查询记录数


  1. 插入方法


方法名

描述

int insert(T t)

保存一个实体,null的属性也会保存,不会使用数据库默认值

int intsertSelective(T t)

保存一个实体,null的属性不会保存,使用数据库默认值


  1. 更新方法

方法名

描述

int updateByPrimaryKey(T t)

根据主键更新实体全部字段,null值会被更新

int updateByPrimaryKeySelective(T t)

根据主键更新实体中不为null值的字段


删除方法

方法名


描述


int delete(T t)


根据实体属性作为条件进行删除,查询条件使用等号


int deletePrimaryKey(Object key)


根据主键字段进行删除


int deleteByExample(Object example)


根据Example条件删除数据


3.1Mybatis注解sql语句

//查询所有
    @Select("select * from student")   //sql语句
    List<Student> list ();             //接口方法
    //查询指定用户
    @Select("select * from student where sid=#{sid}")
    Student selectById(@Param("sid") String id);
    //添加
    @Insert("insert into student(loginname,studentname,password,gender,major,birth,telephone,hobby,photo,remark) values(#{loginname},#{studentname},#{password},#{gender},#{major},#{birth},#{telephone},#{hobby},#{photo},#{remark})")
    Integer add(Student student);
    //删除
    @Delete("delete from  student where sid=#{sid}")
    Integer delete(@Param("sid") String sid);
    //修改
    @Update("update student set loginname=#{loginname},studentname=#{studentname},password=#{password},gender=#{gender},major=#{major},birth=#{birth},telephone=#{telephone},hobby=#{hobby},photo=#{photo},remark=#{remark} where sid = #{sid}")
    Integer update(Student student);
    //模糊查询
    @Select("select * from student where studentname like #{studentname}")
    List<Student> likeAll(String sid);

3.1.1注意事项:


1.在查询指定条件以及删除时要给予条件 id=#{id}


2.在添加时,添加用户时, 表名后面的()中的字段必须要和数据库保持一致,values中的()尽量, 与表名后面的()字段保持一致;


3.在修改时 set后面的字段 等号(=) 的左边字段必须和数据库保持一致,右边#{}中字段尽量保持一致


3.1.2 多表映射


    ----- 基本字段详解

@Results(id = "设置映射id",value = {
        @Result(property = "javaBean中的属性",column = "数据库中的列"),
        @Result(property = "javaBean中的集合",column = "数据库中的列",many = @Many(select = "要映射的方法全路径名"))
})
many  == 用来映射返回结果是集合,多个用户的字段, 【一对多】
    @Results(id = "可设置自己的id,也可调用已经映射好的id进行引用",value = {
            @Result(property = "javaBean中的属性",column = "数据库中的列"),
            @Result(property = "JavaBean中的对象",column = "数据库中的列",one = @One(select = "要映射返回的方法全路径名"))
    })
 one  == 用来映射返回结果是单个的,一个用户的字段 【多对一】

--- 图集详解 【可供参考】

image.png

二、Mybatis映射xml

4.1.2 准备工作

---------1.导入已经写好的UserMapper.xml

<?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">
<!-- 
  namespace必须为对应dao接口的全类名
 -->
<mapper namespace="com.czxy.demo1.dao.UserDao">
    在此进行SQL语句的编写
  <!--<select id="selectAll" resultType="com.czxy.demo1.domain.User">
    select * from user
  </select> -->
</mapper>

-------2. Mysql核心配置文件进行设置扫描

83482d8592444ac88d9e754c4b4b89ba.png

重点1:动态SQL语句多条件查询

  1. 在按照需求在UserMapper.xml中书写SQL语句【可供参考】

d4c6854aefc24303a49de6cbf8fefcab.png

重点2:动态SQL语句In查询

bccdce6cf5ff413e935b26aa2a41ce3e.png

4.1.3 多表查询映射

  • 相关字段详解
1.resultType = "响应返回的类型"
parameterType = "传入的类型"
resultMap = "根据id调用resultMap中的方法"  
<resultMap id = "id">
  <result property = "javaBean中的一个属性" column = "数据库中的列"/>
</resultMap>  
映射方法,相对于一个子查询,在一个查询里面套 一个子查询
<collection/> collection标签返回多个用户,列,当调用的方法返回的是一个集合时使用该标签  【多对一】
<association/> association标签返回单个用户或列,当调用的方法返回的是一个对象时使用   【一对多】

----  图集详解【可供参考】

9386d088e38c4f9d89ced4dbfa60ebf2.png

图集总结

5970ea732bfc43ccb4693400fc5d3f27.png

相关文章
|
17天前
|
Java 数据库连接 Spring
MyBatis-Plus关键功能使用
通过本文的详细介绍,您可以系统地了解并掌握MyBatis-Plus的关键功能,进一步提高开发效率和代码质量。
55 23
|
30天前
|
前端开发 Java 数据库连接
Java后端开发-使用springboot进行Mybatis连接数据库步骤
本文介绍了使用Java和IDEA进行数据库操作的详细步骤,涵盖从数据库准备到测试类编写及运行的全过程。主要内容包括: 1. **数据库准备**:创建数据库和表。 2. **查询数据库**:验证数据库是否可用。 3. **IDEA代码配置**:构建实体类并配置数据库连接。 4. **测试类编写**:编写并运行测试类以确保一切正常。
56 2
|
2月前
|
SQL Java 数据库连接
MyBatis-Plus高级用法:最优化持久层开发
MyBatis-Plus 通过简化常见的持久层开发任务,提高了开发效率和代码的可维护性。通过合理使用条件构造器、分页插件、逻辑删除和代码生成器等高级功能,可以进一步优化持久层开发,提升系统性能和稳定性。掌握这些高级用法和最佳实践,有助于开发者构建高效、稳定和可扩展的企业级应用。
136 13
|
3月前
|
SQL Java 数据库连接
深入 MyBatis-Plus 插件:解锁高级数据库功能
Mybatis-Plus 提供了丰富的插件机制,这些插件可以帮助开发者更方便地扩展 Mybatis 的功能,提升开发效率、优化性能和实现一些常用的功能。
550 26
深入 MyBatis-Plus 插件:解锁高级数据库功能
|
3月前
|
SQL 缓存 Java
MyBatis如何关闭一级缓存(分注解和xml两种方式)
MyBatis如何关闭一级缓存(分注解和xml两种方式)
125 5
|
4月前
|
Java 数据库连接 容器
Mybatis-Plus核心功能
Mybatis-Plus核心功能
|
4月前
|
前端开发 Java 数据库连接
表白墙/留言墙 —— 中级SpringBoot项目,MyBatis技术栈MySQL数据库开发,练手项目前后端开发(带完整源码) 全方位全步骤手把手教学
本文是一份全面的表白墙/留言墙项目教程,使用SpringBoot + MyBatis技术栈和MySQL数据库开发,涵盖了项目前后端开发、数据库配置、代码实现和运行的详细步骤。
113 0
表白墙/留言墙 —— 中级SpringBoot项目,MyBatis技术栈MySQL数据库开发,练手项目前后端开发(带完整源码) 全方位全步骤手把手教学
|
5月前
|
SQL XML Java
mybatis复习02,简单的增删改查,@Param注解多个参数,resultType与resultMap的区别,#{}预编译参数
文章介绍了MyBatis的简单增删改查操作,包括创建数据表、实体类、配置文件、Mapper接口及其XML文件,并解释了`#{}`预编译参数和`@Param`注解的使用。同时,还涵盖了resultType与resultMap的区别,并提供了完整的代码实例和测试用例。
mybatis复习02,简单的增删改查,@Param注解多个参数,resultType与resultMap的区别,#{}预编译参数
|
5月前
|
SQL 存储 Java
原生JDBC简单实现Mybatis核心功能
本文介绍了在Vertx项目中使用Tdengine时,因缺乏异步JDBC驱动而采用同步驱动结合`vertx.executeBlocking`实现异步查询的方法。文中详细描述了自行开发的一个简易JDBC工具,该工具实现了SQL参数绑定与返回值映射至实体类的功能,简化了原生JDBC的繁琐操作。通过具体示例展示了其实现过程及代码细节,并与原生JDBC进行了对比,突显了其便捷性和实用性。
|
5月前
|
Java 数据库连接 数据格式
【Java笔记+踩坑】Spring基础2——IOC,DI注解开发、整合Mybatis,Junit
IOC/DI配置管理DruidDataSource和properties、核心容器的创建、获取bean的方式、spring注解开发、注解开发管理第三方bean、Spring整合Mybatis和Junit
【Java笔记+踩坑】Spring基础2——IOC,DI注解开发、整合Mybatis,Junit