一、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的操作了。