五分钟学Mybatis|一个案例了解Mybatis与环境搭建(超干货!)
MyBatis教程
MyBatis中文文档
mybatis学习笔记一(环境搭建和入门案例)
mybatis学习笔记二(crud)
mybatis学习笔记三(mybatis参数深入)
mybatis学习笔记四(多表查询)
mybatis学习笔记四(延迟加载和缓存)
MyBatis 本是apache 的一个开源项目 iBatis, 2010 年这个项目由apache software foundation 迁移到了google code,并且改名为 MyBatis 。2013 年 11 月迁移到Github。
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
减轻使用JDBC的复杂性,不用编写重复的创建Connetion, Statement,不用编写关闭资源代码。直接使用java对象,表示结果数据,让开发者专注SQL的处理,其他分心的工作由MyBatis代劳。
MyBatis可以完成:
(1)注册数据库的驱动,如Class.forName(“com.mysql.jdbc.Driver”)。
(2)创建JDBC中必须使用的Connection,Statement,ResultSet对象。
(3)从xml中获取sql,并执行sql语句,把ResultSet结果转换java对象。
List<Student> list = new ArrayLsit<>();
ResultSet rs = state.executeQuery(“select * from student”);
while(rs.next){
Student student = new Student();
student.setName(rs.getString(“name”));
student.setAge(rs.getInt(“age”));
list.add(student);
}
(4)关闭资源
ResultSet.close() , Statement.close() , Conenection.close()。
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
(1)Resources类
Resources类,顾名思义就是资源,用于读取资源文件。Resources有很多方法通过加载并解析资源文件,返回不同类型的IO流对象。
//1、读取配置文件
InputStream is = null;
is = Resources.getResourceAsStream("SqlMapConfig.xml");
(2)SqlSessionFactoryBuilder类
SqlSessionFactory的创建,需要使用 SqlSessionFactoryBuilder对象的build()方法。由于SqlSessionFactoryBuilder对象在创建完工厂对象后,就完成了其历史使命,即可被销毁。所以,一般会将该SqlSessionFactoryBuilder对象创建为一个方法内的局部对象,方法结束,对象销毁。
//2、创建SqlSessionFactory工厂,目的是获取SqlSession
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
(3)SqlSessionFactory接口
SqlSessionFactory接口对象是一个重量级对象(系统开销大的对象),是线程安全的,所以一个应用只需要一个该对象即可。创建SqlSession需要使用SqlSessionFactory接口的的openSession()方法。
//3、使用工厂生成Sqlsession对象,用于执行sql语句
SqlSession session = null;
session = factory.openSession();
(4)SqlSession接口
SqlSession接口对象用于执行持久化操作。一个SqlSession对应着一次数据库会话,一次会话以SqlSession对象的创建开始,以SqlSession对象的关闭结束。
SqlSession接口对象是线程不安全的,所以每次数据库会话结束前,需要马上调用其close()方法,将其关闭。再次需要会话,再次创建。 SqlSession在方法内部创建,使用完毕后关闭。
//4、使用Sqlsession对象创建dao接口的代理对象
StudentDao studentDao = session.getMapper(StudentDao.class);
//5、使用代理对象执行方法
List<Student> studentList = studentDao.selectStudents();
//5、循环输出查询结果
for (Student student : studentList){
System.out.println(student);
}
//6、释放资源
session.close();
is.close();
数据库名ssm;表名student。
create database ssm;
CREATE TABLE `student` (
`id` int(11) NOT NULL,
`name` varchar(255) DEFAULT NULL,
`email` varchar(255) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Name:learnMyBatis
Location:D:\\learnMyBatis
<?xml version="1.0" encoding="UTF-8"?>
<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>org.example</groupId>
<artifactId>learnMyBatis</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!--导入mybatis依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.3</version>
</dependency>
<!--数据库驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<!--导入单元测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/java</directory><!--所在的目录-->
<includes><!--包括目录下的.properties,.xml 文件都会扫描到-->
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
</project>
创建包com.mylearn.domain, 包中创建Student类。
右键src/main/java->New/package。
package com.mylearn.domain;
/**
* Description 实体类
*/
public class Student {
//属性名和列名一样
private Integer id;
private String name;
private String email;
private Integer age;
//set,get,toString
public void setName(String name){
this.name = name;
}
public String getName() {
return this.name;
}
}
创建包com.mylearn.dao, 包中创建StudentDao接口。
右键src/main/java->New/package。
package com.mylearn.dao;
import com.mylearn.domain.Student;
import java.util.List;
/**
* Description:Dao接口
*/
public interface StudentDao {
//查询所有数据
List<Student> selectStudents();
}
<?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">
<!--对应的dao接口-->
<!--namespace:必须有值,自定义的唯一字符串
推荐使用:Dao接口的全限定名称
-->
<mapper namespace="com.mylearn.dao.StudentDao">
<!--<select>:查询语句,标签中必须是select语句。
id:sql语句的自定义名称,推荐使用Dao接口中的方法名称。
resultType:查询语句的返回结果数据类型,使用全限定类名。
-->
<select id="selectStudents" resultType="com.mylearn.domain.Student">
<!--要执行的sql语句-->
select * from Student
</select>
</mapper>
项目src/main下创建resources目录。
XML 配置文件中包含了对MyBatis系统的核心设置,包括获取数据库连接实例的数据源(DataSource)以及决定事务作用域和控制方式的事务管理器(TransactionManager)。
<?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="mysql">
<!--配置mysql环境-->
<environment id="mysql">
<!--配置事务的类型-->
<transactionManager type="JDBC"/>
<!--配置事务的类型-->
<dataSource type="POOLED">
<!--配置连接数据库的4个基本信息-->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:mybatis?useUnicode=true&characterEncoding=utf8"/>
<property name="username" value="root"/>
<property name="password" value="bigdata"/>
</dataSource>
</environment>
</environments>
<!--指定映射文件的位置 必须是dao接口全限定类名-->
<mappers>
<mapper resource="com/mylearn/dao/StudentDao.xml"/>
</mappers>
</configuration>
package com.mylearn;
import com.mylearn.dao.StudentDao;
import com.mylearn.domain.Student;
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 org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class MyBatisTest {
@Test
public void test1(){
InputStream is = null;
SqlSession session = null;
try {
//1、读取配置文件
is = Resources.getResourceAsStream("SqlMapConfig.xml");
//2、创建SqlSessionFactory工厂,目的是获取SqlSession
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
//3、使用工厂生成Sqlsession对象,用于执行sql语句
session = factory.openSession();
//4、使用Sqlsession对象创建dao接口的代理对象
StudentDao studentDao = session.getMapper(StudentDao.class);
//5、使用代理对象执行方法
List<Student> studentList = studentDao.selectStudents();
//5、循环输出查询结果
for (Student student : studentList){
System.out.println(student);
}
} catch (IOException e) {
e.printStackTrace();
}
//6、释放资源
try {
session.close();
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}