mybatis基本流程、jdbc连接、ps:附mybatis(乐观锁)实现
一、前言
Mybatis和Hibernate一样,是一个优秀的持久层框架。已经说过很多次了,原生的jdbc操作存在大量的重复性代码(如注册驱动,创建连接,创建statement,结果集检测等)。框架的作用就是把这些繁琐的代码封装,这样可以让程序员专注于sql语句本身。
MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装。MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和普通的Java对象映射成数据库中的记录。
mybatis和hibernate的区别:
不同点:
(1)sql方面:mybaits通过mapper.xml维护映射结果,程序员手动编写sql相比hibernate自动生成hql(hibernate sql)更加灵活,sql调优更加容易(hibernate因为更好的封装性,开发效率提高的同时,sql语句调优要更费力,当然可以手动修改sql来优化,但是同时也会影响开发效率);hibernate的hql数据库移植性更好,体现在强壮性。hibernate在级联删除的时候效率低;数据量大, 表多的时候,基于关系操作会变得复杂。
(2)缓存方面:mybatis和hibernate都可以使用第三方缓存,而hibernate相比maybatis有更好的二级缓存机制。
- Mybatis的执行流程
- 读取mybatis配置文件
- 根据读取到配置文件生成SqlSessionFactory
- 创建SqlSession对象(开启事务)
- 操作目标数据库
- 提交事务
- 关闭SqlSession
二、mybatis快速入门
2.1、准备开发环境
1、创建测试项目,普通java项目或者是JavaWeb项目均可,如下图所示:
2、添加相应的jar包
【mybatis】
mybatis-3.1.1.jar
【MYSQL驱动包】
mysql-connector-java-5.1.7-bin.jar
3、创建数据库和表,针对MySQL数据库
SQL脚本如下:
- 1 create database mybatis;
- 2 use mybatis;
- 3 CREATE TABLE users(id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(20), age INT);
- 4 INSERT INTO users(NAME, age) VALUES('孤傲苍狼', 27);
- 5 INSERT INTO users(NAME, age) VALUES('白虎神皇', 27);
将SQL脚本在MySQL数据库中执行,完成创建数据库和表的操作,如下:
到此,前期的开发环境准备工作全部完成。
2.2、使用MyBatis查询表中的数据
1、添加Mybatis的配置文件conf.xml
在src目录下创建一个conf.xml文件,如下图所示:
conf.xml文件中的内容如下:

- 1 <?xml version="1.0" encoding="UTF-8"?>
- 2 <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
- 3 <configuration>
- 4 <environments default="development">
- 5 <environment id="development">
- 6 <transactionManager type="JDBC" />
- 7 <!-- 配置数据库连接信息 -->
- 8 <dataSource type="POOLED">
- 9 <property name="driver" value="com.mysql.jdbc.Driver" />
- 10 <property name="url" value="jdbc:mysql://localhost:3306/mybatis" />
- 11 <property name="username" value="root" />
- 12 <property name="password" value="XDP" />
- 13 </dataSource>
- 14 </environment>
- 15 </environments>
- 16
- 17 </configuration>

2、定义表所对应的实体类,如下图所示:
User类的代码如下:

- 1 package me.gacl.domain;
- 2
- 3 /**
- 4 * @author gacl
- 5 * users表所对应的实体类
- 6 */
- 7 public class User {
- 8
- 9 //实体类的属性和表的字段名称一一对应
- 10 private int id;
- 11 private String name;
- 12 private int age;
- 13
- 14 public int getId() {
- 15 return id;
- 16 }
- 17
- 18 public void setId(int id) {
- 19 this.id = id;
- 20 }
- 21
- 22 public String getName() {
- 23 return name;
- 24 }
- 25
- 26 public void setName(String name) {
- 27 this.name = name;
- 28 }
- 29
- 30 public int getAge() {
- 31 return age;
- 32 }
- 33
- 34 public void setAge(int age) {
- 35 this.age = age;
- 36 }
- 37
- 38 @Override
- 39 public String toString() {
- 40 return "User [id=" + id + ", name=" + name + ", age=" + age + "]";
- 41 }
- 42 }

3、定义操作users表的sql映射文件userMapper.xml
创建一个me.gacl.mapping包,专门用于存放sql映射文件,在包中创建一个userMapper.xml文件,如下图所示:
userMapper.xml文件的内容如下:

- 1 <?xml version="1.0" encoding="UTF-8" ?>
- 2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
- 3 <!-- 为这个mapper指定一个唯一的namespace,namespace的值习惯上设置成包名+sql映射文件名,这样就能够保证namespace的值是唯一的
- 4 例如namespace="me.gacl.mapping.userMapper"就是me.gacl.mapping(包名)+userMapper(userMapper.xml文件去除后缀)
- 5 -->
- 6 <mapper namespace="me.gacl.mapping.userMapper">
- 7 <!-- 在select标签中编写查询的SQL语句, 设置select标签的id属性为getUser,id属性值必须是唯一的,不能够重复
- 8 使用parameterType属性指明查询时使用的参数类型,resultType属性指明查询返回的结果集类型
- 9 resultType="me.gacl.domain.User"就表示将查询结果封装成一个User类的对象返回
- 10 User类就是users表所对应的实体类
- 11 -->
- 12 <!--
- 13 根据id查询得到一个user对象
- 14 -->
- 15 <select id="getUser" parameterType="int"
- 16 resultType="me.gacl.domain.User">
- 17 select * from users where id=#{id}
- 18 </select>
- 19 </mapper>

4、在conf.xml文件中注册userMapper.xml文件

- 1 <?xml version="1.0" encoding="UTF-8"?>
- 2 <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
- 3 <configuration>
- 4 <environments default="development">
- 5 <environment id="development">
- 6 <transactionManager type="JDBC" />
- 7 <!-- 配置数据库连接信息 -->
- 8 <dataSource type="POOLED">
- 9 <property name="driver" value="com.mysql.jdbc.Driver" />
- 10 <property name="url" value="jdbc:mysql://localhost:3306/mybatis" />
- 11 <property name="username" value="root" />
- 12 <property name="password" value="XDP" />
- 13 </dataSource>
- 14 </environment>
- 15 </environments>
- 16
- 17 <mappers>
- 18 <!-- 注册userMapper.xml文件,
- 19 userMapper.xml位于me.gacl.mapping这个包下,所以resource写成me/gacl/mapping/userMapper.xml-->
- 20 <mapper resource="me/gacl/mapping/userMapper.xml"/>
- 21 </mappers>
- 22
- 23 </configuration>

5、编写测试代码:执行定义的select语句
创建一个Test1类,编写如下的测试代码:

- package me.gacl.test;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.Reader;
- import me.gacl.domain.User;
- import org.apache.ibatis.io.Resources;
- import org.apache.ibatis.session.SqlSession;
- import org.apache.ibatis.session.SqlSessionFactory;
- import org.apache.ibatis.session.SqlSessionFactoryBuilder;
- public class Test1 {
- public static void main(String[] args) throws IOException {
- //mybatis的配置文件
- String resource = "conf.xml";
- //使用类加载器加载mybatis的配置文件(它也加载关联的映射文件)
- InputStream is = Test1.class.getClassLoader().getResourceAsStream(resource);
- //构建sqlSession的工厂
- SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
- //使用MyBatis提供的Resources类加载mybatis的配置文件(它也加载关联的映射文件)
- //Reader reader = Resources.getResourceAsReader(resource);
- //构建sqlSession的工厂
- //SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
- //创建能执行映射文件中sql的sqlSession
- SqlSession session = sessionFactory.openSession();
- /**
- * 映射sql的标识字符串,
- * me.gacl.mapping.userMapper是userMapper.xml文件中mapper标签的namespace属性的值,
- * getUser是select标签的id属性值,通过select标签的id属性值就可以找到要执行的SQL
- */
- String statement = "me.gacl.mapping.userMapper.getUser";//映射sql的标识字符串
- //执行查询返回一个唯一user对象的sql
- User user = session.selectOne(statement, 1);
- System.out.println(user);
- }
- }

执行结果如下:
可以看到,数据库中的记录已经成功查询出来了。
三、jdbc获得数据库连接:
(1)加载驱动程序:Class.forName(driverClass)
加载mysql驱动:Class.forName("com.mysql.jdbc.Driver");
加载oracle驱动:Class.forName("oracle.jdbc.driver.OracleDriver");
(2)获得数据库连接
DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/imooc",user,password);
DriverManager.gerConnection(URL,user,password);
(3)创建Statement对象:conn.createStatement();
(4)向数据库发送SQL命令
(5)处理数据库的返回结果(ResultSet类)
- import java.sql.DriverManager;
- import java.sql.ResultSet;
- import java.sql.SQLException;
- import java.sql.Statement;
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.SQLException;
- public class javaTest {
- public static void main(String[] args) throws ClassNotFoundException, SQLException {
- String URL="jdbc:mysql://127.0.0.1:3306/imooc?useUnicode=true&characterEncoding=utf-8";
- String USER="root";
- String PASSWORD="tiger";
- //1.加载驱动程序
- Class.forName("com.mysql.jdbc.Driver");
- //2.获得数据库链接
- Connection conn=DriverManager.getConnection(URL, USER, PASSWORD);
- //3.通过数据库的连接操作数据库,实现增删改查(使用Statement类)
- Statement st=conn.createStatement();
- ResultSet rs=st.executeQuery("select * from user");
- //4.处理数据库的返回结果(使用ResultSet类)
- while(rs.next()){
- System.out.println(rs.getString("user_name")+" "
- +rs.getString("user_password"));
- }
- //关闭资源
- rs.close();
- st.close();
- conn.close();
- }
- }
乐观锁实现:
- <update id="updateUser" >
- update t_user set username=#{username},password=#{password},account=#{account} ,version=version+1 where id=#{id} and version =#{version}
- </update>
github源码:https://github.com/Nickcenter/Mybatis-Optimistic-lock-.git
mybatis基本流程、jdbc连接、ps:附mybatis(乐观锁)实现的更多相关文章
- Mybatis执行流程学习之手写mybatis雏形
Mybatis是目前开发中最常用的一款基于ORM思想的半自动持久层框架,平时我们都仅仅停留在使用阶段,对mybatis是怎样运行的并不清楚,今天抽空找到一些资料自学了一波,自己写了一个mybatis的 ...
- Mybatis执行流程浅析(附深度文章推荐&面试题集锦)
首先推荐一个简单的Mybatis原理视频教程,可以作为入门教程进行学习:点我 (该教程讲解的是如何手写简易版Mybatis) 执行流程的理解 理解Mybatis的简单流程后自己手写一个,可以解决百分之 ...
- Spring+SpringMVC+MyBatis+easyUI整合优化篇(九)数据层优化-jdbc连接池简述、druid简介
日常啰嗦 终于回到既定轨道上了,这一篇讲讲数据库连接池的相关知识,线程池以后有机会再结合项目单独写篇文章(自己给自己挖坑,不知道什么时候能填上),从这一篇文章开始到本阶段结束的文章都会围绕数据库和da ...
- MyBatis执行流程的各阶段介绍
目录 一.mybatis极简示例 1.1 创建mybatis配置文件 1.2 创建数据库表 1.3 创建javabean 1.4 创建mapper映射文件 1.5 运行测试 二.mybatis的几大“ ...
- mybatis(五)mybatis工作流程
转载:https://www.cnblogs.com/wuzhenzhao/p/11103017.html 先来看一下MyBatis 的编程式使用的方法: public void testMapper ...
- mysql数据库插入数据获取自增主键的三种方式(jdbc PreparedStatement方式、mybatis useGeneratedKeys方式、mybatis selectKey方式)
通常来说对于mysql数据库插入数据获取主键的方法是采用selectKey的方式,特别是当你持久层使用mybatis框架的时候. 本文除此之外介绍其它两种获取主键的方式. 为了方便描述我们先建一张my ...
- JavaWeb_(Mybatis框架)JDBC操作数据库和Mybatis框架操作数据库区别_一
系列博文: JavaWeb_(Mybatis框架)JDBC操作数据库和Mybatis框架操作数据库区别_一 传送门 JavaWeb_(Mybatis框架)使用Mybatis对表进行增.删.改.查操作_ ...
- MyBatis源码分析-MyBatis初始化流程
MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以对配置和原生Map使用简 ...
- 【JAVA - SSM】之MyBatis与原生JDBC、Hibernate访问数据库的比较
首先来看一下原生JDBC访问数据库的代码: public static void main(String[] args) { // 数据库连接 Connection connection = null ...
随机推荐
- SPOJ SUBLEX
SUBLEX - Lexicographical Substring Search 链接 题意 求第k小的子串.相同的算一个. 分析 建立后缀自动机,在后缀自动机上从一个点经过trans,到另一个点, ...
- 0301001_Lesson1&2
Lesson 1 Excuse me! 对不起! Listen to the tape then answer this question.Whose handbag is it?听录音,然后回答问题 ...
- Linux安装mysql以及安装时踩下的坑
安装: 检测是否已经安装了mysql rpm -qa | grep mysql 如果已经安装了,将其卸载,如: rpm -e --nodeps mysql-libs-5.1.71-1.el6.x86 ...
- scidb
貌似是给科学家用的数据库,暂不研究
- java通过句柄访问对象
在Java里,任何东西都可看作对象.尽管将一切都“看作”对象,但操纵的标识符实际是指向一个对象的“句柄”(Handle),有的人将其称作一个“引用”,甚至一个“指针”. 主类型的数据成员可直接初始化, ...
- jenkins使用Role Strategy管理用户权限
下载插件地址:https://wiki.jenkins.io/display/JENKINS/Role+Strategy+Plugin 1. 安装好插件后,进入jenkins系统管理的Configur ...
- OpenCV入门:(四:混合两张图片)
1. 原理 对两张图片使用如下公式可以得到两张图片的混合图片, 其中f0(x),f1(x)分别是图片1和图片2同一位置的像素点. 2. OpenCV中的AddWeight函数 函数和参数说明: ) s ...
- SQL的鸡肋:“视图”
不知道当年SQL定义者们设计视图时是出于什么样的考虑.实际效果是,视图夹在SQL指令和表之间,形成了一个三明治的结构.在这种结构下做检索,SQL指令每次都要通过视图转换,才能作用到表上.如果不 ...
- CodeBlocks 3 使用设置
使用MingW作为CB的默认编译器和wxWidgets进行编程,当然需要好好配置一番,因为mingw在windows下用起来着实没有win32原生态程序运行快,也没有他小,好处是借助wxwidgets ...
- 【志银】NYOJ《题目490》翻译
1.题目:翻译 1.1.题目链接 http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=490 1.2.题目内容 2.解题分析 题目输入输出格式描述不 ...