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中进行了注册,然后就可以通过 SqlSession的 getMapper方法获取 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为例:
- 修改StudentMapper接口,添加增删改接口,如下
public interface StudentMapper{
List<Student> selectAll();
StudentselectOne(intstudentId);
voidinsert(Studentstudent);
voidupdate(Studentstudent);
voiddelete(intstudentId);
}
- 修改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的相关内容,现在很多企业开发的项目越来越大,对于数据库要求也越来越高,大量数据的存储已经成为了一个焦点问题,还有对于大量数据的增删查改也成为了一个关注点,所以学好数据库势在必行。
标签:持久,框架,数据库,studentMapper,guanzhilin,score,student,MyBatis,id 来源: https://blog.csdn.net/XCatherine/article/details/119451066