初次使用Mybatis

2018/12/12 19:00
阅读数 0

 

目录


mybatis简介

导入jar包

创建数据库以及数据库表

创建实体类

创建mapper.xml文件

配置mybatis

测试mybatis

三种查询方式

selectOne

selectList

selectMap

 


 

 

 

mybatis简介

  MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除了几乎所有的 JDBC 代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML 或注解用于配置和原始映射,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java 对象)映射成数据库中的记录。——摘抄自mybatis官网

  

 

导入jar包

  需要导入两个最基本的jar包,分别是mybatis的jar包,以及数据库驱动包。

mysql-connector-java-5.1.39-bin.jar
mybatis-3.2.7.jar

  如果要记录日志,还需要导入日志包,比如log4j..

 

 

创建数据库以及数据库表

  创建测试专用库mybatis,并创建一个Person表:

CREATE DATABASE mybatis;

USE mybatis; 

CREATE TABLE `person` (
  `id` int(11) primary key auto_increment,
  `name` varchar(30) DEFAULT NULL,
  `age` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

INSERT INTO person VALUES (1, 'aaaa', 88);

    

 

创建实体类

  为了演示方便,这里创建一个Person类,类名和数据库中的person表名对应,并且Person类中的属性名和person表中的字段名相同(一一对应)。

  实体类都在cn.ganlixin.pojo包下面:

package cn.ganlixin.pojo;

import java.io.Serializable;

public class Person implements Serializable{
	
	private int id;
	private String name;
	private int age;
	
	public Person() {
		
	}
	
	public Person(int id, String name, int age) {
		super();
		this.id = id;
		this.name = name;
		this.age = 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;
	}

	@Override
	public String toString() {
		return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";
	}
}

  

 

创建mapper.xml文件

  前面的介绍中已经说了:MyBatis 使用简单的 XML 或注解用于配置和原始映射,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java 对象)映射成数据库中的记录

  所以此时我们需要创建一个mapper文件,文件名规范:实体类名+Mapper.xml,当然也可以命名为其他规范。

  上面的Person类,对应的mapper文件是PersonMapper.xml,位于cn.ganlixin.mapper包下面。

<?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="cn.ganlixin.mapper.PersonMapper">

	<select id="selectPersonById" parameterType="int" resultType="cn.ganlixin.pojo.Person">
		select * from person where id=#{id}
	</select>
	
</mapper>

  介绍一下上面的xml内容:

1、第一部分是dtd声明,不加的话,写xml标签的时候没有提示。

2、每个mapper映射文件,顶级标签都是mapper,namespace的规范是packageName.ClassName。

3、select标签表示这是一个查询操作,另外还有insert、update、delete标签。

id属性,可以理解为方法名,通过namespace.id可以调用这个id的方法,执行标签定义的sql。

parameterType属性,表示传入的参数类型,关于参数类型设置,可以参考:

resultType属性,表示结果集中每一行记录的类型,注意,如果没有配置别名<alias>,需要使用全路径。

sql中的#{id}表示接受参数名为id的值。

  

 

配置mybatis

  实体类和映射文件已经写好之后,当我们运行测试代码的时候,mybatis会运用反射,扫描映射文件,并解析映射文件,让映射文件和实体类之间产生联系,所以现在应该配置mybatis了。

  创建一个xml文件,文件名随意,文件可以放在项目的根目录下,也可以放专门存放配置文件的目录下,这里将配置文件命名为mybatis.xml,并且放在projectRoot/src/conf目录下。

  配置mybatis无非就两点:

  1、配置数据库连接信息

  2、配置mybatis要扫描哪些映射文件。

<?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>
	<environments default="development">
		<environment id="development">
			<transactionManager type="JDBC"></transactionManager>
			<dataSource type="POOLED">
				<property name="driver" value="com.mysql.jdbc.Driver"></property>
				<property name="url" value="jdbc:mysql://localhost:3306/mybatis"></property>
				<property name="username" value="root"></property>
				<property name="password" value="root"></property>
			</dataSource>
		</environment>
	</environments>

	<mappers>
		<mapper resource="cn/ganlixin/mapper/PersonMapper.xml"></mapper>
	</mappers>
</configuration>

  解释一下上面的mybatis的配置文件:

  1、首先是dtd,注意配置文件的dtd和映射文件的dtd不同。

  2、configuration标签内容就是配置mybatis。

  3、environments标签下面可以有多个environment,每一个environment就是一套数据库配置,并且每一个environment都用一个id来标识自己。environments标签使用default来配置哪一个environment配置有效。

  4、transactionManager的type属性配置事务管理的类型,有两种:

    i、一种是JDBC,使用JDBC原生的事务控制管理,JDBC默认没有开启事务(会自动提交),但是mybatis会将JDBC的事务自动开启,即不会自动提交。

    ii、另一种是MANAGED,使用Spring的时候就是设置为MANAGED。

  5、dataSource标签内容就是配置数据库连接信息。其中dataSource的type可以设置为POOLED、UNPOOLED、JNDI。

  6、mappers标签就是针对上面写的映射文件,只有在这里面使用mapper标签指定的映射文件才会被扫描。

 

 

测试mybatis

package cn.ganlixin.test;

import java.io.IOException;
import java.io.InputStream;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import cn.ganlixin.pojo.Person;

public class TestMybatis {
	public static void main(String[] args) {
		
		try {
			// 加載mybatis配置文件
			String resource = "conf/mybatis.xml";
			InputStream inputStream = Resources.getResourceAsStream(resource);
			
			// 利用配置文件,创建sqlSessionFactory
			SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
			
			// 利用sqlSessionFactory来获取数据库连接
			SqlSession session = sqlSessionFactory.openSession();
			
			// 指定要调用的方法(映射文件中的namespace加上包含SQl语句的标签的id。
			String method = "cn.ganlixin.mapper.PersonMapper.selectPersonById";
		
			// 调用方法
			Person p = (Person) session.selectOne(method, 1);
			System.out.println(p);
			
			// 断开数据库连接
			session.close();
			
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

  

三种查询方式

  mybatis提供了三种方式来获取结果集的格式:

  1、selectOne用来获取sql语句执行完毕后得到单一的值;

  2、selectList用来获取sql语句执行完毕后的到一个List结果集,多条记录。

  3、selectMap用来获取sql执行之后,某一个字段为key,每一条记录为value,put到一个map中。

  在测试selectList和selectMap之前,先修改一下PersonMapper.xml映射文件:

<?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="cn.ganlixin.mapper.PersonMapper">

	<select id="selectPersonById" parameterType="int" resultType="cn.ganlixin.pojo.Person">
		select * from person where id=#{id}
	</select>
	
	<select id="selectAllPerson" parameterType="int" resultType="cn.ganlixin.pojo.Person">
		select * from person
	</select>
</mapper>

  

  selectOne

    selectOne的用法上面已经展示了,就不在重复说了。

 

  selectList

package cn.ganlixin.test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import cn.ganlixin.pojo.Person;

public class TestMybatis {
	public static void main(String[] args) {
		
		try {
			String resource = "conf/mybatis.xml";
			InputStream inputStream = Resources.getResourceAsStream(resource);
			SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
			SqlSession session = sqlSessionFactory.openSession();
			
			// 注意selectList要使用List来接收,可以直接指定泛型
			String method = "cn.ganlixin.mapper.PersonMapper.selectAllPerson";
			List<Person> list = session.selectList(method);
			for (Person p : list) {
				System.out.println(p);
			}
			session.close();
			
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

  

  selectMap

package cn.ganlixin.test;

import java.io.IOException;
import java.io.InputStream;
import java.util.Map;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import cn.ganlixin.pojo.Person;
import jdk.management.resource.internal.inst.SocketOutputStreamRMHooks;

public class TestMybatis {
	public static void main(String[] args) {
		
		try {
			String resource = "conf/mybatis.xml";
			InputStream inputStream = Resources.getResourceAsStream(resource);
			SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
			SqlSession session = sqlSessionFactory.openSession();
			
			// 注意selectMap需要指定第二个参数,表示使用每一条记录中的那个属性(字段)作为map的key
			String method = "cn.ganlixin.mapper.PersonMapper.selectAllPerson";
			Map<String, Person> map = session.selectMap(method, "name");
			for (String name : map.keySet()) {
				System.out.println(name + " ==> " + map.get(name));
			}
			//aaaa ==> Person [id=1, name=aaaa, age=88]
			//bbbb ==> Person [id=2, name=bbbb, age=99]
			session.close();
			
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

  

 

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部