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}; 举例 ...
随机推荐
- VMware扩展Linux根目录磁盘空间(Centos版本)
1.Centos 关机,选择编辑虚拟机设置,硬盘,在实用工具那里选择“扩展”,指定你需要的存储大小 2.启动客户机操作系统Centos,查看磁盘情况 输入指令 fdisk -l 显示结果如下 Disk ...
- failed to open stream: Permission denied in警告错误
问题是文件所在目录的权限问题导致的.只需要将警告文件所在的目录权限更改为777(至少是006)即可 例如 (...a.log)failed to open stream: Permission den ...
- 关于SqlServer2008小记(查询数据库连接数,强行干掉连接)
查询连接数 select count(*) from master.dbo.sysprocesses 这条语句查出来的是所有连接到本机(或者连接到本服务器)的连接数,并非是某一个库的连接数. 查询连接 ...
- 关于QT编译错误问题
这里的意思是出现QT编译错误: 1.之前编译没问题,突然就报错了,而且错误根本不知道啥玩意. 2.编译出现不能自动更新,比如更改ui但是编译之后没该改变. ... 解决方法: 1.删除Makefile ...
- 浏览器预览office文件(word,Excel,等)
提示:预览是通过后台转pdf到前台展示的过程,当然网上也有购买的api 举个栗子:(http://www.officeweb365.com/) <!DOCTYPE html> <ht ...
- ios判断当前设备类型
代码如下: + (NSString*) deviceString { // 需要#import "sys/utsname.h" struct utsname systemInfo; ...
- 3.div+css 的布局较 table 布局有什么优点
改版的时候更方便,只需改css文件. 页面加载速度更快.结构化清晰.页面显示简介. 表现与结构相分离. 已于优化搜索引擎更友好,排名更容易靠前.
- 《汇编语言 基于x86处理器》第六章条件处理部分的代码
▶ 书中第六章的程序,使用了条件判断和跳转来实现一些功能 ● 代码,查找数组首个非零值 INCLUDE Irvine32.inc .data intArray SWORD , , , , , , , ...
- python中的keys、values、items
keys()获取字典中所有的键并放入列表 values()获取字典中所有的值并放入列表 items()获取字典中所有的键值对并放入列表 举个例子: 1 a = { 2 "name" ...
- Android dialog使用
翻译自:开发->API 指南->User Interface & Navigation->Dialogs 注意: dialog是一个基类,但是我们应该尽可能避免直接使用dia ...