MyBatis持久层框架来了

在开发JAVA项目时,需要和数据库进行交互,最开始的数据库编程,我们选用的是JDBC,它就是数据库和JAVA程序之间如何交互的API,但是步骤比较繁琐。今天我们就来学习一个最新的数据库框架,它就是MyBatis,它是一个半自动的持久层框架,为什么说是半自动的呢,因为它还需要手动编写SQL语句,所以称为半自动框架。那么它和JDBC相比,优势在于哪呢?下面画个图给大家看下:
在这里插入图片描述

相比于JDBC,大大简化了数据库的操作步骤,但是配置可能会麻烦一点。

1、MyBatis中的重要概念

  • sqlSession

顾名思义,这是一个会话,SqlSession对象不是线程安全的,在服务器的多线程环境下,我们应该每个线程创建一个独立的 SqlSession对象。例如:

在 Servlet中,每次收到一个新的请求,都可以视为是一个单独的线程(Servlet是在多线程环境下执行的).
那么在每个请求的处理方法内部,在操作数据库之前都需要创建一个单独的 SqlSession对象. 因此可以把SqlSession对象的生命周期视为每个请求有一个自己的SqlSession

  • sqlSessionFactory
    这个对象用于辅助创建 SqlSession对象.生命周期应该要和应用程序一致。

不要在一个应用中多次创建SqlSessionFactory!
可以使用单例模式来管理 SqlSessionFactory。

  • Mapper Interface

比如, 我们创建一个XXMapper就是这样的 Mapper interface.
1.创建 XXMapper的时候通过注解指定了每个方法对应的 SQL语句。
2.在配置文件 SqlMapConfig .xml中进行了注册,然后就可以通过 SqlSessiongetMapper方法获取 XXMapper的具体实例。
相当于手动拼装 SQL语句的操作,被 MyBaits自动生成了。

2、SQL映射文件

  • 创建映射文件

    创建对应的.xml映射文件

1.property对应实体类中的属性,column对应数据库表字段名;
2.namespace中的名字必须是 Mapper interface的全限定类名;
3.select的 id的取值必须和 Mapper interface中对应的方法名一致;
4.在这个配置中,使用两种方式进行映射,一种是 SQL中直接使用 as创建别名,一种是使用 resultMap,两种方式效果是相同的,也可以混用。

  • 修改配置文件

修改 SqlMapConfig.xml,其他部分不变,只修改 mapper中的内容

  • 修改Mapper Interface

把注解去掉,否则会报错。

3、MyBatis完成增删查改操作
以StudentMapper为例:

  1. 修改StudentMapper接口,添加增删改接口,如下
public interface StudentMapper{
  List<Student> selectAll();
  StudentselectOne(intstudentId);
  voidinsert(Studentstudent);
  voidupdate(Studentstudent);
  voiddelete(intstudentId);
}

  1. 修改StudentMapper.xml文件

配置selectOne

<selectid="selectOne"resultMap="studentResultMap"parameterType="int">
 SELECT
 student_id,
 student_name,
 score
 FROM student
 where student_id=#{id}
</select>

配置insert

<insertid="insert"parameterType="Student">
 INSERT INTO student
 VALUE(#{studentId},#{studentName},#{score});
</insert>

配置update

<updateid="update"parameterType="Student">
  UPDATE student
  set student_name=#{studentName},score=#{score}
  where student_id=#{studentId};
</update>

配置delete

<deleteid="delete"parameterType="int">
 DELETE FROM student
 where student_id=#{studentId}
</delete>

完整映射文件

<?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPEmapper
    PUBLIC"-//mybatis.org//DTDMapper3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="StudentMapper">
  <select id="selectAll"resultMap="studentResultMap">
   SELECT
     student_id,
     student_name,
     score
   FROM student
  </select>
  <selectid="selectOne"resultMap="studentResultMap"parameterType="int">
   SELECT
     student_id,
     student_name,
     score
   FROM student
   where student_id=#{id}
  </select>
<insertid="insert"parameterType="Student">
   INSERT INTO student
   VALUE(#{studentId},#{studentName},#{score});
  </insert>
  <updateid="update"parameterType="Student">
   UPDATE student
   set student_name=#{studentName},score=#{score}
   where student_id=#{studentId};
  </update>
  <delete id="delete"parameterType="int">
   DELETE FROM student
   where student_id=#{studentId}
  </delete>
  <resultMapid="studentResultMap"type="Student">
    <resultproperty="studentId"column="student_id"/>
    <resultproperty="studentName"column="student_name"/>
  </resultMap>
</mapper>

接下来就是进行测试,以下是测试代码:

public static void main(String[]args){
  try{
    //1.获取配置文件内容
    InputStream inputStream=Resources.getResourceAsStream("SqlMapConfig.xml");
    //2.创建SqlSessionFactory对象
    SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(inputStream);
    //3.创建SqlSession对象
    SqlSessionsql Session=factory.openSession();
    //4.创建StudentMapper对象
    StudentMapper studentMapper=sqlSession.getMapper(StudentMapper.class);
    //5.执行数据库操作
    //a)获取所有记录
    List<Student> studentList=studentMapper.selectAll();
    System.out.println("获取所有记录:"+studentList);
    //b)获取单个记录
    Student student=studentMapper.selectOne(1);
    System.out.println("获取单个记录:"+student);
    //c)插入记录
    Student guanzhilin=newStudent();
    guanzhilin.setStudentId(19);
    guanzhilin.setStudentName("关之琳");
    guanzhilin.setScore(100);
    studentMapper.insert(caixukun);
    studentList=studentMapper.selectAll();
    System.out.println("插入记录:"+studentList);
    //d)更新记录
    guanzhilin.setScore(200);
    studentMapper.update(guanzhilin);
    guanzhilin=studentMapper.selectOne(guanzhilin.getStudentId());
    System.out.println("修改记录:"+guanzhilin);
    //e)删除记录
    studentMapper.delete(19);
    studentList=studentMapper.selectAll();
    System.out.println("删除记录:"+studentList);
    //6.关闭释放资源
    sqlSession.commit();
    sqlSession.close();

4、MyBatis和Hibernate

(1)都是关系型数据库,持久层框架(ORM框架);
(2)MyBatis是半自动的ORM框架,而Hibernate就是全自动的ORM框架;
(3)MyBatis优点在于学习门槛低,利于sql的性能优化和维护。缺点在于不能跨数据库,因为自己编写的sql语句可能持有某些数据库的特点和关键词。
(4)Hibernatesql学习门槛更高,需要学习大量API。虽然不需要手写sql,可以通过调用API实现sql语句的编写,所以它可以跨数据库,它对数据库模型依赖比较大,一旦变更就难以维护。

以上就是MyBatis的相关内容,现在很多企业开发的项目越来越大,对于数据库要求也越来越高,大量数据的存储已经成为了一个焦点问题,还有对于大量数据的增删查改也成为了一个关注点,所以学好数据库势在必行。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值