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}; 举例 ...
随机推荐
- 20165205 预习作业三 Linux安装及学习
Linux安装及学习 安装Ubuntu 1)安装版本 在安装VirtualBox时选择了VirtualBox 5.2.6 platform package 安装Ubuntu时选择了Ubuntu 16. ...
- iOS基础知识之属性及属性关键字
iOS属性及属性关键字 一.属性功能:1.给现有的成员变量生成一对setter/getter方法.2.如果没有声明成员变量,自动声明一个_属性名的私有变量(默认的成员变量是受保护的). 二.属性关键字 ...
- nslookup和dig命令
nslookup与dig两个工具功能类似,都可以查询制定域名所对应的ip地址,所不同的是dig工具可以从该域名的官方dns服务器上查询到精确的权威解答,而nslookup只会得到DNS解析服务器保存在 ...
- springboot retry
try/catch,while 循环或者定时任务 这样看起来 好 low sping boot retry , 这样代码更简洁 eg: @Retryable(value= {RemoteAcce ...
- Ajax 要点
Ajax 全称为“Asynchronous JavaScript and XML”(异步JavaScript和XML) Ajax的实现是基于 xmlHttp对象 异步发送请求 XMLHttpReque ...
- PHP提取HTML代码中img标签下src属性
需求:提取整片文章中img的src属性,并保存到一个数组当中 preg_match_all("/(href|src)=([\"|']?)([^\"'>]+.(jpg ...
- MVC登录校验
利用MVC自带的过滤器可现实简单的登录校验 在项目目录下创建一个BaseController控制器,让需要验证的控制器继承这个BaseController 需要让BaseController继承Con ...
- CSS样式学习-1
一.分类 ①内联,写在标签中,写法是style="样式属性".优先级最高. 优点:控制精确.缺点:代码重用性差,范围小. 例如: <div style="font- ...
- Spring中的@Transactional 放在 类级别 和 方法级别 上有什么不同?
Spring中的@Transactional 放在类级别 和 方法级别 上有什么不同? @Transactional放在类级别上是否等同于该类的每个方法都放上了@Transactional? 是的一般 ...
- Windows下MongoDB安装配置
一.安装 官网下载,一般选择community server版本下载,如果是企业可以选择enterprise版本,个人使用的话community就可以了,附上链接:https://www.mongod ...