[关闭]
@MrXiao 2018-02-27T15:14:24.000000Z 字数 7393 阅读 903

Mybatis(1)——入门

Mybatis


MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis,实质上Mybatis对ibatis进行一些改进。
MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。
Mybatis通过xml或注解的方式将要执行的各种statement(statement、preparedStatemnt、CallableStatement)配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。

1、资源下载

mybaits的代码由github.com管理,地址:https://github.com/mybatis/mybatis-3/releases
要使用 MyBatis, 只需将 mybatis-x.x.x.jar 文件置于 classpath 中即可。

如果使用 Maven 来构建项目,则需将下面的 dependency 代码置于 pom.xml 文件中:

  1. <dependency>
  2. <groupId>org.mybatis</groupId>
  3. <artifactId>mybatis</artifactId>
  4. <version>x.x.x</version>
  5. </dependency>

2、架构

mybatis原理图

  1. SqlMapConfig.xml
    mybatis的全局配置文件,配置了运行环境等信息。mapper.xml即映射文件,里面配置了操作数据库的sql语句,该类文件需要在SqlMapConfig.xml中加载。
  2. SqlSessionFactory
    通过mybatis环境等配置信息构造SqlSessionFactory即会话工厂
  3. SqlSession
    由会话工厂创建sqlSession即会话,操作数据库需要通过sqlSession进行
  4. Executor
    mybatis底层自定义了Executor执行器接口操作数据库,Executor接口有两个实现,一个是基本执行器、一个是缓存执行器。
  5. Mapper Statement
    mybatis底层封装对象,它包装了mybatis配置信息及sql映射信息等。mapper.xml文件中一个sql对应一个Mapped Statement对象,sql的id即是Mapped statement的id。
    Mapped Statement对sql执行输入参数进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql前将输入的java对象映射至sql中,输入参数映射就是jdbc编程中对preparedStatement设置参数。
    Mapped Statement对sql执行输出结果进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql后将输出结果映射至java对象中,输出结果映射过程相当于jdbc编程中对结果的解析处理过程。

3、特点

此处输入图片的描述

上边使用jdbc的原始方法(未经封装)实现了查询数据库表记录的操作。

JDBC编程问题总结:
1、 数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。
解决:在SqlMapConfig.xml中配置数据链接池,使用连接池管理数据库链接
2、 Sql语句在代码中硬编码,造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。
解决:将Sql语句配置在XXXXmapper.xml文件中与java代码分离。
3、 使用preparedStatement向占有位符号传参数存在硬编码,因为sql语句的where条件不一定,可能多也可能少,修改sql还要修改代码,系统不易维护。
解决:Mybatis自动将java对象映射至sql语句,通过statement中的parameterType定义输入参数的类型。
4、 对结果集解析存在硬编码(查询列名),sql变化导致解析代码变化,系统不易维护,如果能将数据库记录封装成pojo对象解析比较方便。
解决:Mybatis自动将sql执行结果映射至java对象,通过statement中的resultType定义输出结果的类型。

4、入门程序搭建

需求:查询图书id查询图书信息

创建数据库,新建book表:

  1. CREATE TABLE `book` (
  2. `book_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '图书ID',
  3. `name` varchar(100) NOT NULL COMMENT '图书名称',
  4. `number` int(11) NOT NULL COMMENT '馆藏数量',
  5. PRIMARY KEY (`book_id`)
  6. ) ENGINE=InnoDB AUTO_INCREMENT=1004 DEFAULT CHARSET=utf8 COMMENT='图书表'
  7. INSERT INTO `book` VALUES ('1000', 'Java程序设计', '10');
  8. INSERT INTO `book` VALUES ('1001', '数据结构', '10');
  9. INSERT INTO `book` VALUES ('1002', '设计模式', '10');
  10. INSERT INTO `book` VALUES ('1003', '编译原理', '10');

4.1、maven创建java工程

省略

4.2、引入依赖

加入mybatis核心包、依赖包、数据驱动包。完整的pom配置如下:

  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  3. <modelVersion>4.0.0</modelVersion>
  4. <groupId>com.topvision.maven</groupId>
  5. <artifactId>mybatis</artifactId>
  6. <version>0.0.1-SNAPSHOT</version>
  7. <packaging>jar</packaging>
  8. <name>mybatis</name>
  9. <url>http://maven.apache.org</url>
  10. <properties>
  11. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  12. <mybatis.version>3.4.5</mybatis.version>
  13. </properties>
  14. <dependencyManagement>
  15. <dependencies>
  16. <dependency>
  17. <groupId>org.mybatis</groupId>
  18. <artifactId>mybatis</artifactId>
  19. <version>${mybatis.version}</version>
  20. </dependency>
  21. </dependencies>
  22. </dependencyManagement>
  23. <dependencies>
  24. <!-- mybatis -->
  25. <dependency>
  26. <groupId>org.mybatis</groupId>
  27. <artifactId>mybatis</artifactId>
  28. </dependency>
  29. <dependency>
  30. <groupId>org.mybatis</groupId>
  31. <artifactId>mybatis-spring</artifactId>
  32. <version>1.3.1</version>
  33. </dependency>
  34. <!-- mysql驱动 -->
  35. <dependency>
  36. <groupId>mysql</groupId>
  37. <artifactId>mysql-connector-java</artifactId>
  38. <version>5.1.6</version>
  39. <scope>runtime</scope>
  40. </dependency>
  41. <!-- c3p0 -->
  42. <dependency>
  43. <groupId>c3p0</groupId>
  44. <artifactId>c3p0</artifactId>
  45. <version>0.9.1.2</version>
  46. </dependency>
  47. <!-- slf4j -->
  48. <dependency>
  49. <groupId>org.slf4j</groupId>
  50. <artifactId>slf4j-api</artifactId>
  51. <version>1.7.5</version>
  52. </dependency>
  53. <dependency>
  54. <groupId>org.slf4j</groupId>
  55. <artifactId>slf4j-log4j12</artifactId>
  56. <version>1.7.12</version>
  57. </dependency>
  58. <dependency>
  59. <groupId>log4j</groupId>
  60. <artifactId>log4j</artifactId>
  61. <version>1.2.17</version>
  62. </dependency>
  63. <!-- junit -->
  64. <dependency>
  65. <groupId>junit</groupId>
  66. <artifactId>junit</artifactId>
  67. <version>4.9</version>
  68. <scope>test</scope>
  69. </dependency>
  70. </dependencies>
  71. <build>
  72. <plugins>
  73. <plugin>
  74. <groupId>org.apache.maven.plugins</groupId>
  75. <artifactId>maven-compiler-plugin</artifactId>
  76. <configuration>
  77. <source>1.8</source>
  78. <target>1.8</target>
  79. <encoding>UTF-8</encoding>
  80. </configuration>
  81. </plugin>
  82. </plugins>
  83. <finalName>mybatis</finalName>
  84. </build>
  85. </project>

4.3、log4j.properties

在classpath下加入日志配置:

  1. #定义LOG输出级别
  2. log4j.rootLogger=DEBUG,Console,File
  3. #定义日志输出目的地为控制台
  4. log4j.appender.Console=org.apache.log4j.ConsoleAppender
  5. log4j.appender.Console.Target=System.out
  6. #可以灵活地指定日志输出格式,下面一行是指定具体的格式
  7. log4j.appender.Console.layout = org.apache.log4j.PatternLayout
  8. log4j.appender.Console.layout.ConversionPattern=[%c] - %m%n
  9. #文件大小到达指定尺寸的时候产生一个新的文件
  10. log4j.appender.File = org.apache.log4j.RollingFileAppender
  11. #指定输出目录
  12. log4j.appender.File.File = logs/ssm.log
  13. #定义文件最大大小
  14. log4j.appender.File.MaxFileSize = 10MB
  15. #输出所有日志,如果换成DEBUG表示输出DEBUG以上级别日志
  16. log4j.appender.File.Threshold = ALL
  17. log4j.appender.File.layout = org.apache.log4j.PatternLayout
  18. log4j.appender.File.layout.ConversionPattern =[%p] [%d{yyyy-MM-dd HH\:mm\:ss}][%c]%m%n

4.4、jdbc.properties

在classpath下新建数据库连接文件。

  1. jdbc.driverClass = com.mysql.jdbc.Driver
  2. jdbc.url = jdbc:mysql://localhost:3306/springdb?characterEncoding=utf-8
  3. jdbc.username = root
  4. jdbc.password = 123

4.4、SqlMapConfig.xml

在classpath下新建SqlMapConfig.xml文件,配置mybatis运行环境。

  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. <configuration>
  6. <properties resource="jdbc.properties"/>
  7. <!-- 和spring整合后 environments配置将废除 -->
  8. <environments default="development">
  9. <environment id="development">
  10. <!-- 使用jdbc事务管理 -->
  11. <transactionManager type="JDBC" />
  12. <!-- 数据库连接池 -->
  13. <dataSource type="POOLED">
  14. <property name="driver" value="${jdbc.driverClass}" />
  15. <property name="url" value="${jdbc.url}" />
  16. <property name="username" value="${jdbc.username}" />
  17. <property name="password" value="${jdbc.password}" />
  18. </dataSource>
  19. </environment>
  20. </environments>
  21. </configuration>

SqlMapConfig.xml是mybatis核心配置文件,上边文件的配置内容为数据源、事务管理。

4.5、编写Po类

Po类作为mybatis进行sql映射使用,po类通常与数据库表对应,Book.java如下:

  1. public class Book {
  2. private long bookId;// 图书ID
  3. private String name;// 图书名称
  4. private int number;// 馆藏数量
  5. ...

4.6、编写映射文件(sql)

在classpath下的sqlmap目录下创建sql映射文件Book.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="test">
  6. <select id="queryById" parameterType="long" resultType="com.topvision.maven.mybatis.domain.Book">
  7. select book_id bookId,name,number from book where book_id = #{id}
  8. </select>
  9. </mapper>

namespace :命名空间,用于隔离sql语句,后面会讲另一层非常重要的作用。
parameterType:定义输入到sql中的映射类型,#{id}表示使用preparedstatement设置占位符号并将输入变量id传到sql。
resultType:定义结果映射类型。

4.7、加载映射文件

在SqlMapConfig.xml中加载映射文件Book.xml

  1. <mappers>
  2. <mapper resource="sqlmap/Book.xml"/>
  3. </mappers>

4.8、测试

  1. public class BookDaoTest {
  2. private SqlSessionFactory sqlSessionFactory;
  3. @Before
  4. public void createSqlSessionFactory() throws IOException{
  5. String resource = "sqlMapConfig.xml";
  6. InputStream inputStream = Resources.getResourceAsStream(resource);
  7. sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  8. }
  9. @Test
  10. public void testQueryById() {
  11. SqlSession sqlSession = null;
  12. try {
  13. sqlSession = sqlSessionFactory.openSession();
  14. Book book = sqlSession.selectOne("test.queryById",1000l);
  15. System.out.println(book);
  16. } catch (Exception e) {
  17. e.printStackTrace();
  18. } finally {
  19. if (sqlSession != null) {
  20. sqlSession.close();
  21. }
  22. }
  23. }
  24. }

至此,若能查询出结果,则工程搭建成功。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注