MyBatis笔记(一)——带你入门带你飞

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);
	}
}


好吧,最后看看结果。

相关文章
相关标签/搜索