使用Mybatis对数据库进行单表操作的实现示例

简介

该篇文章主要是介绍如何使用MyBatis对Mysql数据库进行单表操作(对于mybatis的下载以及配置文件的作用和具体信息,我在上一篇文章中也已经提到了),使用的环境如下:

  • JDK版本:1.8
  • 编译器:IDEA2019
  • JDBC版本:8.0.18
  • mybatis版本:3.5.3

配置文件

首先需要有两个配置文件,一个是configuration.xml文件,配置的是连接数据库的环境以及对于mapper.xml文件的映射,还有另一个文件就是mapper.xml,这个文件主要是用来写sql语句的

configuration.xml文件

<?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="e1">
    <environment id="e1">
      <transactionManager type="JDBC"></transactionManager>
      <dataSource type="POOLED">
        <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/bank?serverTimezone=CST"/>
        <property name="username" value="root"/>
        <property name="password" value="123456"/>
      </dataSource>
    </environment>
    <environment id="e2">
      <transactionManager type=""></transactionManager>
      <dataSource type=""></dataSource>
    </environment>
  </environments>
  <mappers>
    <mapper resource="mapper/UserMapper.xml"></mapper>
  </mappers>
</configuration>

mapper.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">
<mapper namespace="dao.UserDao">
  <insert id="insert">
    INSERT ATM VALUES(#{account}, #{password}, #{balance})
  </insert>
  <update id="update">
    update atm set account=#{account},password=#{password},balance=#{balance} where account=#{account};
  </update>
  <delete id="delete">
    DELETE FROM ATM WHERE account=#{account};
  </delete>

  <select id="selectAll" resultType="domain.User">
    SELECT *FROM atm;
  </select>

  <select id="getTotalCount" resultType="integer">
    SELECT COUNT(*) FROM atm;
  </select>
  <select id="gettotal" resultType="hashmap">
    select count(*),max(balance) from atm;
  </select>

  <select id="selectAllByAcc" resultType="domain.User">
    SELECT *FROM atm order by ${flag} ${order};
  </select>
</mapper>

具体操作

具体操作看如下代码,我对代码都进行了一定的注释,并结合mapper.xml文件一起看

public class UserDao {

  //增加一条记录,user对象是我创建的实体类
    //mapper.xml文件的sql语句如下:
    //update atm set account=#{account},password=#{password},balance=#{balance} where account=#{account};
    //#{key}中的key要和实体类user的属性名一致
    //如果传递的是基本数据类型或者String,且#{key}只有一个,那么名字可以不一致
    //如果传入的是map集合,#{key}中的key要和map集合里的key一致
  public void insert(User user){
    //MYBATIS操作流程
    //获取工厂Builder对象
    SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
    //获取configuration.xml配置文件的输入流
    InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("configuration.xml");
    //builder根据is获取SqlSessionFactory工厂对象
    SqlSessionFactory factory = builder.build(is);
    //获取SqlSession对象
    SqlSession sqlSession = factory.openSession();
    //执行sql语句操作
      //insert是在mapper.xml下,insert标签的id名
      //user是我要插入的数据(动态操作),替换掉sql语句的#{}
    sqlSession.insert("insert", user);

    sqlSession.commit();
  }

  //改:修改记录,user是要修改的数据
    //mapper.xml文件的sql语句如下:
    //update atm set account=#{account},password=#{password},balance=#{balance} where account=#{account};
  public void update(User user){
    //MYBATIS操作流程
    //获取工厂Builder对象
    SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
    //获取configuration.xml配置文件的输入流
    InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("configuration.xml");
    //builder根据is获取SqlSessionFactory工厂对象
    SqlSessionFactory factory = builder.build(is);
    //获取SqlSession对象
    SqlSession sqlSession = factory.openSession(true);
    //执行sql语句操作
    sqlSession.update("update",user);
  }

  //删除:根据account删除
  //mapper.xml的sql语句如下:
    // DELETE FROM ATM WHERE account=#{account};
  public void delete(String account){
    //MYBATIS操作流程
    //获取工厂Builder对象
    SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
    //获取configuration.xml配置文件的输入流
    InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("configuration.xml");
    //builder根据is获取SqlSessionFactory工厂对象
    SqlSessionFactory factory = builder.build(is);
    //获取SqlSession对象
    SqlSession sqlSession = factory.openSession(true);
    //执行sql语句操作
    sqlSession.update("delete",account);
  }

  //===============================查询====================================
  //查询:查找记录总条数以及balance的最大值
  //sql语句如下:select count(*),max(balance) from atm;
  //select标签上的resultType表示的是返回值,指的是一条记录的类型,最后包裹成list集合
    //我这里用的hashMap
  public List<Map<String, Object>> gettotal(){
    InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("configuration.xml");
    SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
    SqlSession sqlSession = factory.openSession(true);
    return sqlSession.selectList("gettotal");
  }

  //查询:获取总记录数
  //sql语句: SELECT COUNT(*) FROM atm;
  //resultType类型:integer
  public Integer getTotalCount(){
    InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("configuration.xml");
    SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
    SqlSession sqlSession = factory.openSession(true);
    return sqlSession.selectOne("getTotalCount");
  }

  //查询:获取表格的所有记录
  //sql语句:SELECT *FROM atm;
  //resultType类型:domain.User (如果是自己写的实体类,需要类名的具体路径,除非做了配置)
  public List<User> selectAll(){
    InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("configuration.xml");
    SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
    SqlSession sqlSession = factory.openSession(true);
    return sqlSession.selectList("selectAll");
  }

  //查询:查询所有该表所有记录,并根据flag列进行order排序
      //flag不确定,order可能是升序也可能是降序(由调用这个方法的用户决定)
  //sql语句: SELECT *FROM atm order by ${flag} ${order};
    //这里用的是${}而不是#{}
    //#{}和${}的区别:
    //#{}:当我们的动态参数是用作条件的时候我们用这个,比如说account=#{key}
    //${}:当我们的动态参数表示的是一个普通字符串,比如说表名、列名或者关键字我们用这个
  //resultType:domain.User(domain包下的User类)
  public List<User> selectAllByAcc(String flag, String order){
    InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("configuration.xml");
    SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
    SqlSession sqlSession = factory.openSession(true);
    Map<String, Object> map = new HashMap<>();
    map.put("flag", flag);
    map.put("order", order);
    return sqlSession.selectList("selectAllByAcc", map);
  }
}

关于单表操作的底层原理

这里我简单提一下关于增删改查操作的底层原理,以查询操作为例,查询操作和增删改操作的主要区别在于sql语句的不同以及查询操作有返回值,所以底层还需要处理返回值

例如:sqlSession.selectOne(sql,obj)

1)首先,底层需要根据configuration.xml,找到mysql的驱动类driver,加载驱动
2)根据configuration.xml文件,找到连接MySQL数据库的url,user,password,获取连接Connection
3)参考configuration.xml配置文件,找到mapper.xml文件,从而找到sql语句,创建状态参数PreparedStatement
4)解析sql语句,把#{key}或者${key}转换成?的形式,并记录key的名字,根据传递过来的obj匹配key,如果传递过来的是domain实体对象,通过反射获取domain实体中的所有属性,根据属性名字去匹配key,然后调用状态参数的setObject方法对?进行复制(其他类型的对象也基本如此)
5)执行SQL操作,获取结果集
6)分析ResultType属性,获取返回值类型,通过反射创建对象,遍历结果集,将结果集包装成返回值类型的对象
基本的流程大概就是这样,本篇文章主要是对单表操作进行介绍,下一篇文章会介绍如果是多表,该如何进行操作

到此这篇关于使用Mybatis对数据库进行单表操作的实现示例的文章就介绍到这了,更多相关Mybatis 数据库单表操作内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 解决mybatis使用char类型字段查询oracle数据库时结果返回null问题

    同事在学mybatis时,遇到了一个问题就是,使用char类型字段作为查询条件时一直都查不出数据,其他类型的则可以. 使用的数据库是oracle,查询条件字段类型是char(50),java代码对应的是String类型. 后来经过排查,是由于在oracle中,char类型字段,如果内容长度不够,会自动以空格方式补足长度.如字段 name char(5),若值为sgl,那么oracle会自动用空格补足长度,最终值为sgl. 一.解决方法: 方法1:先用trim()函数把值去掉两边空格再作为条件查询

  • MyBatis批量插入数据到Oracle数据库中的两种方式(实例代码)

    一.mybatis批量插入数据到Oracle中的两种方式: 第一种: <insert id="addList" parameterType="java.util.List" useGeneratedKeys="false"> INSERT ALL <foreach item="item" index="index" collection="list"> INTO

  • Spring+Mybatis+Mysql搭建分布式数据库访问框架的方法

    一.前言 用Java开发企业应用软件, 经常会采用Spring+MyBatis+Mysql搭建数据库框架.如果数据量很大,一个MYSQL库存储数据访问效率很低,往往会采用分库存储管理的方式.本文讲述如何通过Spring+Mybatis构建多数据库访问的架构,并采用多线程提升数据库的访问效率. 需要说明一下,这种方式只适合数据库数量.名称固定,且不是特别多的情况.针对数据库数量不固定的情况,后面再写一篇处理方案. 二.整体方案 三.开发环境准备 3.1 下载Spring.Mybatis.Mysql

  • Mybatis update数据库死锁之获取数据库连接池等待

    最近学习测试mybatis,单个增删改查都没问题,最后使用mvn test的时候发现了几个问题: 1.update失败,原因是数据库死锁 2.select等待,原因是connection连接池被用光了,需要等待 get: 1.要勇于探索,坚持就是胜利.刚看到错误的时候直接懵逼,因为错误完全看不出来,属于框架内部报错,在犹豫是不是直接睡 觉得了,毕竟也快12点了.最后还是给我一点点找到问题所在了. 2.同上,要敢于去深入你不了解的代码,敢于研究不懂的代码. 3.距离一个合格的码农越来越远了,因为越

  • MyBatis获取数据库自生成的主键Id详解及实例代码

    MyBatis获取数据库自生成的主键Id详解及实例代码 在使用MySQL数据库时我们一般使用数据库的自增主键自动产生主键.如果在插入主表时,我们需要同时插入从表的数据,这时我们通常需要知道主表插入时自动产生的主键Id值. 下面介绍使用MyBatis进行插入时,如何同时获取数据库自生成的主键: 1.XML配置文件 <insert id="insert" parameterType="Person" useGeneratedKeys="true"

  • MyBatis实现Mysql数据库分库分表操作和总结(推荐)

    前言 作为一个数据库,作为数据库中的一张表,随着用户的增多随着时间的推移,总有一天,数据量会大到一个难以处理的地步.这时仅仅一张表的数据就已经超过了千万,无论是查询还是修改,对于它的操作都会很耗时,这时就需要进行数据库切分的操作了. MyBatis实现分表最简单步骤 既然文章的标题都这么写了,不如直接上干货来的比较实际,我们就先来看看如何实现最简单的分表. 1.我们模拟用户表数据量超过千万(虽然实际不太可能) 2.用户表原来的名字叫做user_tab,我们切分为user_tab_0和user_t

  • MyBatis入门之增删改查+数据库字段和实体字段不一致问题处理方法

    当数据库字段和实体bean中属性不一致时 之前数据库Person名字字段是name,PersonBean中属性也是name,但是之后数据库中修改为了user_name, 方法1:通过sql语句的字段起别名,别名和实体中的对象属性一致 SELECT id,user_name as name,sex,age from person <select id="find" resultType="com.luogg.domain.Person"> SELECT i

  • 使用Mybatis对数据库进行单表操作的实现示例

    简介 该篇文章主要是介绍如何使用MyBatis对Mysql数据库进行单表操作(对于mybatis的下载以及配置文件的作用和具体信息,我在上一篇文章中也已经提到了),使用的环境如下: JDK版本:1.8 编译器:IDEA2019 JDBC版本:8.0.18 mybatis版本:3.5.3 配置文件 首先需要有两个配置文件,一个是configuration.xml文件,配置的是连接数据库的环境以及对于mapper.xml文件的映射,还有另一个文件就是mapper.xml,这个文件主要是用来写sql语

  • Mybatis示例讲解注解开发中的单表操作

    目录 Mybatis注解开发单表操作 MyBatis的常用注解 MyBatis的增删改查 注解开发总结 常用注解 配置映射关系 练习项目代码 Mybatis注解开发单表操作 MyBatis的常用注解 Mybatis也可以使用注解开发方式,这样我们就可以减少编写Mapper映射文件了.我们先围绕一些基本的CRUD来学习,再学习复杂映射多表操作. 注解 说明 @Insert 实现新增 @Update 实现更新 @Delete 实现删除 @Select 实现查询 @Result 实现结果集封装 @Re

  • Hibernate单表操作实例解析

    单一主键 assigned:由Java应用程序负责生成(即手工的赋值) native:由底层的数据库自动的生成标示符,如果是MySQL就是auto_increment,如果是Oracle就是sequence,等等 操作的时候还是需要结合hibernate.cfg.xml文件的,因为数据库中的hbm2ddl.auto属性如果是update的时候,设置为主键自增是可以的:但是如果是create的时候,第二次如果不手工的改变,恐怕就要出BUG了. 基本类型 一般来说,按照Java的数据类型进行操作就可

  • django框架单表操作之增删改实例分析

    本文实例讲述了django框架单表操作之增删改.分享给大家供大家参考,具体如下: 首先找到操作的首页面 代码如下 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <link rel="stylesheet" href="/static/bootstrap/css/bootstrap.min.css"

  • django连接mysql数据库及建表操作实例详解

    本文实例讲述了django连接mysql数据库及建表操作.分享给大家供大家参考,具体如下: django连接mysql数据库需要在project同名的目录下面的__init__.py里面加入下面的东西 import pymysql pymysql.install_as_MySQLdb() 找到settIngs里面的database设置如下 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 's22',

  • springdata jpa单表操作crud的实例代码详解

    1. 项目搭建 使用boot整合,导入springdata jap, mysql 驱动,lombok,web. 1.1 配置 # boot add jpa, oh~ crud in single table server: port: 8888 spring: # datasource datasource: username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://

  • MySQL数据库之数据表操作

    目录 一.创建数据表 1.基本语法 2.创建方式一 3.创建方式二 4.表选项 5.复制已有表结构 二.显示数据表 三.显示表结构 四.显示表创建语句 五.设置表属性 六.修改表结构 1.修改表名 2.新增字段 3.修改字段名 4.修改字段属性 5.删除字段 七.删除表结构 一.创建数据表 1.基本语法 create table 表名 ( 字段名 字段类型 [字段属性], 字段名 字段类型 [字段属性], ... ) [表选项]; 需要注意:表需要放在对应的数据库下面 2.创建方式一 -- 先选

  • MySQL数据库的多表操作

    目录 一. 数据库的多表操作 二,操作 一对一 一对多 一. 数据库的多表操作 数据库的多表关系: 一对一 一对多 多对一 多对多 二,操作 一对一 建立数据表person和card,设置person数据表id为主键且自增,设置card的id为外键 // 创建person表 CREATE TABLE person ( id INT PRIMARY KEY AUTO_INCREMENT, // 主键 自增 NAME VARCHAR(20) ); // 创建card表 CREATE TABLE ca

  • MySQL数据库之数据表操作DDL数据定义语言

    目录 一.创建数据表 二.查询数据表 三. 删除数据表 四.修改数据表以及字段 一.创建数据表 数据表:一个二维的表格,一个表格是由多列组成,表格中的每一类称之为表格的字段 以上述学生信息表格为例在MySQL数据库中创建一张表格,语句如下(注:创建前应选择相应的数据库): create table students( stu_num char(8) not null unique, stu_name varchar(20) not null, stu_gender char(2) not nul

随机推荐