Mybatis 简单应用(1)
一,mybatis是什么
MyBatis是一个简化和实现了 Java 数据持久化层(persistence layer)的开源框架,
它抽象了大量的JDBC冗余代码,并提供了一个简单易用的API和数据库交互。
MyBatis的前身是iBATIS,iBATIS于2002年由ClintonBegin创建。MyBatis3是
iBATIS的全新设计,支持注解和Mapper。
MyBatis流行的主要原因在于它的简单性和易使用性。在Java应用程序中,
数据持久化层涉及到的工作有:将从数据库查询到的数据生成所需要的Java
对象;将Java对象中的数据通SQL持久化到数据库中。
MyBatis通过抽象底层的JDBC代码,自动化SQL结果集产生Java对象、Java
对象的数据持久化数据库中的过程使得对SQL的使用变得容易。
二,简单步骤
第一步:在SQLMapper映射配置文件中配置SQL语句,假定为StudentMapper.xml
<insert id="insertStudent" parameterType="Student">
insert into students(id,name,email)
values(#{id},#{name},#{email})
</insert>
第二步:创建一个StudentMapper接口
public interface StudentMapper{
void insertStudent(Student student);
}
第三步:编写java代码完成插入操作:
SqlSession session = getSqlSessionFactory().openSession();
StudentMapper mapper = session.getMapper(StudentMapper.class);
mapper.insertStudent(student);
SqlSession接口和sqlSessionFactory接口
SqlSession接口的实现类对象是mybatis中最重要的一个对象,我们可以使用该对象动态获得XxxxMapper.java接口的实现类对象,然后就可以调用到XxxxMapper.java接口中方法所映射的sql语句(在xml文件中配置的sql语句)。
sqlSessionFactory接口的实现类对象是一个工厂对象,专门负责来产生SqlSession对象的
例如:
InputStream inputStream = Resources.getResourceAsStream(“mybatis-config.xml”);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
//第一种执行sql语句的方式 通过XxxxMapper接口的实现类对象来调用
//动态获得XxxxMapper接口的实现类
StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
studentMapper.insertStudent(new Student(1,"tom","123@.qq.com"));
//第二种执行sql语句的方式 执行调用XxxxMapper.xml中写好的sql语句
//也可以【不通过】Mapper接口执行映射的SQL
//然而,使用 Mapper接口是最佳实践
//sqlSession.selectOne("com.briup.pojo.StudentMapper.findStudentById",1);
Student实例
mybatis-config.xml
<?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>
<typeAliases>
<typeAlias alias="Student" type="pojo.Student" />
</typeAliases>
<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/Student" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mappers/StudentMapper.xml" />
</mappers>
</configuration>
Student.java
package pojo;
public class Student {
private String Son;
private String Sname;
private String Ssex;
private int Sage;
private String Sdept;
public Student() {
super();
// TODO Auto-generated constructor stub
}
public String getSon() {
return Son;
}
public void setSon(String son) {
Son = son;
}
public String getSname() {
return Sname;
}
public void setSname(String sname) {
Sname = sname;
}
public String getSsex() {
return Ssex;
}
public void setSsex(String ssex) {
Ssex = ssex;
}
public int getSage() {
return Sage;
}
public void setSage(int sage) {
Sage = sage;
}
public String getSdept() {
return Sdept;
}
public void setSdept(String sdept) {
Sdept = sdept;
}
@Override
public String toString() {
return "Student [Son=" + Son + ", Sname=" + Sname + ", Ssex=" + Ssex + ", Sage=" + Sage + ", Sdept=" + Sdept
+ "]";
}
}
StudentMapper.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="mappers.StudentMapper">
<resultMap type="Student" id="StudentResult">
<id property="Son" column="Son" />
<result property="Sname" column="Sname" />
<result property="Ssex" column="Ssex" />
<result property="Sage" column="Sage" />
<result property="Sdept" column="Sdept" />
</resultMap>
<select id="findAllStudents" resultMap="StudentResult">
select * from student
</select>
<select id="findStudentBySon" parameterType="int" resultType="Student">
select *
from students where Son=#{Son}
</select>
<insert id="insertStudent" parameterType="Student">
insert into student(Son,Sname,Ssex,Sage,Sdept) values(#{Son},#{Sanme},#{Ssex},#{Sage},#{Sdept})
</insert>
</mapper>
StudentMapper.java
package mappers;
import java.util.List;
import pojo.Student;
/*
* 映射接口
* */
//创建映射器Mapper接口StudentMapper
//方法名和StudentMapper.xml中定义的SQL映射定义名相同
//这个其实就是dao层接口(数据访问层,负责和数据库进行交互)
public interface StudentMapper {
List<Student> findAllStudents();
Student findStudentBySon(int Son);
void insertStudent(Student student);
}
测试(采用junit)
package test;
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 org.junit.Test;
import mappers.StudentMapper;
import pojo.Student;
import utils.MyBatisSqlSessionFactory;
public class StudentMapperTest {
@Test
public void test(){
try {
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
List<Student> stu = studentMapper.findAllStudents();
stu.forEach(System.out::println);
sqlSession.commit();
} catch (Exception e) {
e.printStackTrace();
}
}
}
封装生成SqlSession对象
MyBatisSqlSessionFactory.java
package utils;
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;
/*
* 封装生产SqlSessio对象
* */
public class MyBatisSqlSessionFactory {
//静态属性SqlSessionFactory对象
private static SqlSessionFactory sqlSessionFactory;
//静态方法,返回SqlSessionFactory对象
public static SqlSessionFactory getSqlSessionFactory(){
if(sqlSessionFactory == null){
InputStream inputStream = null;
try {
//读取配置文件,创建SqlSessionFactory对象
inputStream = Resources.getResourceAsStream("mybatis-config.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException(e.getCause());
}
}
return sqlSessionFactory;
}
//创建SqlSession对象,默认不自动提交事务
public static SqlSession openSession() {
return openSession(false);
}
//创建SqlSession对象,autoCommit控制事务提交
public static SqlSession openSession(boolean autoCommit) {
return getSqlSessionFactory().openSession(autoCommit);
}
}
测试(采用junit)
package test;
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 org.junit.Test;
import mappers.StudentMapper;
import pojo.Student;
import utils.MyBatisSqlSessionFactory;
public class StudentMapperTest {
@Test
public void test_utils(){
try {
SqlSession sqlSession = MyBatisSqlSessionFactory.openSession();
StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);
List<Student> stu = studentMapper.findAllStudents();
stu.forEach(System.out::println);
sqlSession.commit();
} catch (Exception e) {
e.printStackTrace();
}
}
}