上周的博客留了个伏笔,使用JDBC连接数据库与java会有很多缺点和弊端,而为了解决这些弊端,开发者们推出了一种orm模型。
1.什么是ORM模型
ORM 模型是数据库的表和简单 Java 对象(Plain Ordinary Java Object,简称 POJO)的映射关系模型,主要解决数据库数据和 POJO 对象的相互映射。
1.1orm模型分类
现在比较常见的orm模型有两种,分别是Hibernate和MyBatis,本文就重点来给大家讲讲mybatis映射器的具体用法。
hibernate是全自动的,而mybatis是半自动的,其区别在于hibernate可以自动化生成sql语句,而mybatis不能。这种区别就好像冲锋枪和拉栓步枪,冲锋枪只需要突突突,而拉栓步枪需要拉大栓。
两种模型的使用环境也不一样,hibernate由于sql语句固定,所以优化和修改起来困难,适用于中小企业等对于需求变化不多的项目。至于mybatis专注于sql本身,虽然需要自己写sql语句,但是相对的优化与修改就比较方便,适用于需求变化多的项目。至于二者孰优孰劣,就要看不同的使用场景了。
1.2为什么要有mybatis
奥卡姆剃刀原理,如无必要,勿增实体。
而mybatis映射器的出现,正是为了解决jdbc的几个弊端与问题的:
问题一:数据库连接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库连接池可解决此问题。
mybatis 解决方式:在SqlMapConfig.xml中配置数据连接池,使用连接池管理数据库链接。
问题二:Sql语句写在代码中造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。
mybatis 解决方式:将Sql语句配置在XXXXmapper.xml文件中与java代码分离。
问题三:向sql语句传参数麻烦,因为sql语句的where条件不一定,可能多也可能少,占位符需要和参数一一对应。
mybatis 解决方式:
Mybatis自动将java对象映射至sql语句,通过statement中的parameterType定义输入参数的类型。
问题四:对结果集解析麻烦,sql变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成pojo对象 解析比较方便。
mybatis 解决方式:
Mybatis自动将sql执行结果映射至java对象,通过statement中的resultType定义输出结果的类型。
2.mybatis具体怎么用
2.1前期步骤
在lib文件夹下需要加入这几个架包,可以在java官网下到。
然后点击下图按键:
这样就可以生成成功构建项目架包了。
2.2将配置文件放入项目
mybatis-config.xml为主配置文件,将主配置文件放入src文件夹下。
<?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>
<package name = "com.ape.bean"/>
</typeAliases>
<!-- 和spring整合后 environments配置将废除 -->
<environments default="development">
<environment id="development">
<!-- 使用jdbc事务管理 -->
<transactionManager type="JDBC" />
<!-- 数据库连接池 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver" />
<property name="url"
value="jdbc:mysql://localhost:3306/test?serverTimezone=GMT" />
<property name="username" value="root" />
<property name="password" value="123456" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/ape/mapper/TeacherMapper.xml"/>
</mappers>
</configuration>
实体类和 接口文件跟之前的jdbc一样,这里我们把 sql语句放到了sqlMapper文件中,让sql语句进入到了配置文件中从而解决sql硬编码问题。
打开
sqlMapper.xml文件后,可以在其中写sql语句,
<?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="org.mybatis.example.BlogMapper">
<select id="chazhaosuoyouxuesheng" resultType="com.ape.bean.Student">
select * from student
</select>
<select id="findStu" resultType="com.ape.bean.Student" parameterType="int">
<!-- #{名字} 用来接收入参 -->
select * from student where sid = #{v}
</select>
<insert id="tianjiaxuesheng" parameterType="com.ape.bean.Student" >
insert into student(sname,birthday,ssex,classid)
values(#{sname},#{birthday},#{ssex},#{classid})
</insert>
<update id="xiugaixuesheng" parameterType="com.ape.bean.Student">
update student set sname=#{sname},birthday=#{birthday},ssex = #{ssex},
classid=#{classid} where sid = #{sid}
</update>
<delete id="shanchuxuesheng" parameterType="int">
delete * from student where sid = #{v}
</delete>
</mapper>
2.3创建SqlSession
创建了SqlSession文件,就可以在java中做数据库的增删改查等操作了
package com.ape.dao.impl;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import com.ape.bean.Teacher;
import com.ape.dao.DaoUtil;
import com.ape.dao.ITeacherDao;
public class TeacherDaoImpl implements ITeacherDao {
@Override
public int addTeacher(Teacher s) {
SqlSession sqlSession = DaoUtil.getSqlSession();
int ret = sqlSession.insert("tianjiaxuesheng", s);
// 处理事务 mybatis 事务要手动处理
if(ret > 0) {
// 事务的提交
sqlSession.commit();
}else {
// 事务的回滚
sqlSession.rollback();
}
DaoUtil.closeSource(sqlSession);
return ret;
}
@Override
public int updateTeacher(Teacher s) {
SqlSession sqlSession = DaoUtil.getSqlSession();
int ret = sqlSession.update("xiugaixuesheng", s);
if(ret > 0) {
sqlSession.commit();
}else {
sqlSession.rollback();
}
DaoUtil.closeSource(sqlSession);
return ret;
}
@Override
public int deleteTeacher(int sid) {
SqlSession sqlSession = DaoUtil.getSqlSession();
int ret = sqlSession.delete("shanchulaoshi", sid);
if(ret > 0) {
sqlSession.commit();
}else {
sqlSession.rollback();
}
return ret;
}
@Override
public List<Teacher> findAllTeacher() {
SqlSession sqlSession = DaoUtil.getSqlSession();
List<Teacher> slist = sqlSession.selectList("chazhaosuoyouxuesheng");
DaoUtil.closeSource(sqlSession);
return slist;
}
@Override
public Teacher findTeacherBySid(int sid) {
SqlSession sqlSession = DaoUtil.getSqlSession();
Teacher s = sqlSession.selectOne("findStu",sid);
DaoUtil.closeSource(sqlSession);
return s;
}
}
3.总结
mybatis的基本操作就是以上,而其进阶操作可以通过使用动态代理,省略掉imp文件,不用创建实现类,而在之后,连sql语句也可以通过动态sql语句的设置,使得sql语句更加灵活,可以使用注解的方式,使得简单的sql语句脱离xml文件的束缚,如此种种,便是我这一周的学习所得。
行文至此,不过一些拾人牙慧,因为以鄙人的水平,短时间内也很难有建设性的创造,希望未来可以将所学所用投入工作中,创造价值,如果能使自己的知识技能更进一步,那是我之幸运。
文末借唐朝李泌十七岁时写作的一首诗,与诸君共勉。
长歌行
唐-李泌
天覆吾,地载吾,天地生吾有意无。
不然绝粒升天衢,不然鸣珂游帝都。
焉能不贵复不去,空作昂藏一丈夫。
一丈夫兮一丈夫,千生气志是良图。
请君看取百年事,业就扁舟泛五湖。
版权归原作者 涂碧宇 所有, 如有侵权,请联系我们删除。