Mybatis入门

173 阅读5分钟

一、Mybatis简介

什么是MyBatis
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis。Mybatis是一个用来连接数据库并对其进行增删改查操作的开源框架,是持久层技术的实现框架之一

为什么我们要用Mybatis?
无论是Mybatis、Hibernate[ˈhaɪbəneɪt]都是ORM的一种实现框架,都是对JDBC的一种封装!
使用Mybatis的主要原因是Mybatis比Hibernate更灵活,处理复杂业务时更方便

(一)、Mybatis开发环境的搭建

导入开发包
导入Mybatis开发包

mybatis-3.1.1.jar

导入mysql/oracle开发包

mysql-connector-java-5.1.7-bin.jar

Oracle 11g 11.2.0.1.0 JDBC_ojdbc6.jar

编写实体类Student.java

package com.po;
import java.io.Serializable;
import java.util.Date;

public class Student implements Serializable {
	private Integer sid;
	private String sname;
	private String sex;
	private String address;
	private Date birthday;
	private Integer classid;
	private String cname;
	...

编写Mapper接口类StudentMapper.java
类似于以前的DAO接口

package com.mapper;
import com.po.*;
import java.util.*;
public interface StudentMapper {
	public int save(Student st);
	public int update(Student st);
	public int delById(Integer stuid);
	public Student findById(Integer sid);
	public List<Student> findAll();
}

编写sql映射文件StudentMapper.xml
和Mapper接口类放在一个文件夹
Hibernate中如果想要插入数据什么的,只要调用save()方法就行了。Hibernate是自动化屏蔽掉了数据库的差异,而我们Mybatis是需要自己手动编写SQL代码的…
我们作为一个框架,不可能在程序中写SQL,我们是在sql映射文件中写的

<?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.mapper.StudentMapper">  <!-- 指定接口 -->
	<!-- 
		insert 表示插入数据
		id="接口中方法名称"
		parameterType="方法的参数类型,实体类路径全称"
		#{实体类属性名称}
		此描述方式,适用于实体类属性名与表的字段名完全相同的情况
	 -->
	<insert id="save" parameterType="com.po.Student">
		insert into student(sname,sex,address,birthday,classid)
		values(#{sname},#{sex},#{address},#{birthday},#{classid})
	</insert>	
	<update id="update" parameterType="com.po.Student">
		update student set sname=#{sname},sex=#{sex},address=#{address},
		birthday=#{birthday},classid=#{classid} where sid=#{sid} 
	</update>
	<!--
        	#{参数名称}
	-->
	<delete id="delById" parameterType="Integer">
		delete from student where sid=#{stuid}
	</delete>
	<!--
        	resultType=“方法的返回类型”
	-->
	<select id="findById" parameterType="Integer" resultType="com.po.Student">
		select * from student where sid=#{sid}
	</select>
	<!-- 
		此处应为List集合的元素类型com.po.Student
	 -->
	<select id="findAll" resultType="com.po.Student">
		select * from student where 1=1
	</select>
</mapper>

创建mybatis配置文件mybatis-config.xml
配置文件放在src根目录下
创建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" />  <!-- 事务管理类型 -->
			<dataSource type="POOLED">  <!-- 数据源 -->
				<property name="driver" value="com.mysql.jdbc.Driver" />
				<property name="url" value="jdbc:mysql://localhost:3306/studb" />
				<property name="username" value="root" />
				<property name="password" value="java" />
			</dataSource>
		</environment>
	</environments>
	<mappers>
		<!-- 配置XxxMpper.xml文件的路径 -->
		<mapper resource="com/mapper/StudentMapper.xml" />
	</mappers>
</configuration>

(二)、完成CRUD操作

StudentSave.java

package com.test;
import org.apache.ibatis.*;
import org.apache.ibatis.io.*;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.*;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import com.po.*;
import com.mapper.*;

public class Studentsave {
	
	public static void main(String[] args) {
		SqlSessionFactory sessionFactory=null;
		SqlSession sqlSession=null;
		
		try {
			//1、加载配置文件mybatis-config.xml
			InputStream is=Resources.getResourceAsStream("mybatis-config.xml");
			
			//2、获取sql语句会话工厂对象SqlSessionFactory
			sessionFactory=new SqlSessionFactoryBuilder().build(is);
			
			//3、获取SqlSession会话对象
			sqlSession=sessionFactory.openSession();
			
			//4、获取StudentMapper接口对象
			StudentMapper mapper=sqlSession.getMapper(StudentMapper.class);
			
			//5、操作实体对象
			Student st=new Student("李白", "男", "长安", new SimpleDateFormat("yyyy-MM-dd").parse("1997-12-11"),2);
			
			int rows=mapper.save(st);
			if(rows>0){
				System.out.println("保存成功!");
				sqlSession.commit();//提交事务,否则数据不会保存到数据库
			}else{
				System.out.println("保存失败!");
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			//6关闭数据库会话
			sqlSession.close();
		}
	}
}

StudentUpdate.java

package com.test;
import org.apache.ibatis.*;
import org.apache.ibatis.io.*;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.*;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import com.po.*;
import com.mapper.*;

public class StudentUpdate {
	
	public static void main(String[] args) {
		SqlSessionFactory sessionFactory=null;
		SqlSession sqlSession=null;
		
		try {
			//1、加载配置文件mybatis-config.xml
			InputStream is=Resources.getResourceAsStream("mybatis-config.xml");
			
			//2、获取sql语句会话工厂对象SqlSessionFactory
			sessionFactory=new SqlSessionFactoryBuilder().build(is);
			
			//3、获取SqlSession会话对象
			sqlSession=sessionFactory.openSession();
			
			//4、获取StudentMapper接口对象
			StudentMapper mapper=sqlSession.getMapper(StudentMapper.class);
			
			//5、操作实体对象
			Student st=mapper.findById(3);
			
			st.setSname("杜甫");
			st.setSex("男");
			st.setAddress("襄阳");
			int rows=mapper.update(st);
			if(rows>0){
				System.out.println("更新成功!");
				sqlSession.commit();//提交事务,否则数据不会保存到数据库
			}else{
				System.out.println("更新失败!");
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally{
			//6关闭数据库会话
			sqlSession.close();
		}
	}
}

StudentShowAll.java

package com.test;
import org.apache.ibatis.*;
import org.apache.ibatis.io.*;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.*;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import com.po.*;
import com.mapper.*;

public class StudentShowAll {
	
	public static void main(String[] args) {
		SqlSessionFactory sessionFactory=null;
		SqlSession sqlSession=null;
		
		try {
			//1、加载配置文件mybatis-config.xml
			InputStream is=Resources.getResourceAsStream("mybatis-config.xml");
			//2、获取sql语句会话工厂对象SqlSessionFactory
			sessionFactory=new SqlSessionFactoryBuilder().build(is);
			//3、获取SqlSession会话对象
			sqlSession=sessionFactory.openSession();
			//4、获取StudentMapper接口对象
			StudentMapper mapper=sqlSession.getMapper(StudentMapper.class);
			//5、操作实体对象
			List<Student> lsst=mapper.findAll();
			
			for (Student st : lsst) {
				System.out.println("编号:"+st.getSid());
				System.out.println("姓名:"+st.getSname());
				System.out.println("性别:"+st.getSex());
				System.out.println("地址:"+st.getAddress());
				System.out.println("生日:"+st.getBirthday().toLocaleString());
				System.out.println("班级编号:"+st.getClassid());
				System.out.println("=====================");
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally{
			//6关闭数据库会话
			sqlSession.close();
		}
	}
}

StudentDelete.java

package com.test;
import org.apache.ibatis.*;
import org.apache.ibatis.io.*;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.*;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import com.po.*;
import com.mapper.*;

public class StudentDelete {
	
	public static void main(String[] args) {
		SqlSessionFactory sessionFactory=null;
		SqlSession sqlSession=null;
		
		try {
			//1、加载配置文件mybatis-config.xml
			InputStream is=Resources.getResourceAsStream("mybatis-config.xml");
			//2、获取sql语句会话工厂对象SqlSessionFactory
			sessionFactory=new SqlSessionFactoryBuilder().build(is);
			//3、获取SqlSession会话对象
			sqlSession=sessionFactory.openSession();
			//4、获取StudentMapper接口对象
			StudentMapper mapper=sqlSession.getMapper(StudentMapper.class);
			//5、操作实体对象
			int rows=mapper.delById(5);
			
			if(rows>0){
				System.out.println("删除成功!");
				sqlSession.commit();//提交事务,否则数据不会保存到数据库
			}else{
				System.out.println("删除失败!");
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally{
			//6关闭数据库会话
			sqlSession.close();
		}
	}
}

Mybatis工作流程

通过Reader对象读取Mybatis配置文件

通过SqlSessionFactoryBuilder对象创建SqlSessionFactory对象

获取当前线程的SQLSession

事务默认开启

通过SQLSession读取映射文件中的操作编号,从而读取SQL语句

提交事务

关闭资源

(三)、动态sql Mybatis内部就有动态SQL的功能,动态SQL就是自动拼接SQL语句
动态查询 动态更新

动态删除

动态插入

总结:

  • Mybatis的准备工作与Hibernate差不多,都需要一个总配置文件、一个映射文件
  • Mybatis的SQLSession工具类使用ThreadLocal来对线程中的Session来进行管理
  • Mybatis的事务默认是开启的,需要我们手动去提交事务
  • Mybatis的SQL语句是需要手写的,在程序中通过映射文件的命名空间.sql语句的id来进行调用
  • 在Mybatis中,增删改查都是需要我们自己写SQL语句的,然后在程序中调用即可了。SQL由于是我们自己写的,于是就相对Hibernate灵活一些
  • 如果需要传入多个参数的话,那么我们一般在映射文件中用Map来接收
  • 由于我们在开发中会经常用到条件查询,在之前,我们是使用查询助手来帮我们完成对SQL的拼接的。而Mybatis的话,我们是自己手写SQL代码的
  • Mybatis也支持一些判断标签,于是我们就可以通过这些标签来完成动态CRUD的操作了。