一、概述

1、概述

  mybatis 是一个优秀的基于 java 的持久层框架,它内部封装了 jdbc,使开发者只需要关注 sql 语句本身, 而不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁杂的过程。

  mybatis 通过 xml 或注解的方式将要执行的各种 statement 配置起来,并通过 java 对象和 statement 中 sql 的动态参数进行映射生成最终执行的 sql 语句,最后由 mybatis 框架执行 sql 并将结果映射为 java 对象并 返回。

  采用 ORM 思想解决了实体和数据库映射的问题,对 jdbc 进行了封装,屏蔽了 jdbc api 底层访问细节,使我 们不用与 jdbc api 打交道,就可以完成对数据库的持久化操作。

2、 JDBC编程

 (1)步骤

  1>加载数据库驱动

  2>创建并获取数据库链接

  3>创建jdbc statement对象

  4>设置sql语句

  5>设置sql语句中的参数(使用preparedStatement)

  6>通过statement执行sql并获取结果

  7>对sql执行结果进行解析处理

  8>释放资源(resultSet、preparedstatement、connection)

  1. package com.xhbjava;
  2.  
  3. import java.sql.Connection;
  4. import java.sql.DriverManager;
  5. import java.sql.PreparedStatement;
  6. import java.sql.ResultSet;
  7. import java.sql.SQLException;
  8.  
  9. /**
  10. * JDBC编程测试
  11. *
  12. * @author Mr.wang
  13. * @date 2020年1月6日
  14. */
  15. public class JdbcTest {
  16.  
  17. public static void main(String[] args) {
  18. // 1.数据库连接
  19. Connection conn = null;
  20. // 2.数据库预编译
  21. PreparedStatement ps = null;
  22. // 3.结果集
  23. ResultSet resultSet = null;
  24. try {
  25. // 4.加载数据库驱动
  26. Class.forName("com.mysql.jdbc.Driver");
  27. // 5.通过驱动管理类获取数据库库链接
  28. conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/easy_mybatis?characterEncoding=utf-8",
  29. "root", "root");
  30. // 6.sql语句
  31. String sql = "select * from user where username=?";
  32. // 7.获取预处理
  33. ps = conn.prepareStatement(sql);
  34. // 8.设置入参
  35. ps.setString(1, "王小码");
  36. // 9.向数据库发出sql,执行查询,返回结果集
  37. resultSet = ps.executeQuery();
  38. // 10.遍历结果集
  39. while (resultSet.next()) {
  40. System.out.println("id:" + resultSet.getInt("id") + "username:" + resultSet.getString("username"));
  41. }
  42. } catch (Exception e) {
  43. e.printStackTrace();
  44. } finally {
  45. // 11.关闭释放为空的资源
  46. if (resultSet != null) {
  47. try {
  48. resultSet.close();
  49. } catch (SQLException e) {
  50. // TODO Auto-generated catch block
  51. e.printStackTrace();
  52. }
  53. }
  54. if (ps != null) {
  55. try {
  56. ps.close();
  57. } catch (SQLException e) {
  58. // TODO Auto-generated catch block
  59. e.printStackTrace();
  60. }
  61.  
  62. }
  63. if (conn != null) {
  64. try {
  65. conn.close();
  66. } catch (SQLException e) {
  67. // TODO Auto-generated catch block
  68. e.printStackTrace();
  69. }
  70. }
  71.  
  72. }
  73.  
  74. }
  75.  
  76. }

(3)JDBC编程存在的问题

  1>数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可以解决此问题。

  2>Sql 语句在代码中硬编码,造成代码不易维护,实际应用 sql 变化的可能较大,sql 变动需要改变 java代码,sql放入xml文件中方便维护。

  where 条件不一定,可能多也可能少,修改 sql 还要修改代码,系统不易维护,将sql语句及占位符号和参数全部配置在xml中可以解决此问题。

二、Mybatis入门案例

1、创建maven工程

(1)打开eclipse,File-New,新建maven工程,过程如图:

  接下来以此输入:

   Group Id 中输入项目的基本包名。

Artifact Id 中输入项目名。

Version 中的值默认就行,不进行选择。

Package 中写的是默认生成的一个包名,不写也可以。

   接着点击完成就可以了

工程目录如下图:

完整的项目结构:

2、引入Mybatis及其他依赖

  在 pom.xml 文件中添加 Mybatis3.4.6 的坐标,如下:

  1. <project xmlns="http://maven.apache.org/POM/4.0.0"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <groupId>com.xhbjava</groupId>
  6. <artifactId>Mybatis01</artifactId>
  7. <packaging>war</packaging>
  8. <version>0.0.1-SNAPSHOT</version>
  9. <name>Mybatis01 Maven Webapp</name>
  10. <url>http://maven.apache.org</url>
  11. <dependencies>
  12. <dependency>
  13. <groupId>org.mybatis</groupId>
  14. <artifactId>mybatis</artifactId>
  15. <version>3.4.6</version>
  16. </dependency>
  17. <dependency>
  18. <groupId>mysql</groupId>
  19. <artifactId>mysql-connector-java</artifactId>
  20. <version>8.0.15</version>
  21. </dependency>
  22. <dependency>
  23. <groupId>log4j</groupId>
  24. <artifactId>log4j</artifactId>
  25. <version>1.2.12</version>
  26. </dependency>
  27. <dependency>
  28. <groupId>junit</groupId>
  29. <artifactId>junit</artifactId>
  30. <version>3.8.1</version>
  31. <scope>test</scope>
  32. </dependency>
  33. </dependencies>
  34. <build>
  35. <finalName>Mybatis01</finalName>
  36. </build>
  37. </project>

3、编写 User 实体类

  

  1. package com.xhbjava.domain;
  2.  
  3. import java.io.Serializable;
  4. import java.util.Date;
  5.  
  6. /**
  7. * User类
  8. *
  9. * @author Mr.wang
  10. * @date 2020年1月7日
  11. */
  12. public class User implements Serializable {
  13. private static final long serialVersionUID = 1L;
  14. private Integer id;
  15. private String username;
  16. private Date birthday;
  17. private String sex;
  18. private String address;
  19.  
  20. public Integer getId() {
  21. return id;
  22. }
  23.  
  24. public void setId(Integer id) {
  25. this.id = id;
  26. }
  27.  
  28. public String getUsername() {
  29. return username;
  30. }
  31.  
  32. public void setUsername(String username) {
  33. this.username = username;
  34. }
  35.  
  36. public Date getBirthday() {
  37. return birthday;
  38. }
  39.  
  40. public void setBirthday(Date birthday) {
  41. this.birthday = birthday;
  42. }
  43.  
  44. public String getSex() {
  45. return sex;
  46. }
  47.  
  48. public void setSex(String sex) {
  49. this.sex = sex;
  50. }
  51.  
  52. public String getAddress() {
  53. return address;
  54. }
  55.  
  56. public void setAddress(String address) {
  57. this.address = address;
  58. }
    @Override
  59. public String toString() {
  60. return "User [id=" + id + ", username=" + username + ", birthday=" + birthday + ", sex=" + sex + ", address="
  61. + address + "]";
  62. }
  63.  
  64. }

4、编写持久层接口IUserDao

  1. package com.xhbjava.dao;
  2.  
  3. import java.util.List;
  4.  
  5. import com.xhbjava.domain.User;
  6.  
  7. /**
  8. * 持久层
  9. *
  10. * @author Mr.wang
  11. * @date 2020年1月7日
  12. */
  13. public interface IUserDao {
  14. /**
  15. * 查询所有用户
  16. * @return
  17. */
  18. List<User> findAll();
  19.  
  20. }

5、编写持久层接口的映射文件 IUserDao.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="com.xhbjava.dao.IUserDao">
  6. <select id="findAll" resultType="com.xhbjava.domain.User">
  7. select * from user
  8. </select>
  9.  
  10. </mapper>

6、编写 SqlMapConfig.xml 配置文件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE configuration
  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <!-- 主配置文件 -->
  6. <configuration>
  7. <!-- 配置环境 -->
  8. <environments default="mysql">
  9. <!-- 配置mysql环境 -->
  10. <environment id="mysql">
  11. <!-- 配置事务类型 -->
  12. <transactionManager type="JDBC"></transactionManager>
  13. <!-- 配置数据源 -->
  14. <dataSource type="POOLED">
  15. <property name="driver" value="com.mysql.cj.jdbc.Driver" />
  16. <property name="url" value="jdbc:mysql://localhost:3306/easy_mybatis?autoReconnect=true&amp;useUnicode=true&amp;characterEncoding=utf8&amp;zeroDateTimeBehavior=CONVERT_TO_NULL&amp;useSSL=false&amp;serverTimezone=CTT" />
  17. <property name="username" value="root" />
  18. <property name="password" value="root" />
  19. </dataSource>
  20. </environment>
  21. </environments>
  22. <!-- 配置映射文件 -->
  23. <mappers>
  24. <mapper resource="com/xhbjava/dao/IUserDao.xml" />
  25. </mappers>
  26. </configuration>

7、加入log4j配置文件

8、编写测试类

  1. package com.xhbjava.test;
  2.  
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5. import java.util.List;
  6.  
  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. import com.xhbjava.dao.IUserDao;
  13. import com.xhbjava.domain.User;
  14.  
  15. /**
  16. * 测试类
  17. *
  18. * @author Mr.wang
  19. * @date 2020年1月7日
  20. */
  21. public class MybatisTest {
  22.  
  23. public static void main(String[] args) throws IOException {
  24. // 1.读取配置文件
  25. InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
  26. // 2.创建SqlSessionFactory工厂
  27. SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
  28. SqlSessionFactory factory = builder.build(in);
  29. // 3.使用工厂生产SqlSession对象
  30. SqlSession session = factory.openSession();
  31. // 4.使用SqlSession创建Dao接口代理对象
  32. IUserDao userDao = session.getMapper(IUserDao.class);
  33. // 5.使用代理对象执行方法
  34. List<User> users = userDao.findAll();
  35. // 6.打印测试信息
  36. for (User user : users) {
  37. System.out.println(user);
  38. }
  39. // 7.释放资源
  40. session.close();
  41. in.close();
  42. }
  43.  
  44. }

9.遇到的问题

  mysql版本

此时mysql连接如下:

  1. <property name="url" value="jdbc:mysql://localhost:3306/easy_mybatis?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=CTT" />

运行测试类报错:

  1. Exception in thread "main" org.apache.ibatis.exceptions.PersistenceException:
  2. ### Error building SqlSession.
  3. ### Cause: org.apache.ibatis.builder.BuilderException: Error creating document instance. Cause: org.xml.sax.SAXParseException; lineNumber: 16; columnNumber: 103; 对实体 "useUnicode" 的引用必须以 ';' 分隔符结尾。
  4. at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)
  5. at org.apache.ibatis.session.SqlSessionFactoryBuilder.build(SqlSessionFactoryBuilder.java:80)
  6. at org.apache.ibatis.session.SqlSessionFactoryBuilder.build(SqlSessionFactoryBuilder.java:64)
  7. at com.xhbjava.test.MybatisTest.main(MybatisTest.java:28)
  8. Caused by: org.apache.ibatis.builder.BuilderException: Error creating document instance. Cause: org.xml.sax.SAXParseException; lineNumber: 16; columnNumber: 103; 对实体 "useUnicode" 的引用必须以 ';' 分隔符结尾。
  9. at org.apache.ibatis.parsing.XPathParser.createDocument(XPathParser.java:259)
  10. at org.apache.ibatis.parsing.XPathParser.<init>(XPathParser.java:125)
  11. at org.apache.ibatis.builder.xml.XMLConfigBuilder.<init>(XMLConfigBuilder.java:82)
  12. at org.apache.ibatis.session.SqlSessionFactoryBuilder.build(SqlSessionFactoryBuilder.java:77)
  13. ... 2 more
  14. Caused by: org.xml.sax.SAXParseException; lineNumber: 16; columnNumber: 103; 对实体 "useUnicode" 的引用必须以 ';' 分隔符结尾。
  15. at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:203)
  16. at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:177)
  17. at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:441)
  18. at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:368)
  19. at com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(XMLScanner.java:1436)
  20. at com.sun.org.apache.xerces.internal.impl.XMLScanner.scanAttributeValue(XMLScanner.java:890)
  21. at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanAttribute(XMLDocumentFragmentScannerImpl.java:1547)
  22. at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanStartElement(XMLDocumentFragmentScannerImpl.java:1319)
  23. at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2786)
  24. at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:606)
  25. at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:510)
  26. at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:848)
  27. at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:777)
  28. at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
  29. at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:243)
  30. at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:348)
  31. at org.apache.ibatis.parsing.XPathParser.createDocument(XPathParser.java:257)

解决办法:

修改数据库配置

  1. <property name="url" value="jdbc:mysql://localhost:3306/easy_mybatis?autoReconnect=true&amp;useUnicode=true&amp;characterEncoding=utf8&amp;zeroDateTimeBehavior=CONVERT_TO_NULL&amp;useSSL=false&amp;serverTimezone=CTT" />

三、基于注解的Mybatis入门案例

  我们在上个例子基础上进行修改实现。

1.在持久层接口中添加注释

  

  1. package com.xhbjava.dao;
  2.  
  3. import java.util.List;
  4.  
  5. import org.apache.ibatis.annotations.Select;
  6.  
  7. import com.xhbjava.domain.User;
  8.  
  9. /**
  10. * 持久层
  11. *
  12. * @author Mr.wang
  13. * @date 2020年1月7日
  14. */
  15. public interface IUserDao {
  16. /**
  17. * 查询所有用户
  18. * @return
  19. */
  20. @Select("select * from user")
  21. List<User> findAll();
  22.  
  23. }

2.修改SqlMapConfig.xml

  

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE configuration
  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <!-- 主配置文件 -->
  6. <configuration>
  7. <!-- 配置环境 -->
  8. <environments default="mysql">
  9. <!-- 配置mysql环境 -->
  10. <environment id="mysql">
  11. <!-- 配置事务类型 -->
  12. <transactionManager type="JDBC"></transactionManager>
  13. <!-- 配置数据源 -->
  14. <dataSource type="POOLED">
  15. <property name="driver" value="com.mysql.cj.jdbc.Driver" />
  16. <property name="url" value="jdbc:mysql://localhost:3306/easy_mybatis?autoReconnect=true&amp;useUnicode=true&amp;characterEncoding=utf8&amp;zeroDateTimeBehavior=CONVERT_TO_NULL&amp;useSSL=false&amp;serverTimezone=CTT" />
  17. <property name="username" value="root" />
  18. <property name="password" value="root" />
  19. </dataSource>
  20. </environment>
  21. </environments>
  22. <!-- 配置映射文件 -->
  23. <mappers>
  24. <mapper class="com.xhbjava.dao.IUserDao" />
  25. </mappers>
  26. </configuration>

3.删除IUserDao.xml

<?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><!-- 配置环境 --><environments default="mysql"><!-- 配置mysql环境 --><environment id="mysql"><!-- 配置事务类型 --><transactionManager type="JDBC"></transactionManager><!-- 配置数据源 --><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver" /><property name="url" value="jdbc:mysql://localhost:3306/easy_mybatis?autoReconnect=true&amp;useUnicode=true&amp;characterEncoding=utf8&amp;zeroDateTimeBehavior=CONVERT_TO_NULL&amp;useSSL=false&amp;serverTimezone=CTT" /><property name="username" value="root" /><property name="password" value="root" /></dataSource></environment></environments><!-- 配置映射文件 --><mappers><mapper resource="com/xhbjava/dao/IUserDao.xml" /></mappers></configuration>

Mybatis(1)-初识mybaits的更多相关文章

  1. mybatis入门--初识mybatis

    初识mybatis 今天,一起来说说mybits这个框架吧.这是一个持久层的框架.之前叫做ibatis.所以,在它的代码中出现ibatis这个词的时候,不要感到惊讶.不是写错了,它确实就是这个样子的. ...

  2. 【MyBatis】-----初识【MyBatis】

    一.核心配置文件 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration ...

  3. Mybatis入门及Dao开发方式

    本节内容: Mybatis介绍 使用jdbc编程问题总结 Mybatis架构 Mybatis入门程序 Dao的开发方式 SqlMapConfig.xml文件说明 一.Mybatis介绍 MyBatis ...

  4. Spring Boot+Mybatis+Pagehelper分页

    Spring Boot 集成MyBatis和Pagehelper分页插件 mybatis-spring-boot-starter依赖树如下: pom配置 <project xmlns=" ...

  5. 深入理解Mybatis插件

    Mybatis插件实现原理 本文如有任何纰漏.错误,请不吝指出,谢谢! 首先,我并没有使用过 Mybatis的插件,但是这个和我写这篇文章并不冲突,估计能真正使用到插件的人也比较少,写这篇文章的目的主 ...

  6. SpringBoot整合MyBatisPlus配置动态数据源

    目录 SpringBoot整合MyBatisPlus配置动态数据源 SpringBoot整合MyBatisPlus配置动态数据源 推文:2018开源中国最受欢迎的中国软件MyBatis-Plus My ...

  7. IntelliJ IDEA 插件推荐

    1.GenerateAllSetter 自动生成类set方法 2.GsonFormat 根据JSON创建实体 3.Lombok plugin 简化代码 4. .ignore 忽略git提交文件 5.A ...

  8. 金九银十已到!掌握这300道java高频面试题,助你面试BAT无忧!

    前言 不知不觉已经到了九月了,回首看年初的时候简直像做梦一样.不得不说时间真的是无情一般的流逝,题外话就不多说了!回归正题,现在已经到了今年最后一波大好的跳槽涨薪的时机了,错过了这一次可能你就得等到明 ...

  9. SpringBoot入门08-整合Mabatis

    整合所需的依赖 注解方式和映射文件方式的mybatis都可以被整合进springboot 创建springboot的web项目后,在pom加入spring-mybatis和mysql-jdbc和thy ...

随机推荐

  1. 081、Java数组之数组传递

    01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...

  2. 题解 CF1131C 【Birthday】

    CF大水题 题意:给你n个人,他们的身高是a[i],让你将这几个人排成一个环,使得他们两两之间身高差的和最小. 思路:简单到爆了,恶意评分上蓝.直接将那几个人排个序,然后按序左右放就行了,也就是说1号 ...

  3. 1_01_MSSQL课程_基础入门2

    1.数据库的迁移方案 ->分离 附加 ->权限问题: ->启用Administrator账号 ->把数据库文件放到默认的数据库文件存放目录. ->数据库文件兼容级别,设置 ...

  4. HihoCoder第五周:标准动态规划

    这周的题目是最标准最简单的动态规划了,自己一直以来对动态规划都不是很理解,这次也是好好记录一下. 题目1 :数字三角形 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 问题描述 ...

  5. 习题两则的简化(利用for循环)

    习题一.打印26个英文字母 public class PrintChars { public static void main(String[] args) { char ch = 'a'; int ...

  6. AS3.0判断数组中最大值

    function getMax(Arr) { if (typeof Arr !="object") {     return null;  }  for (var i=0,max= ...

  7. windows搭建安装react-native环境

    在win10环境下,利用Genymotion模拟器,配置react-native的环境. 一.安装JDK 在网上下载jdk,版本最好是1.8以上.安装后要对环境变量进行配置. 同时在 Path 中配置 ...

  8. 吴裕雄--天生自然java开发常用类库学习笔记:观察者设计模式

    import java.util.* ; class House extends Observable{ // 表示房子可以被观察 private float price ;// 价钱 public ...

  9. NO11 SSH故障排查思路和netstat命令

    本章知识相关考试:1.企业场景面试题:Linux系统如何优化?2.企业场景面试题:SSH服务连不上,如何排查?记住回答技巧: 1 ping  2 telnet 客户端ssh工具:SecureCRT,x ...

  10. Adapter之自定义Adapter

    前言: 在我们写程序是经常会用到适配器,当系统自带的适配器不够用时即可自己定义适配器 正文: 因为我们用到的ListView视图所以我们先初始化ListView,在我们的主活动中添加如下代码 < ...