MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(Plan Old Java Objects,普通的Java对象)映射成数据库中的记录。Mybatis的功能架构分为三层(图片借用了百度百科):
1)API接口层:提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。
2)数据处理层:负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。
3)基础支撑层:负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑。
如图所示:
以在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.j1.parent</groupId>
<artifactId>j1-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>
上述依赖是调用了java后台和MySQL数据库连接的封装依赖、通信和日志记录依赖以及mybatis封装依赖等,接下来创建一个简单的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();
}
}
}
}
class.forName()函数入参是一个类,目的是要求JVM查找并加载入参指定的类,也就是说JVM会执行该类的静态代码段。关于forName()方法,实际上这个方法和newInstance()方法一起对类进行实例化,二者结合等同于new关键字。如:A a = (A)Class.forName(“pacage.A”).newInstance(); 这和你 A a = new A(); 是一样的效果
动态加载和创建Class 对象,比如想根据用户输入的字符串来创建对象时需要用到:
String str = “用户输入的字符串” ;
Class t = Class.forName(str);
t.newInstance();
在初始化一个类,生成一个实例的时候,newInstance()方法和new关键字的区别在于创建对象的方式不一样,前者是使用类加载机制,后者是创建一个新类。而同时存在不同的对象创建方法这要考虑到软件的可伸缩、可扩展和可重用等软件设计思想。
java工厂模式经常使用newInstance来创建实例,如:class c = Class.forName(“Example”);
factory = (ExampleInterface)c.newInstance();