MyBatis(原名是ibatis)简介java
MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎全部的JDBC代码和参数的手工设置以及对结果集的检索封装。MyBatis可使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录.mysql
与数据库进行交互,有不少种方法或者框架:由简到繁能够排列为:sql
JDBC->dbutils->MyBatis->Hibernateshell
JDBC不用多说,最基本的Java数据库交互手段。数据库
dbutils相对于JDBC的优点在于,它可以自动封装查询结果集,不须要操做statement或resualtset。可是,它的CRUD操做仍是须要写SQL语句的。apache
Hibernate则彻底是与对象打交道了,存一个对象的数据只须要save(object)就能够了。session
而Mybaits是介于dbutils与Hibernate之间的东西。Mybatis须要写SQL语句,可是不是存放在Java代码中,而是存放在xml文件中,至关于一个中间件同样,当Java代码须要与数据库进行交互,就调用这个xml中大的SQL语句。另外,与xml并行的是,还可使用注解来完成这个操做。mybatis
那么,既然有了Hibernate,为何还须要Mybatis呢?不少状况下是为了不浪费,好比一些查询,咱们能够控制在咱们但愿的范围内。相比于dbutils,Mybatis的优点呢?Mybatis虽然不像Hibernate那样是彻底围绕对象的,可是Mybatis在Java代码中操做的仍然是对象,只是须要xml中的SQL与数据库交互;而dbutils的Java代码仍然须要操做SQL。app
那么接下来,咱们来用一个例子梳理构建一个Mybatis应用的通常步骤:框架
咱们但愿作这样一件事情:咱们在数据库中构造一个users表,在代码模块中构建一个User类,users表的字段与User的属性是彻底一一对应的。如今,咱们但愿经过输入一个id字段或者属性值,将相应的users表中的记录行查询出来并自动封装成User对象。那么,如今的问题就是如何造成这种代码区的对象与数据库表的映射,以及如何在此基础上构建一个咱们须要的查询服务。这就须要咱们的Mybatis。
(本文出自:http://my.oschina.net/happyBKs/blog/473255)
环境与项目的搭建:
为了方便,我使用的IDE是STS,项目用的是Maven的quickstart项目。
首先,咱们须要导入相应的jar。包括mybatis的和mysql driver。
pom.xml以下:
<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.happyBKs.mybatis</groupId> <artifactId>C1</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>C1</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.10</version> <scope>test</scope> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.3.0</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.35</version> </dependency> </dependencies> </project>
而后,加入一个源文件文件夹,命名为src/main/resources,为的是之后存放项目中的各类配置文件和资源文件。
最后,咱们把数据库搭建好。我用的是mysql-5.6.25,用bin下的mysqld命令登陆。
bin> mysqld -u root
这里我是默认的设置,用户名root,密码为空。
构建Mybatis程序的基本步骤:
1.数据库建表users,并插入数据。
create database mybatis; use mybatis; CREATE TABLE users(id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(20), age INT); INSERT INTO users(NAME, age) VALUES('Tom', 12); INSERT INTO users(NAME, age) VALUES('Jack', 11);
happyBKs很但愿根红苗正的mysql workbench。在那里操做吧。
2. 添加Mybatis的配置文件config.xml
这个文件是mybatis的核心配置文件,包含了数据库配置信息,如driver名称、数据库url、用户名和密码等;还包含了咱们刚才提到的映射的构建,也是在这里把全部的映射文件罗列出来。
在实际使用时,咱们须要先行加载这里文件,因此可谓是整个,Mybatis的项目配置文件的树干部分。
在这个项目中,我将config.xml放到了src/main/resources文件夹下。
这里,咱们先只进行数据库配置,映射配置等会儿再说。
<?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> <!-- development: 开发模式 work: 工做模式 --> <environments default="development"> <environment id="development"> <transactionManager type="JDBC" /> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/mybatis" /> <property name="username" value="root" /> <property name="password" value="" /> </dataSource> </environment> </environments> </configuration>
值得一提的是,这里的evironments或environment能够有两种模式:
development: 开发模式
work: 工做模式
区别这里不说,影响不大。可是请注意,不管你选择哪种模式,请让evironments或environment的模式保持统一,不然要出问题的哦。
3. 定义表所对应的实体类
这里咱们构建一个与users表对应的类User。
package com.happyBKs.mybatis.C1; public class User { private int id; private String name; private int age; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public User(int id, String name, int age) { super(); this.id = id; this.name = name; this.age = age; } public User() { super(); } @Override public String toString() { return "User [id=" + id + ", name=" + name + ", age=" + age + "]"; } } //shift+alt+s, 谁用谁知道
这里差一个题外话,为了给初学者们一个提醒,高手们是如何写bean类定义的,果断shift+alt+s。
4. 定义操做users表的sql映射文件userMapper.xml
这里应该是最核心的部分了,怎么把类与表关联;如何写一个服务,如按id查询。
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.happyBKs.mybatis.C1.userMapper"> <!-- 根据id查询对象 --> <select id="getUser" parameterType="int" resultType="com.happyBKs.mybatis.C1.User"> select * from users where id=#{id} </select> </mapper>
构建一个映射,就是要构建一个mapper节点并配置。mapper须要一个惟一性的标识,就是namespace属性,这里给出一种比较经常使用的命名规范,用User类的包名 + 这个映射文件的文件名。这里文件名的命名规范是,类名首字母小写+Mapper。固然这只是一种习惯或者规范,你固然也能够命名成其余形式,只要能保证其惟一性。
而后,如何把类与表关联起来呢?Mybatis没有像Hibernate那样,在配置文件中将数据库名和类名、数据库字段和类属性直接对应着配置创建映射。Mybatis是直接在构建服务的过程当中将类名和表包含其中:构建一个查询服务,要用到select节点,User类名在select的resultType中被指定;代表这是在select节点内容的SQL查询语句中被写明。因此,Mybatis与Hibernate相比,并不能是一种映射结构清楚、映射程度彻底的解决方案,可是Mybatis也的确很灵活和方便,咱们能够本身定制SQL语句,而且也完成了类与表在服务上的映射关系。
好吧,咱们仍是看看这个服务吧。
select标签中咱们指定了三个属性。服务的id,这个和users表中的id字段没有任何关系。select的id是用来标识这个服务的名称,咱们在后面调用服务的时候会用到,固然它要求命名惟一。parameterType标识输入参数的类型,这里咱们是按users的id字段进行查询,因此这里的参数类型指的就是users的id字段类型。在select节点的SQL语句中,咱们用通配符来标识这个参数#{id}。resultType用来标识服务的返回结果的类型,是一个User类的对象。
5. 在config.xml文件中注册userMapper.xml文件
全部的映射文件须要统一在mybatis的配置文件config.xml中注册。方法就是构建一个mappers节点,而后为每一个映射文件构建一个mapper节点。
<?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> <!-- development: 开发模式 work: 工做模式 --> <environments default="development"> <environment id="development"> <transactionManager type="JDBC" /> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/mybatis" /> <property name="username" value="root" /> <property name="password" value="" /> </dataSource> </environment> </environments> <!-- 在conf.xml文件中注册userMapper.xml文件 --> <mappers> <mapper resource="com/happyBKs/mybatis/C1/userMapper.xml"/> </mappers> </configuration>
6. 测试程序:
好吧,咱们来调用看看吧。
这里我给出两段测试代码,功能同样。第二个比较推荐,由于家在配置文件config.xml时使用了类加载器。
大体思路是:
我须要一个Session,它接收一个statement和一个参数来完成查询。
statement如何是描述服务的,怎么描述呢。就是要用到咱们刚才usrMapper.xml映射文件中定义的命名空间 + select服务标签的id内容,这样就标记出来了惟一性的服务,他但是包含了SQL语句和类与表映射关系的哦。
那么,session从哪来,用SqlSessionFactory对象造出来。
那么,SqlSessionFactory从哪来,用SqlSessionFactoryBuilder来build出来。好吧,这里构造一个SqlSessionFactory对象,须要指定数据库配置等信息,那么很天然的须要在build方法中提供mybaitis的config.xml配置文件的内容。这里提供配置文件config.xml内容的方式是传入一个InputStream。
因此一开始就须要构建一个config.xml的InputStream对象。
package com.happyBKs.mybatis.C1; import java.io.IOException; import java.io.InputStream; import java.io.Reader; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; public class App { public static void main( String[] args ) { test2(); } private static void test1() throws IOException { String resource = "config.xml"; //加载mybatis的配置文件(它也加载关联的映射文件) Reader reader = Resources.getResourceAsReader(resource); //构建sqlSession的工厂 SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader); //建立能执行映射文件中sql的sqlSession SqlSession session = sessionFactory.openSession(); //映射sql的标识字符串 String statement = "com.happyBKs.mybatis.C1.userMapper"+".getUser";//先找映射文件,后找标签 //执行查询返回一个惟一user对象的sql User user = session.selectOne(statement, 1); System.out.println(user); } private static void test2() { String resource = "config.xml"; //用类加载器加载mybatis的配置文件 InputStream inputStream=App.class.getClassLoader().getResourceAsStream(resource); SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(inputStream); SqlSession session = factory.openSession(); String statement = "com.happyBKs.mybatis.C1.userMapper"+".getUser";//先找映射文件,后找标签 User user = session.selectOne(statement,2);//根据id查,这里id为2 //类型不须要强转,强大吧 System.out.println(user); } }
好吧,最后看看结果。