最新不知道脑子怎么想的,突然对mybatis特别感兴趣,之前在学校的时候学过两天,有了一个简单的认识,工作以后,项目中也有用到,趁着兴趣还在,抓紧整理一个文档,方便学习mybatis,同时,自己也在巩固一下.
mybatis的简单介绍:
MyBatis的前身叫iBatis,本是apache的一个开源项目, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis。MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(Plan Old Java Objects,普通的Java对象)映射成数据库中的记录。
Mybatis的功能架构分为三层(图片借用了百度百科):
1) API接口层:提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。
2) 数据处理层:负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。
3) 基础支撑层:负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑。
如图所示:
为什么要学习mybatis呢,首先我们来创建一个maven项目
如图所示:
这时mybatis的maven项目就创建好了.
开始在pom.xml中引入相关的jar包
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.j1.mybatis</groupId> <artifactId>mybatis-demo</artifactId> <version>1.0.0-SNAPSHOT</version> <parent> <groupId>cn.itcast.parent</groupId> <artifactId>itcast-parent</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> <dependencies> <!-- MySql --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <!-- 单元测试 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </dependency> <!-- Mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> </dependency> </dependencies> </project>
这时项目会报一个小红叉,不要怕,如图所示:
先从JDBC程序开始:代码如下:
package com.j1.jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; public class JdbcTest { public static void main(String[] args) { // 数据库连接 Connection con = null; // 执行sql ResultSet res = null; // 封装sql PreparedStatement pre = null; // 加载驱动 try { Class.forName("com.mysql.jdbc.Driver"); // 创建连接 // 创建连接 String url = "jdbc:mysql://127.0.0.1:3306/mybatis"; String username = "root"; String password = "root"; con = DriverManager.getConnection(url, username, password); // 获取PreparedStatement对象 String sql = "select * from tb_user u where u.user_name=?"; pre = con.prepareStatement(sql); // 封装查询的参数 pre.setString(1, "wangwu"); // 执行 res = pre.executeQuery(); // 打印结果集, while (res.next()) { System.out.println("username : " + res.getString("user_name")); System.out.println("name : " + res.getString("name")); System.out.println("age : " + res.getInt("age")); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { try { // 释放资源 if (pre != null) { pre.close(); } if (res != null) { res.close(); } if (con != null) { con.close(); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
查出的结果是:
username : wangwu
name : 王五
age : 22
这个项目跑下来,我们发现很多问题:
1、 数据库连接字符串、用户名、密码等信息硬编码到java代码中,维护不方便,修改内容时需要重新编译java代码,解决方案:放置到外部配置文件中;
2、 sql语句硬编码到java代码中,问题:
a) 维护不方便
b) 代码重用性差
解决:假设:能否将sql配置到外部文件?
3、 手动设置参数:
a) 将参数值硬编码到java代码中
b) 判断参数类型,使用极其不便;
解决:能否自动设置参数?
4、 手动映射对象,问题:不方便使用,解决方案:能否自动映射?
5、 频繁的创建连接、关闭连接造成资源浪费,解决方案:使用连接池解决
这时,我们的主角开始上场了,很轻松的解决上面的问题,先写一个入门案列:
在开发时我们的开发习惯都是面向接口开发,由此,我们来写一个接口,
根据用户名查询数据,到这,先容我抽根烟,