简介
该篇文章主要是介绍如何使用MyBatis对Mysql数据库进行单表操作(对于mybatis的下载以及配置文件的作用和具体信息,我在上一篇文章中也已经提到了),使用的环境如下:
- JDK版本:1.8
- 编译器:IDEA2019
- JDBC版本:8.0.18
- mybatis版本:3.5.3
配置文件
首先需要有两个配置文件,一个是configuration.xml文件,配置的是连接数据库的环境以及对于mapper.xml文件的映射,还有另一个文件就是mapper.xml,这个文件主要是用来写sql语句的
configuration.xml文件
| 
								1
 
								2
 
								3
 
								4
 
								5
 
								6
 
								7
 
								8
 
								9
 
								10
 
								11
 
								12
 
								13
 
								14
 
								15
 
								16
 
								17
 
								18
 
								19
 
								20
 
								21
 
								22
 
								23
 
								24
						 | <?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration><environmentsdefault="e1"><environmentid="e1"><transactionManagertype="JDBC"></transactionManager><dataSourcetype="POOLED"><propertyname="driver"value="com.mysql.cj.jdbc.Driver"/><propertyname="url"value="jdbc:mysql://localhost:3306/bank?serverTimezone=CST"/><propertyname="username"value="root"/><propertyname="password"value="123456"/></dataSource></environment><environmentid="e2"><transactionManagertype=""></transactionManager><dataSourcetype=""></dataSource></environment></environments><mappers><mapperresource="mapper/UserMapper.xml"></mapper></mappers></configuration> | 
mapper.xml文件
| 
								1
 
								2
 
								3
 
								4
 
								5
 
								6
 
								7
 
								8
 
								9
 
								10
 
								11
 
								12
 
								13
 
								14
 
								15
 
								16
 
								17
 
								18
 
								19
 
								20
 
								21
 
								22
 
								23
 
								24
 
								25
 
								26
 
								27
 
								28
 
								29
 
								30
 
								31
						 | <?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mappernamespace="dao.UserDao"><insertid="insert">INSERT ATM VALUES(#{account}, #{password}, #{balance})</insert><updateid="update">update atm set account=#{account},password=#{password},balance=#{balance} where account=#{account};</update><deleteid="delete">DELETE FROM ATM WHERE account=#{account};</delete><selectid="selectAll"resultType="domain.User">SELECT *FROM atm;</select><selectid="getTotalCount"resultType="integer">SELECT COUNT(*) FROM atm;</select><selectid="gettotal"resultType="hashmap">select count(*),max(balance) from atm;</select><selectid="selectAllByAcc"resultType="domain.User">SELECT *FROM atm order by ${flag} ${order};</select></mapper> | 
具体操作
具体操作看如下代码,我对代码都进行了一定的注释,并结合mapper.xml文件一起看
| 
								1
 
								2
 
								3
 
								4
 
								5
 
								6
 
								7
 
								8
 
								9
 
								10
 
								11
 
								12
 
								13
 
								14
 
								15
 
								16
 
								17
 
								18
 
								19
 
								20
 
								21
 
								22
 
								23
 
								24
 
								25
 
								26
 
								27
 
								28
 
								29
 
								30
 
								31
 
								32
 
								33
 
								34
 
								35
 
								36
 
								37
 
								38
 
								39
 
								40
 
								41
 
								42
 
								43
 
								44
 
								45
 
								46
 
								47
 
								48
 
								49
 
								50
 
								51
 
								52
 
								53
 
								54
 
								55
 
								56
 
								57
 
								58
 
								59
 
								60
 
								61
 
								62
 
								63
 
								64
 
								65
 
								66
 
								67
 
								68
 
								69
 
								70
 
								71
 
								72
 
								73
 
								74
 
								75
 
								76
 
								77
 
								78
 
								79
 
								80
 
								81
 
								82
 
								83
 
								84
 
								85
 
								86
 
								87
 
								88
 
								89
 
								90
 
								91
 
								92
 
								93
 
								94
 
								95
 
								96
 
								97
 
								98
 
								99
 
								100
 
								101
 
								102
 
								103
 
								104
 
								105
 
								106
 
								107
 
								108
 
								109
 
								110
 
								111
						 | publicclassUserDao {//增加一条记录,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一致publicvoidinsert(User user){//MYBATIS操作流程//获取工厂Builder对象SqlSessionFactoryBuilder builder = newSqlSessionFactoryBuilder();//获取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};publicvoidupdate(User user){//MYBATIS操作流程//获取工厂Builder对象SqlSessionFactoryBuilder builder = newSqlSessionFactoryBuilder();//获取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};publicvoiddelete(String account){//MYBATIS操作流程//获取工厂Builder对象SqlSessionFactoryBuilder builder = newSqlSessionFactoryBuilder();//获取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集合//我这里用的hashMappublicList<Map<String, Object>> gettotal(){InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("configuration.xml");SqlSessionFactory factory = newSqlSessionFactoryBuilder().build(is);SqlSession sqlSession = factory.openSession(true);returnsqlSession.selectList("gettotal");}//查询:获取总记录数//sql语句: SELECT COUNT(*) FROM atm;//resultType类型:integerpublicInteger getTotalCount(){InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("configuration.xml");SqlSessionFactory factory = newSqlSessionFactoryBuilder().build(is);SqlSession sqlSession = factory.openSession(true);returnsqlSession.selectOne("getTotalCount");}//查询:获取表格的所有记录//sql语句:SELECT *FROM atm;//resultType类型:domain.User (如果是自己写的实体类,需要类名的具体路径,除非做了配置)publicList<User> selectAll(){InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("configuration.xml");SqlSessionFactory factory = newSqlSessionFactoryBuilder().build(is);SqlSession sqlSession = factory.openSession(true);returnsqlSession.selectList("selectAll");}//查询:查询所有该表所有记录,并根据flag列进行order排序//flag不确定,order可能是升序也可能是降序(由调用这个方法的用户决定)//sql语句: SELECT *FROM atm order by ${flag} ${order};//这里用的是${}而不是#{}//#{}和${}的区别://#{}:当我们的动态参数是用作条件的时候我们用这个,比如说account=#{key}//${}:当我们的动态参数表示的是一个普通字符串,比如说表名、列名或者关键字我们用这个//resultType:domain.User(domain包下的User类)publicList<User> selectAllByAcc(String flag, String order){InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("configuration.xml");SqlSessionFactory factory = newSqlSessionFactoryBuilder().build(is);SqlSession sqlSession = factory.openSession(true);Map<String, Object> map = newHashMap<>();map.put("flag", flag);map.put("order", order);returnsqlSession.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 数据库单表操作内容请搜索快网idc以前的文章或继续浏览下面的相关文章希望大家以后多多支持快网idc!
原文链接:https://segmentfault.com/a/1190000023536481
相关文章
- 个人服务器网站搭建:如何选择合适的服务器提供商? 2025-06-10
- ASP.NET自助建站系统中如何实现多语言支持? 2025-06-10
- 64M VPS建站:如何选择最适合的网站建设平台? 2025-06-10
- ASP.NET本地开发时常见的配置错误及解决方法? 2025-06-10
- ASP.NET自助建站系统的数据库备份与恢复操作指南 2025-06-10
- 2025-07-10 怎样使用阿里云的安全工具进行服务器漏洞扫描和修复?
- 2025-07-10 怎样使用命令行工具优化Linux云服务器的Ping性能?
- 2025-07-10 怎样使用Xshell连接华为云服务器,实现高效远程管理?
- 2025-07-10 怎样利用云服务器D盘搭建稳定、高效的网站托管环境?
- 2025-07-10 怎样使用阿里云的安全组功能来增强服务器防火墙的安全性?
快网idc优惠网
QQ交流群
- 
            2025-05-27 41
- 
            2025-05-27 64
- 
            2025-05-29 21
- 
            2025-05-27 24
- 
            2025-05-25 74
 
        
 
    		 
            	 
															 
         
         
        
 
                         
                         
                         
                         
                        