MyBatis的命名空间方式的增删改查操作(二)上

简介: MyBatis的命名空间方式的增删改查操作(二)

一. Mybatis 的官方介绍


MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除 了几乎所有的 JDBC 代码和参数的手工设置以及对结果集的检索。MyBatis 可以使用简单的 XML 或注解用于配置和原始映射,将接口和 Java 的 POJO(Plain Old Java Objects,普通的 Java 对象)映射成数据库中的记录。


现在都是用Mapper 的形式来进行数据库的持久化操作,但是以前的ibatis 形式的 命名空间方式的CRUD ,也需要进行了解。 下面,就进行详细的分析。


二. 查询语句 select


二.一 根据id 查询单个对象


接口:


User getById(int userId);


实现类:


@Override
  public User getById(int userId) {
    SqlSession sqlSession=SqlSessionFactoryUtils.getSession();
    User user=null;
    try{
      user=sqlSession.selectOne("com.yjl.pojo.User.getById",userId);
    }finally{
      sqlSession.close();
    }
    return user;
  }


对应的xml 查询语句:


<select id="getById" parameterType="int" resultType="com.yjl.pojo.User">
    select * from user where id=#{id} 
  </select>


测试方法:


@Test
  public void getByIdTest(){
    UserDao userDao=new UserDaoImpl();
    User user=userDao.getById(1);
    System.out.println(user);
  }


查询对象的时候,如果可以确定 查询的是唯一的对象(包括没有,没有查询出来为null),那么就可以使用selectOne() 来精确的表示出唯一的对象。 后面跟的值, 是名称空间+id的形式, 命名空间来确定是哪一个实体, com.yjl.pojo.User 表示 是User 实体类, getById 表示确定的是getById() 的方法。 其中, id不能重复。


对User.xml 的解释。


namespace 为命名空间,一般是用包名+类名 即全限定名称。 sql 语句的id 一般是方法名,是唯一的,不能重复。 (接口中的方法名可以重载,可以重复,但是id是不能重复的,但一般还是用方法名来写id)。


是查询语句,用的是select parameterType 为参数类型, 是int 型, int 是MyBatis 内置的对象类型, 与Java 中的java.lang.Integer 一致。 Java 类型,MyBatis 类型,数据库类型 ,这三种类型有一种转换的关系。 以后会讲。


resultType 为结果类型, 自定义的类型,要写 全限定名称,如com.yjl.pojo.User, 以后也可以写别名。


其中,#{id} 表示传入的参数 放置到id 里面。 会采用 占位符的方式,转换成

select * from user where id=?, ?传入的参数值为id参数值。


如果传入的值是单个的基本类型值的话,可以用value 来代替。


只能是单个的值,并且是基本类型值。


<select id="getById" parameterType="int" resultType="com.yjl.pojo.User">
    select * from user where id=#{value} 
  </select>


如果传入两个值,如 :


<select id="getById" parameterType="int" resultType="com.yjl.pojo.User">
    select * from user where id=#{value}  and name=#{name}
  </select>


这样是错误的。


二.二 查询全部的记录


接口:


List<User> findAll();


实现类:


@Override
  public List<User> findAll() {
    SqlSession sqlSession=SqlSessionFactoryUtils.getSession();
    List<User> allList=new ArrayList<User>();
    try{
      allList=sqlSession.selectList("com.yjl.pojo.User.findAll");
    }finally{
      sqlSession.close();
    }
    return allList;
  }


对应的xml sql语句


<select id="findAll" resultType="com.yjl.pojo.User">
    select * from user
  </select>


测试方法:


@Test
  public void findAllTest(){
    UserDao userDao=new UserDaoImpl();
    List<User> allList=userDao.findAll();
    allList.forEach(n ->System.out.println(n));
  }


没有传入参数值,那么就不写 参数值, 虽然查询的是一个集合list, 但是返回类型resultType 仍然写 类的全限定名称, MyBatis 会根据调用方法的名称 selectList() 来自动内部构建集合。


注意点:


1.在查询的时候,如果查询的是单个对象的话,也是可以用selectList() 的,只是此时查询出来是一个长度的集合。 但是,如果查询的是多个对象的话,是不能用selectOne() 的,会报错。


@Override
  public List<User> findAll() {
    SqlSession sqlSession=SqlSessionFactoryUtils.getSession();
    List<User> allList=new ArrayList<User>();
    User user=sqlSession.selectOne("com.yjl.pojo.User.findAll");
    allList.add(user);
    return allList;
  }


20190615135833685.png


TooManyResultsException, 太多结果记录异常。


  1. 在查询的时候,除了selectOne(), selectList() 之外,还有其他的查询结果 ,如Map 形式。


20190617211347305.png


  1. 以后,会讲其余的用法。


三. 插入语句 insert


三.一 普通插入


接口:


int insert(User user);


实现类 (错误的形式):


@Override
  public int insert(User user) {
    SqlSession sqlSession=SqlSessionFactoryUtils.getSession();
    int result= sqlSession.insert("com.yjl.pojo.User.insertUser", user);
    sqlSession.close();
    return result;
  }


测试方法:


@Test
  public void insertTest(){
    UserDao userDao=new UserDaoImpl();
    User user=new User();
    user.setName("老蝴蝶");
    user.setAge(25);
    user.setSex("男");
    user.setDescription("这是一个老蝴蝶");
    userDao.insert(user);
    System.out.println("输出信息:"+user);
  }


xml实现类:


<insert id="insertUser" parameterType="com.yjl.pojo.User">
    insert into user(name,age,sex,description) values(#{name},#{age},#{sex}
    ,#{description})
</insert>


传入的参数是 com.yjl.pojo.User 对象, #{name} 表示从对象参数中取出name 的值, #{sex} 表示从对象参数中取出sex的值。


20190617211828918.png

在日志中,执行了插入的语句,但是并没有在数据库中找到这一条记录。


20190617212109723.png


原因是什么, 就是自动提交的问题。 上面把自动提交 改成了false, 那么就需要我们手动提交。


所以,正确的实现方法是:


@Override
  public int insert(User user) {
    SqlSession sqlSession=SqlSessionFactoryUtils.getSession();
    int result= sqlSession.insert("com.yjl.pojo.User.insertUser", user);
    sqlSession.commit();  //手动提交
    sqlSession.close();
    return result;
  }


下面的更新和删除,都要进行手动提交。


这个时候,运行程序:


20190617212357776.png


而数据库中也存在了这一条数据


20190617212614826.png


插入的编号是4, 3的那一条已经被使用了,刚才错误插入的时候。


三.二 插入时获取id


从输出结果中,发现,数据可以插入到数据库中,但是并没有 查询出相应的id 编号。

应该要将id 编号进行取出。 实际开发中,表关联时,常常获取刚才插入表的 id 主键,来进行 关联表的外键关联值。


<!-- 插入记录 ,获取id编号-->
  <insert id="insertUser" parameterType="com.yjl.pojo.User" keyProperty="id" useGeneratedKeys="true">
    insert into user(name,age,sex,description) values(#{name},#{age},#{sex}
    ,#{description})
  </insert>


其中,useGeneratedKeys= true, 表示用主键信息, keyProperty 指定主键 为类属性 为id, 注意,用keyProperty ,不能用keyColumn

此时,运行:


20190617213337632.png


数据库中也存在这条记录, id为5


20190617213402887.png


三.三 数据库查询 id


<!-- 数据库查询,获取id编号-->
  <insert id="insertUser" parameterType="com.yjl.pojo.User">
    <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
      select last_insert_id()
    </selectKey>
    insert into user(name,age,sex,description) values(#{name},#{age},#{sex}
    ,#{description})
  </insert>


顺序 order, 为AFTER, 在插入之后查询。 必须为全大写 AFTER, after 是错误的。


返回类型 resultType, 表示是 主键的类型,为全限定名称, java.lang.Integer,

last_insert_id () 是MySQL 数据库提供的内置查询 方法,自动返回最后一个INSERT或 UPDATE 问询为 AUTO_INCREMENT列设置的第一个 发生的值。



20190617213859324.png


三.四 uuid 形式的主键插入


将id 的类型 改成String 类型,


2019061721404618.png


数据库中id 列的类型也改成varchar 类型。


20190617214742433.png


长度要设置长一点。


将User.xml 中的其他方法 注释掉。


写测试方法:


@Test
  public void insertUUIDTest(){
    UserDao userDao=new UserDaoImpl();
    User user=new User();
    user.setName("老蝴蝶uuid");
    user.setAge(25);
    user.setSex("男");
    user.setDescription("这是一个老蝴蝶uuid 测试");
    userDao.insert(user);
    System.out.println("输出信息:"+user);
  }


xml sql 语句。


<!-- uuid插入,获取id编号-->
  <insert id="insertUser" parameterType="com.yjl.pojo.User">
    <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String">
      select uuid()
    </selectKey>
    <!-- 这个时候,sql 语句就要写id 了。 -->
    insert into user(id,name,age,sex,description) values(#{id},#{name},#{age},#{sex}
    ,#{description})
  </insert>


其中, 查询时顺序 order 就为BEFORE, 在插入之前进行查询, 不能写before ,必须为大写

uuid 的类型是String

select uuid() ,其中 uuid() 为mysl 提供的内置函数 。


插入的sql 语句,就需要写 id 的值了。


20190617214916344.png


数据库中展示:


2019061721493559.png


三.六 序列形式的插入


id 编号 还改成int 类型, 是自动增长, 数据库列id 还改成int 类型 ,自增。注释的sql 解除注释。


跟uuid 之前的操作一样。


没有oracle 客户端,不进行验证了。


<!-- oracle 序列插入,获取id编号-->
  <insert id="insertUser" parameterType="com.yjl.pojo.User">
    <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.Integer">
      select 序列名.nextval() 
    </selectKey>
    <!-- 这个时候,sql 语句就要写id 了。 -->
    insert into user(id,name,age,sex,description) values(#{id},#{name},#{age},#{sex}
    ,#{description})
  </insert>
相关文章
|
7月前
|
XML Java 数据库连接
二、搭建MyBatis采用xml方式,验证CRUD(增删改查操作)
二、搭建MyBatis采用xml方式,验证CRUD(增删改查操作)
216 21
|
7月前
|
人工智能 Java 数据库连接
MyBatis Plus 使用 Service 接口进行增删改查
本文介绍了基于 MyBatis-Plus 的数据库操作流程,包括配置、实体类、Service 层及 Mapper 层的创建。通过在 `application.yml` 中配置 SQL 日志打印,确保调试便利。示例中新建了 `UserTableEntity` 实体类映射 `sys_user` 表,并构建了 `UserService` 和 `UserServiceImpl` 处理业务逻辑,同时定义了 `UserTableMapper` 进行数据交互。测试部分展示了查询、插入、删除和更新的操作方法及输出结果,帮助开发者快速上手 MyBatis-Plus 数据持久化框架。
516 0
mybatis复习02,简单的增删改查,@Param注解多个参数,resultType与resultMap的区别,#{}预编译参数
文章介绍了MyBatis的简单增删改查操作,包括创建数据表、实体类、配置文件、Mapper接口及其XML文件,并解释了`#{}`预编译参数和`@Param`注解的使用。同时,还涵盖了resultType与resultMap的区别,并提供了完整的代码实例和测试用例。
mybatis复习02,简单的增删改查,@Param注解多个参数,resultType与resultMap的区别,#{}预编译参数
|
SQL XML Java
mybatis :sqlmapconfig.xml配置 ++++Mapper XML 文件(sql/insert/delete/update/select)(增删改查)用法
当然,这些仅是MyBatis功能的初步介绍。MyBatis还提供了高级特性,如动态SQL、类型处理器、插件等,可以进一步提供对数据库交互的强大支持和灵活性。希望上述内容对您理解MyBatis的基本操作有所帮助。在实际使用中,您可能还需要根据具体的业务要求调整和优化SQL语句和配置。
208 1
|
缓存 Java 数据库连接
我们后端程序员不是操作MyBatis的CRUD Boy
大家好,我是南哥。一个对Java程序员进阶成长颇有研究的人,今天我们接着新的一篇Java进阶指南。为啥都戏称后端是CRUD Boy?难道就因为天天怼着数据库CRUD吗?要我说,是这个岗位的位置要的就是你CRUD,你不得不CRUD。哪有公司天天能给你搭建高并发、高可用、大数据框架的活呢,一条业务线总要成长吧,慢慢成熟了就要装修工来缝缝补补、美化美化,也就是CRUD的活。不能妄自菲薄CRUD Boy,我们是后端工程师。今天来指南下操作数据库之MyBatis框架。
295 3
我们后端程序员不是操作MyBatis的CRUD Boy
|
Java 数据库连接 数据库
mybatis plus 中增删改查及Wrapper的使用
mybatis plus 中增删改查及Wrapper的使用
602 3
|
SQL 缓存 Java
使用MyBatis优化Java持久层操作
使用MyBatis优化Java持久层操作
|
Java 数据库连接 mybatis
SpringBoot配置Mybatis注意事项,mappers层下的name命名空间,要落实到Dao的video类,resultType要落到bean,配置好mybatis的对应依赖。
SpringBoot配置Mybatis注意事项,mappers层下的name命名空间,要落实到Dao的video类,resultType要落到bean,配置好mybatis的对应依赖。
|
druid Java 数据库连接
SpringBoot项目整合MybatisPlus持久层框架+Druid数据库连接池,以及实现增删改查功能
SpringBoot项目整合MybatisPlus和Druid数据库连接池,实现基本的增删改查功能。
1166 0
|
SQL 缓存 Java
使用MyBatis优化Java持久层操作
使用MyBatis优化Java持久层操作