MyBatis的主要类
Resources :负责读取文件
InputStream in = Resources.getResourceAsStream("mybatis.xml");
SqlSessionFactoryBuilder:创建SqlSessionFactory对象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
SqlSessionFactory:重量级对象,程序创建一个对象耗时比较长,使用资源较多。在整个项目中有一个就可以了。
SqlSessionFactory是一个接口,接口实现类:DefaultSqlSessionFactory
SqlSessionFactory作用:获取SqlSession对象
SqlSession sqlsession = factory.openSession();
openSession():无参数,获取是非自动提交事务的SQLSession对象
openSession(boolean):openSession(true)获取自动提交事务的SqlSession
openSession(false)获取非自动提交事务的SqlSession
SqlSession sqlSession = factory.openSession();
SqlSession(重点):是一个接口,定义了操作数据库的方法例如
selectOne()、selectList()、insert()、update()、commit()、rollback()。
SqlSession的实现类:DefaultSqlSession
使用要求:SqlSession对象不是线程安全的,需要再方法内部使用,在执行sql语句之前,使用openSession()获取SqlSession对象,在执行完sql语句后,需要关闭它,执行SqlSession.close(),这样线程才是安全的
使用工具类简化代码
创建一个新的java文件作为工具类
package ys.utils;
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 java.io.IOException;
import java.io.InputStream;
public class mybatis {
//定义全局变量 Factory
private static SqlSessionFactory factory=null;
//静态代码块,加载对象SqlSessionFactory
static {
String config="mybatisdemo.xml";//需要和你的项目中的文件名一样
try {
InputStream in = Resources.getResourceAsStream(config);
//赋值SqlSessionFactory对象
factory=new SqlSessionFactoryBuilder().build(in);
} catch (IOException e) {
e.printStackTrace();
}
}
//获取SqlSession的方法
public static SqlSession getSqlSession(){
SqlSession sqlSession=null;
if(factory!=null){
sqlSession=factory.openSession();//非自动提交事务
}
return sqlSession;
}
}
再将mybatis学习(一)中的MyAPP文件修改
package ys;
import org.apache.ibatis.session.SqlSession;
import ys.domain.ssm;
import ys.utils.mybatis;
import java.io.IOException;
import java.util.List;
public class MyApp2 {
public static void main(String[] args) throws IOException{
//获取SqlSession对象,从SqlSessionFactory中获取SQLSession----重点
SqlSession sqlSession = mybatis.getSqlSession();
//指定要执行的sql语句的标识,定义格式sql映射文件中的namespace+"."+标签的id值----重点
String sqlId1="ys.dao.ssmDao"+"."+"selectssm";
String sqlId2="ys.dao.ssmDao"+"."+"insertssm";
//执行sql语句,通过sqlId找到语句
List<ssm> ssmList1=sqlSession.selectList(sqlId1);
//创建对象 进行传值 ——需要插入的数据
ssm ssm = new ssm();
ssm.setId(311);
ssm.setAge(2011);
ssm.setEmail("zf11@168.com");
ssm.setName("张飞11");
//返回一个整数值,代表对数据库插入了几条消息
int ssmList2=sqlSession.insert(sqlId2,ssm);
//MyBatis默认不提交事务,需要自己手动提交。 不要重复提交会报错
sqlSession.commit();
//输出结果
System.out.println("执行insert结果="+ssmList2);
ssmList1.forEach(stu -> System.out.println(stu));
//关闭SQLSession对象
sqlSession.close();
}
}
传统Dao层的使用
创建一个新的MyBatis项目
StudentDao | 接口 用于定义sql语句方法 |
StudentDao.xml | sql映射文件 |
Studentdemo.java | 接口的实现类 |
Student.java | 实体类 |
mybatisclass.java | 工具类 |
myapp.java | 主方法 |
mybatis.xml | 主配置文件 |
StudentDao
package ys.dao;
import ys.domain.Student;
import java.util.List;
public interface StudentDao {
List<Student> selectStudents();//定义查询方法
int insertStudent(Student student);//定义添加方法
}
StudentDao.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="ys.dao.StudentDao">
//id 与接口中的方法名相同
<select id="selectStudents" resultType="ys.domain.Student">
select age,name,id,email from Student order by id
</select>
<insert id="insertStudent">
insert into Student values (#{id},#{name},#{email},#{age})
</insert>
</mapper>
Studentdemo.java
package ys.dao;
import org.apache.ibatis.session.SqlSession;
import ys.domain.Student;
import ys.utils.mybatisclass;
import java.util.List;
public class Studentdemo implements StudentDao{
@Override
public List<Student> selectStudents() {
//获取SqlSession对象
SqlSession sqlSession= mybatisclass.getSqlSession();
String sqlId="ys.dao.StudentDao.selectStudents";
//执行sql语句
List<Student> students=sqlSession.selectList(sqlId);
//关闭
sqlSession.close();
return students;
}
@Override
public int insertStudent(Student student) {
//获取SqlSession对象
SqlSession sqlSession= mybatisclass.getSqlSession();
String sqlId="ys.dao.StudentDao.insertStudent";
//执行sql语句
int nums=sqlSession.insert(sqlId,student);
//提交事务
sqlSession.commit();
//关闭
sqlSession.close();
return nums;
}
}
Student.java
package ys.domain;
public class Student {
private Integer id;
private String name;
private String email;
private Integer age;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", email='" + email + '\'' +
", age=" + age +
'}';
}
}
mybatisclass.java
package ys.utils;
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 java.io.IOException;
import java.io.InputStream;
public class mybatisclass {
//定义全局变量 Factory
private static SqlSessionFactory factory=null;
//静态代码块,加载对象SqlSessionFactory
static {
String config="mybatis.xml";//需要和你的项目中的文件名一样
try {
InputStream in = Resources.getResourceAsStream(config);
//赋值SqlSessionFactory对象
factory=new SqlSessionFactoryBuilder().build(in);
} catch (IOException e) {
e.printStackTrace();
}
}
//获取SqlSession的方法
public static SqlSession getSqlSession(){
SqlSession sqlSession=null;
if(factory!=null){
sqlSession=factory.openSession();//非自动提交事务
}
return sqlSession;
}
}
myapp.java
package ys;
import ys.dao.StudentDao;
import ys.dao.Studentdemo;
import ys.domain.Student;
import java.util.List;
public class myapp {
public static void main(String[] args) {
// StudentDao dao =new Studentdemo(); 定义StudentDao类对象dao
// List<Student> students = dao.selectStudents(); 调用方法
// 1.Dao对象,类型为StudentDao 全限定名称为:ys.dao.StudentDao
// 全限定名称和sql映射文件里的namespace一样
// 2.方法名称,selectStudent 这个是sql映射文件中的id值,也是实现类的方法名
// 3.通过dao中方法的返回值也可以确定MyBatis要调用SqlSession的方法
// 如果返回值是List 调用SqlSession.selectList()
// 如果返回值为int 或是非List的 看sql映射文件中的标签<insert> <update> 就会调用insert或者update方法
StudentDao dao =new Studentdemo();
Student student =new Student();
//添加的数据
student.setAge(20);
student.setId(5);
student.setEmail("15649@168.com");
student.setName("隆");
//执行添加的sql语句
int nums=dao.insertStudent(student);
System.out.println("添加数据的数量"+nums);
//执行查询的sql语句
List<Student> students = dao.selectStudents();
//循环输出查询到的数据库中的内容
for (Student stu:students){
System.out.println(stu);
}
}
}
mybatis.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>
<environments default="1">
<environment id="1">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/ys"/>
<property name="username" value="******"/>
<property name="password" value="******"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="ys\dao\StudentDao.xml"/>
</mappers>
</configuration>