一、前言

  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的执行流程
  1. 读取mybatis配置文件
  2. 根据读取到配置文件生成SqlSessionFactory
  3. 创建SqlSession对象(开启事务)
  4. 操作目标数据库
  5. 提交事务
  6. 关闭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. 1 create database mybatis;
  2. 2 use mybatis;
  3. 3 CREATE TABLE users(id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(20), age INT);
  4. 4 INSERT INTO users(NAME, age) VALUES('孤傲苍狼', 27);
  5. 5 INSERT INTO users(NAME, age) VALUES('白虎神皇', 27);

  将SQL脚本在MySQL数据库中执行,完成创建数据库和表的操作,如下:

  

  到此,前期的开发环境准备工作全部完成。

2.2、使用MyBatis查询表中的数据

  1、添加Mybatis的配置文件conf.xml

  在src目录下创建一个conf.xml文件,如下图所示:

  

  conf.xml文件中的内容如下:

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

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

  

  User类的代码如下:

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

  3、定义操作users表的sql映射文件userMapper.xml

  创建一个me.gacl.mapping包,专门用于存放sql映射文件,在包中创建一个userMapper.xml文件,如下图所示:

  

  userMapper.xml文件的内容如下:

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

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

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

  5、编写测试代码:执行定义的select语句

  创建一个Test1类,编写如下的测试代码:

  1. package me.gacl.test;
  2.  
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5. import java.io.Reader;
  6. import me.gacl.domain.User;
  7. import org.apache.ibatis.io.Resources;
  8. import org.apache.ibatis.session.SqlSession;
  9. import org.apache.ibatis.session.SqlSessionFactory;
  10. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
  11.  
  12. public class Test1 {
  13.  
  14. public static void main(String[] args) throws IOException {
  15. //mybatis的配置文件
  16. String resource = "conf.xml";
  17. //使用类加载器加载mybatis的配置文件(它也加载关联的映射文件)
  18. InputStream is = Test1.class.getClassLoader().getResourceAsStream(resource);
  19. //构建sqlSession的工厂
  20. SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
  21. //使用MyBatis提供的Resources类加载mybatis的配置文件(它也加载关联的映射文件)
  22. //Reader reader = Resources.getResourceAsReader(resource);
  23. //构建sqlSession的工厂
  24. //SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
  25. //创建能执行映射文件中sql的sqlSession
  26. SqlSession session = sessionFactory.openSession();
  27. /**
  28. * 映射sql的标识字符串,
  29. * me.gacl.mapping.userMapper是userMapper.xml文件中mapper标签的namespace属性的值,
  30. * getUser是select标签的id属性值,通过select标签的id属性值就可以找到要执行的SQL
  31. */
  32. String statement = "me.gacl.mapping.userMapper.getUser";//映射sql的标识字符串
  33. //执行查询返回一个唯一user对象的sql
  34. User user = session.selectOne(statement, 1);
  35. System.out.println(user);
  36. }
  37. }

  执行结果如下:

  

  可以看到,数据库中的记录已经成功查询出来了。

三、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类)

  1. import java.sql.DriverManager;
  2. import java.sql.ResultSet;
  3. import java.sql.SQLException;
  4. import java.sql.Statement;
  5. import java.sql.Connection;
  6. import java.sql.DriverManager;
  7. import java.sql.SQLException;
  8.  
  9. public class javaTest {
  10.  
  11. public static void main(String[] args) throws ClassNotFoundException, SQLException {
  12. String URL="jdbc:mysql://127.0.0.1:3306/imooc?useUnicode=true&amp;characterEncoding=utf-8";
  13. String USER="root";
  14. String PASSWORD="tiger";
  15. //1.加载驱动程序
  16. Class.forName("com.mysql.jdbc.Driver");
  17. //2.获得数据库链接
  18. Connection conn=DriverManager.getConnection(URL, USER, PASSWORD);
  19. //3.通过数据库的连接操作数据库,实现增删改查(使用Statement类)
  20. Statement st=conn.createStatement();
  21. ResultSet rs=st.executeQuery("select * from user");
  22. //4.处理数据库的返回结果(使用ResultSet类)
  23. while(rs.next()){
  24. System.out.println(rs.getString("user_name")+" "
  25. +rs.getString("user_password"));
  26. }
  27.  
  28. //关闭资源
  29. rs.close();
  30. st.close();
  31. conn.close();
  32. }
  33. }

乐观锁实现:

  1. <update id="updateUser" >
  2. update t_user set username=#{username},password=#{password},account=#{account} ,version=version+1 where id=#{id} and version =#{version}
  3. </update>

github源码:https://github.com/Nickcenter/Mybatis-Optimistic-lock-.git

mybatis基本流程、jdbc连接、ps:附mybatis(乐观锁)实现的更多相关文章

  1. Mybatis执行流程学习之手写mybatis雏形

    Mybatis是目前开发中最常用的一款基于ORM思想的半自动持久层框架,平时我们都仅仅停留在使用阶段,对mybatis是怎样运行的并不清楚,今天抽空找到一些资料自学了一波,自己写了一个mybatis的 ...

  2. Mybatis执行流程浅析(附深度文章推荐&面试题集锦)

    首先推荐一个简单的Mybatis原理视频教程,可以作为入门教程进行学习:点我 (该教程讲解的是如何手写简易版Mybatis) 执行流程的理解 理解Mybatis的简单流程后自己手写一个,可以解决百分之 ...

  3. Spring+SpringMVC+MyBatis+easyUI整合优化篇(九)数据层优化-jdbc连接池简述、druid简介

    日常啰嗦 终于回到既定轨道上了,这一篇讲讲数据库连接池的相关知识,线程池以后有机会再结合项目单独写篇文章(自己给自己挖坑,不知道什么时候能填上),从这一篇文章开始到本阶段结束的文章都会围绕数据库和da ...

  4. MyBatis执行流程的各阶段介绍

    目录 一.mybatis极简示例 1.1 创建mybatis配置文件 1.2 创建数据库表 1.3 创建javabean 1.4 创建mapper映射文件 1.5 运行测试 二.mybatis的几大“ ...

  5. mybatis(五)mybatis工作流程

    转载:https://www.cnblogs.com/wuzhenzhao/p/11103017.html 先来看一下MyBatis 的编程式使用的方法: public void testMapper ...

  6. mysql数据库插入数据获取自增主键的三种方式(jdbc PreparedStatement方式、mybatis useGeneratedKeys方式、mybatis selectKey方式)

    通常来说对于mysql数据库插入数据获取主键的方法是采用selectKey的方式,特别是当你持久层使用mybatis框架的时候. 本文除此之外介绍其它两种获取主键的方式. 为了方便描述我们先建一张my ...

  7. JavaWeb_(Mybatis框架)JDBC操作数据库和Mybatis框架操作数据库区别_一

    系列博文: JavaWeb_(Mybatis框架)JDBC操作数据库和Mybatis框架操作数据库区别_一 传送门 JavaWeb_(Mybatis框架)使用Mybatis对表进行增.删.改.查操作_ ...

  8. MyBatis源码分析-MyBatis初始化流程

    MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以对配置和原生Map使用简 ...

  9. 【JAVA - SSM】之MyBatis与原生JDBC、Hibernate访问数据库的比较

    首先来看一下原生JDBC访问数据库的代码: public static void main(String[] args) { // 数据库连接 Connection connection = null ...

随机推荐

  1. SPOJ SUBLEX

    SUBLEX - Lexicographical Substring Search 链接 题意 求第k小的子串.相同的算一个. 分析 建立后缀自动机,在后缀自动机上从一个点经过trans,到另一个点, ...

  2. 0301001_Lesson1&2

    Lesson 1 Excuse me! 对不起! Listen to the tape then answer this question.Whose handbag is it?听录音,然后回答问题 ...

  3. Linux安装mysql以及安装时踩下的坑

    安装: 检测是否已经安装了mysql rpm -qa | grep mysql 如果已经安装了,将其卸载,如: rpm -e --nodeps  mysql-libs-5.1.71-1.el6.x86 ...

  4. scidb

    貌似是给科学家用的数据库,暂不研究

  5. java通过句柄访问对象

    在Java里,任何东西都可看作对象.尽管将一切都“看作”对象,但操纵的标识符实际是指向一个对象的“句柄”(Handle),有的人将其称作一个“引用”,甚至一个“指针”. 主类型的数据成员可直接初始化, ...

  6. jenkins使用Role Strategy管理用户权限

    下载插件地址:https://wiki.jenkins.io/display/JENKINS/Role+Strategy+Plugin 1. 安装好插件后,进入jenkins系统管理的Configur ...

  7. OpenCV入门:(四:混合两张图片)

    1. 原理 对两张图片使用如下公式可以得到两张图片的混合图片, 其中f0(x),f1(x)分别是图片1和图片2同一位置的像素点. 2. OpenCV中的AddWeight函数 函数和参数说明: ) s ...

  8. SQL的鸡肋:“视图”

        不知道当年SQL定义者们设计视图时是出于什么样的考虑.实际效果是,视图夹在SQL指令和表之间,形成了一个三明治的结构.在这种结构下做检索,SQL指令每次都要通过视图转换,才能作用到表上.如果不 ...

  9. CodeBlocks 3 使用设置

    使用MingW作为CB的默认编译器和wxWidgets进行编程,当然需要好好配置一番,因为mingw在windows下用起来着实没有win32原生态程序运行快,也没有他小,好处是借助wxwidgets ...

  10. 【志银】NYOJ《题目490》翻译

    1.题目:翻译 1.1.题目链接 http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=490 1.2.题目内容 2.解题分析 题目输入输出格式描述不 ...