MyBatis数据库连接的基本使用
MyBatis部分:
本部分内容只主要体现Mybatis的特点。
(1)MyBatis是什么?
开源的持久层框架,MyBatis的底层仍然是JDBC
(2)编程步骤
step1 Maven项目 pom.xml导包mybatis,ojdbc,junit,mysql驱动等
<dependencies>
<!--导入junit测试包 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency> <dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<classifier>sources</classifier>
</dependency> <dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<classifier>javadoc</classifier>
</dependency> <!-- 导入数据库包 -->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0.1.0</version>
</dependency> <!-- 导入mybatis的包 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.0</version>
</dependency> <dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.8</version>
<classifier>sources</classifier>
</dependency> <dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.8</version>
<classifier>javadoc</classifier>
</dependency> <!-- 针对mysql的导包 -->
<dependency>
<groupId>org.wisdom-framework</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.34_1</version>
</dependency> </dependencies>
step2 添加MyBatis的配置文件SqlMapConfig.xml文件并配置,SqlMapperConfig中包含数据库的连接和Mapper两部分,其中Mapper中写好预编译的sql以及对应的id,将来要存入储存sql的Map中,其中sql做为value,id作为key
<?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>
<!-- 和spring整合后 environments将废除 -->
<environments default="development">
<environment id="development">
<!-- 使用JDBC事务管理,事务控制交由mybatis -->
<transactionManager type="JDBC"/>
<!-- 数据库连接池,由mybatis管理 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/Admin_ycl"/><!--oracle数据库端口号1521,切记-->
<property name="username" value="root"/>
<property name="password" value="密码"/>
</dataSource>
</environment>
</environments>
<!-- 指定映射文件的地方 -->
<mappers>
<mapper resource="Entity/EmpMapper.xml"></mapper>
</mappers>
</configuration>
step3 写实体类,实体类的属性名和表的字段名要一样(大小写可以忽略),如果为小写,数据库会自动将SQL语句小写转换成大写形式。实体类建议要实现JavaBean的规范:有一个包,实现序列化接口,有默认构造方法,有属性的set,get方法,建议还有一个toString()方法,方便测试用
step4 添加EmpMapper.xml映射文件,在映射文件当中添加sql语句,本例为插入一条数据
<?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="test"><!--命名空间为区分可能相同的业务id,如有很多find方法,save方法,分布在各个业务里,使用命名空间来区分-->
<!-- id要求唯一
parameterType:填写实体类的完整名字
-->
<insert id="save" parameterType="Entity.Employee">
INSERT INTO T_TABLE VALUES(1,#{name},#{age})
</insert>
</mapper>
step5 调用Sqlsession对象提供的方法来访问数据库
package test; import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test; import Entity.Employee; public class testCase {
/**
* 测试MyBatis连接数据库
*/
@Test
public void test1() {
String config="SqlMapConfig.xml";
//创建SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder ssfb=new SqlSessionFactoryBuilder();
//创建SqlSessionFactory对象
SqlSessionFactory ssf=ssfb.build(testCase.class.getClassLoader().getResourceAsStream(config));
//获得sqlSession对象
SqlSession session=ssf.openSession();
//调用sqlsession提供的方法访问数据库
Employee emp=new Employee();
emp.setName("muwanqing");
emp.setAge(22);
//test.save为sql的id,命名空间为test下的,以及id为save的sql方法
session.insert("test.save", emp);
/**
* mybatis的sqlsession对象在执行插入方法时,会读取test.save,得到id为save
* 然后在sqlSessionFactory创建的预编译statement Map中,找到key为save的那条预编译sql
* 然后执行prepareStatement.executeUpdate()方法更新数据
* prepareStatemen中的问号参数从哪里来?从emp里来
* 底层将执行prepareStatement.setString(1,emp.getName())...
* 而哪个问号给与哪个参数,在EmpMapper里,已经按照顺序写好了
*/
//添加,修改,删除都需要提交事务
session.commit();
//关闭sqlsession
session.close();
}
测试结果:

总结:
MyBatis的工作原理
(1)SqlMapperConfig中包含数据库的连接和Mapper两部分,其中Mapper中写好了预编译的sql,以及sql对应的id预编译的sql和id会当做value和key,被sqlSessionFactory读取sqlMapperConfig文件后,将映射文件中的sql存入一个Map中,此时,这些map中的预编译sql是不会执行的。
(2)当从sqlSessionFactory中获取SqlSession,SqlSession会依据sql id,从上述map中寻找预编译sql然后根据第二个参数里绑定的值,一般是实体类中的属性值,将值获取后写入预编译sql,然后执行sql语句。
如果是执行查询操作,执行完sql后,会先将记录放在一个map对象里保存,有一条记录,就保存一个map,map的key就是数据表的字段名,value就是数据表值,如entity中Employee的id,name,age作为key,对应的值就是value,保存在一个map中,再将map对象中的数据保存到对应的实体对象中。为何map中的对象能保存到实体对象中?因为前面进行了规范,实体类的属性名和数据表的字段名需保持一致,因此能根据属性名,找到对应的value,然后利用set方法赋值到实体类。
Mybatis相比SpringJDBC差异点:
1.连接池初始化:Mybatis会使用SqlSessionFactory读取SqlMapperConfig配置文件后创建连接池,不像SpringJDBC需要读取properties文件,然后创建连接池。Mybatis会帮忙创建连接池,在配置文件中设置驱动,用户名密码等即可。
2.sql写的位置:Mybatis中会将sql写在专门的映射文件如EmpMapper.xml文件里,将来会被SqlSessionFactory读取后放入预编译sql Map中,而SpringJDBC会将sql专门写在一个类里,这个类会依赖注入配置好的JDBCTemplate后,然后在类中创建方法,调用JDBCTemplate的api,实现数据库更新
3.sql调用的方式:Mybatis会使用sql的id,配合SqlSession来实现数据库操作,SpringJDBC会根据sql写好的类对应的方法实现调用
4.两者都要创建数据库对应实体类
MyBatis数据库连接的基本使用的更多相关文章
- Mybatis数据库连接报错:对实体 "characterEncoding" 的引用必须以 ';' 分隔符结尾
Mybatis数据库连接报错:对实体 "characterEncoding" 的引用必须以 ';' 分隔符结尾 ============================== 蕃薯耀 ...
- MyBatis数据库连接的基本使用-补充Mapper映射器
补充 Mapper映射器的使用: Mapper映射器,google添加.Mapper映射器是将mapper.xml中配置的sql id,parameterType和resultMap按照规则一一映射到 ...
- MyBatis数据库连接的基本使用-补充
补充1 MyBatis使用过程中,返回值类型可能是Map,不一定是实体类 返回查询结果也可以是一个Map,不一定是实体类 (1)mybatis会先将查询结果返回为一个map,字段名作为key,字段值 ...
- MyBatis源码解析之数据源(含数据库连接池简析)
一.概述: 常见的数据源组件都实现了javax.sql.DataSource接口: MyBatis不但要能集成第三方的数据源组件,自身也提供了数据源的实现: 一般情况下,数据源的初始化过程参数较多,比 ...
- MyBatis入门学习
所需要jar包:mybatis-3.x.x.jar .如果需要和spring整合,还需要加入相关的包 1:看项目目录 红颜色不要关心 2:按照步骤: 1:加入jar包 2:创建数据源(configur ...
- spring+springMVC+mybatis的框架项目基础环境搭建
上一个项目在后台用到spring+springMVC+mybatis的框架,先新项目初步需求也已经下来,不出意外的话,应该也是用这个框架组合. 虽然在之前activiti相关的学习中所用到的框架也是这 ...
- MyBatis学习门户网站(一)
需要jar包:mybatis-3.x.x.jar .假设需要和spring综合,此外,我们需要增加相关的包 1:看到项目文件夹 不要在意红色 2:依照步骤: 1:增加jar包 2:创建数据源(conf ...
- MyBatis 系列教程1-环境配置
MyBatis MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyB ...
- MyBatis中---数据库配置的属性名冲突问题
一.db.properties 属性文件中 最好加特殊的标志前缀 jdbc.username ,如果单纯的username有可能影响到 mapper.xml中的 ${username}; 举例 ...
随机推荐
- GNU tar
2.tar教程 2.4.常用选项 2.5.两个选项 2.6.创建档案文档 2.7.查看档案文档内容 4.tar操作 4.1.基本操作 4.2.高级操作 4.3.“-c”的选项 链接到压缩命令 2.ta ...
- vnc操作指南
启动 vncserver : vncserver : -geometry 1905x1005 停止: ps aux | grep vnc kill pid 或者 vncserver -
- 自制进度条在python3下PyCharm中运行或在控制台按照目录运行
import timescale = 50print("执行开始".center(scale//2,"-"))start = time.perf_counter ...
- twisted的installReactor()函数
#twisted的安装反应堆函数def installReactor(reactor): """ Install reactor C{reactor}. @param r ...
- 关于sql链接超时的问题
也许你会说,我在连接字符串中已经 设置了 Connect Timeout=80000 ,并且数据库中超时连接也是设置的值是一个很大的值.为啥到了30秒,仍然超时了呢?? 这是因为: ...
- 浅析USB HID ReportDesc (HID报告描述符)
在USB中,USB Host是通过各种描述符来识别识别设备的,一般在设备枚举的过程将会获取有设备描述符/配置描述符/接口描述符/端点描述符/字符串描述符等 现在我们来介绍一下HID ReportDes ...
- Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https.
转自:https://www.zhihu.com/question/20948649?sort=created 我最近也遇到这个问题了,用传统的快捷方式加参数并没有用,不知道是不是和chrome版本有 ...
- vue父子组件嵌套的时候遇到 - Component template should contain exactly one root element. If you are using v-i
转自:https://blog.csdn.net/yangyiboshigou/article/details/72084619
- Java快速开发平台——JEECG 3.7.8 版本发布!我们的目标是有鱼丸也有粗面
JEECG 3.7.8 版本发布,多样化主题UI满足你不同的需求 导读 ⊙平台性能优化,速度闪电般提升 ⊙提供5套新的主流UI代码生成器模板( ...
- strcore.cpp(156) 内存泄漏
vs搞了一个小工具涉及到线程 每次执行完退出的时候都会报 strcore.cpp(156) 的内存泄漏 原因是在线程内使用了CString 类型的传递参数 如果没有正常释放会报上面的错误.