MyBatis 对象分析
对象使用
SqlSession , SqlSessionFactory 等
(1) Resources 类
Resources 类,顾名思义就是资源,用于读取资源文件。其有很多方法通 过加载并解析资源文件,返回不同类型的 IO 流对象。
(2) SqlSessionFactoryBuilder 类
SqlSessionFactory 的创建,需要使用 SqlSessionFactoryBuilder 对象的 build()方法。由于 SqlSessionFactoryBuilder 对象在创建完工厂对象后,就完 成了其历史使命,即可被销毁。所以,一般会将该 SqlSessionFactoryBuilder 对象创建为一个方法内的局部对象,方法结束,对象销毁。
(3) SqlSessionFactory 接口
SqlSessionFactory 接口对象是一个重量级对象(系统开销大的对象),是 线程安全的,所以一个应用只需要一个该对象即可。创建 SqlSession 需要使用 SqlSessionFactory 接口的的 openSession()方法。
a) openSession(true):创建一个有自动提交功能的 SqlSession
b)openSession(false):创建一个非自动提交功能的 SqlSession,需手 动提交
c)openSession():同 openSession(false)
(4) SqlSession 接口
SqlSession 接口对象用于执行持久化操作。一个 SqlSession 对应着一次 数据库会话,一次会话以 SqlSession 对象的创建开始,以 SqlSession 对象的 关闭结束。
SqlSession 接口对象是线程不安全的,所以每次数据库会话结束前,需要 马上调用其 close()方法,将其关闭。再次需要会话,再次创建。 SqlSession 在方法内部创建,使用完毕后关闭。
创建工具类
(1) 创建 MyBatisUtil 类
package com.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 MybatisUtils { private static SqlSessionFactory factory= null; static { String config="Mybatis.xml"; try { InputStream in = Resources.getResourceAsStream(config); factory = new SqlSessionFactoryBuilder().build(in); } catch (IOException e) { e.printStackTrace(); } } //创建方法,获取SqlSession对象 public static SqlSession getSqlSession(){ SqlSession session = null; if (factory != null){ session =factory.openSession(); } return session; } }
(2) 使用 MyBatisUtil 类
package com.hrf; import com.domain.Student; import com.utils.MybatisUtils; import org.apache.ibatis.session.SqlSession; import org.junit.Test; import java.util.List; public class MyTest { @Test public void testSelectById(){ //1.获取SqlSession SqlSession session = MybatisUtils.getSqlSession(); //2.指定SqlId String sqlId = "com.dao.StudentDao.selectById"; //3.执行SqlSession的方法,表示执行sql语句 Student student =session.selectOne(sqlId,1001); System.out.println("查询结果====="+student); //关闭SqlSession对象 session.close(); } @Test public void testselectStudents(){ //获取session对象 SqlSession session = MybatisUtils.getSqlSession(); //指定sqlId String sqlId = "com.dao.StudentDao.selectStudents"; //执行sql语句 List<Student> li = session.selectList(sqlId); for (Student stu:li){ System.out.println("student=="+stu); } session.close(); } @Test public void testInsertStudent(){ SqlSession session = MybatisUtils.getSqlSession(); String sqlId = "com.dao.StudentDao.insertStudent"; Student student = new Student(); student.setAge(19); student.setId(1005); student.setName("划为"); student.setEmail("852@qq.com"); int i = session.insert(sqlId,student); session.commit(); System.out.println("影响数据库行数"+i); session.close(); } }
2.3 MyBatis 使用传统 Dao 开发方式
使用 Dao 的实现类,操作数据库
2.3.1创建dao接口的实现类
package com.impl; import com.dao.StudentDao; import com.domain.Student; import com.utils.MybatisUtils; import org.apache.ibatis.session.SqlSession; import java.util.List; public class StudentDaoImpl implements StudentDao { @Override public Student selectById(Integer id) { SqlSession session = MybatisUtils.getSqlSession(); String sqlId = "com.dao.StudentDao.selectById"; Student student = session.selectOne(sqlId, id); session.close(); return student; } @Override public List<Student> selectStudents() { //获取session对象 SqlSession session = MybatisUtils.getSqlSession(); //指定sqlId String sqlId = "com.dao.StudentDao.selectStudents"; //执行sql语句 List<Student> li = session.selectList(sqlId); session.close(); return li; } @Override public int insertStudent(Student student) { SqlSession session = MybatisUtils.getSqlSession(); String sqlId = "com.dao.StudentDao.insertStudent"; int insert = session.insert(sqlId,student); session.commit(); session.close(); return insert; } }
2.3.2使用dao实现类
package com.hrf; import com.dao.StudentDao; import com.domain.Student; import com.impl.StudentDaoImpl; import org.junit.Test; import java.util.List; public class MyTest2 { @Test public void StudentDaoImplSelectOne(){ StudentDao studentDao = new StudentDaoImpl(); Student student = studentDao.selectById(1001); System.out.println("查询学生信息"+student); } @Test public void StudentDaoImplSelectList(){ StudentDao studentDao = new StudentDaoImpl(); List<Student> students = studentDao.selectStudents(); for( Student student :students){ System.out.println("学生信息"+student); } } @Test public void StudentDaoImplInsertStudent(){ Student student = new Student(); student.setName("里瓦"); student.setId(1006); student.setAge(25); student.setEmail("thg@qq.com"); StudentDao studentDao = new StudentDaoImpl(); int i = studentDao.insertStudent(student); System.out.println("影响数据库行数"+i); } }