使用Mybatis对数据库进行单表操作的实现示例
作者:cing_self 发布时间:2024-01-16 13:50:45
简介
该篇文章主要是介绍如何使用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属性,获取返回值类型,通过反射创建对象,遍历结果集,将结果集包装成返回值类型的对象
基本的流程大概就是这样,本篇文章主要是对单表操作进行介绍,下一篇文章会介绍如果是多表,该如何进行操作
来源:https://segmentfault.com/a/1190000023536481
猜你喜欢
- MySQL5.0版本的安装图解教程是给新手学习的,当前mysql5.0.96是最新的稳定版本。mysql 下载地址 https://www.
- fab命令好似结合我们编写的fabfile.py(其它文件名必须添加-f filename应用)来搭配使用的,部分命令行参数可以通过相应的方
- 本章我们要制作一个俄罗斯方块游戏。Tetris译注:称呼:方块是由四个小方格组成的俄罗斯方块游戏是世界上最流行的游戏之一。是由一名叫Alex
- python 获取蓝牙设备类型扫描蓝牙设备获取到的信息中,无法判断扫描到的蓝牙设备属于什么类型的设备。扫描蓝牙信息使用的是python 里面
- 如何实现在下拉菜单里输入文字? 用这个代码试试看,应该可以的:<script>function pp(){se.opt
- 发送普通邮件发送文本和html普通邮件如下:from email.header import Headerfrom email.mime.t
- 使用实例引用类的属性时,会发生动态绑定。即python会在实例每次引用类属性时,将对应的类属性绑定到实例上。动态绑定的例子:class A:
- 一:修改文件上传语言为PHP 打开fckconfig.js 找到: var _FileBrowserLanguage = 'asp&
- 使用cv2.canny进行图像边缘检测CV2提供了提取图像边缘的函数canny。其算法思想如下:1.使用高斯模糊,去除噪音点(cv2.Gau
- 一、弱网简介弱网看字面意思就是网络比较弱,我们通称为信号差,网速慢。1、弱网的影响在地铁、隧道、电梯和车库等场景下使用APP ,网络会出现延
- 这是一款简单,方便,功能齐全的分页类,可以根据自己的需要更改CSS样式文件以实现分页颜色的控制,利用p
- 看代码 <?php header("Content-type: text/html; charset=utf-8"
- 图片显示pytorch 载入的数据集是元组tuple 形式,里面包括了数据及标签(train_data,label),其中的train_da
- 集合内建函数和内建方法(1)标准类型函数 len():把集合作为参数
- 1、问题描述某厂生产甲乙两种饮料,每百箱甲饮料需用原料6千克、工人10名,获利10万元;每百箱乙饮料需用原料5千克、工人20名,获利9万元。
- 环境介绍系统环境:Windows 10Python版本:Python 3.5必备包:无 运行Python脚本:.bat文件在Win
- 前言在数据库有外键的时候,使用 select_related() 和 prefetch_related() 可以很好的减少数据库请求的次数,
- 有一组4096长度的数据,需要找到一阶导数从正到负的点,和三阶导数从负到正的点,截取了一小段。394.0 388.0 389.0 388.0
- 一.基本数据类型整数:int字符串:str(注:\t等于一个tab键)布尔值: bool列表:list (元素的集合)列表用[]元祖:tup
- 如下所示:#!/usr/bin/python#-*- coding: utf-8 -*-fin=open('add_1.txt