ORM模型
什么是ORM模型?
ORM模型是数据库的表和简单的java对象((Plain Ordinary Java Object,简称POJO) 的映射关系模型,主要解决数据库的数据和POJO对象的相互映射。
POJO对象实际上就是JavaBean对象。
映射关系分为:①Java类和数据库中表的映射;②Java对象和表中记录的映射;③类的属性和数据库中表的字段的映射。
常见的ORM模型
HIBERNATE
Hibernate是一个全自动的ORM模型,Hibernate可以自动生成SQL语句,自动执行。
MyBatis
MyBatis是一个半自动的的ORM模型,它支持定制SQL、存储过程以及高级映射。
Mybatis和hibernate 区别
为什么使用ORM模型?
为什么我们要用ORM模型,而不使用JDBC呢?
JDBC的缺点
mybatis 解决了jdbc 的问题
1.数据库连接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库连接池可解决此问题。
解决方法:在SqlMapConfig.xml中配置数据连接池,使用连接池管理数据库链接。
2.Sql语句写在代码中造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。
解决:将Sql语句配置在XXXXmapper.xml文件中与java代码分离。
3.向sql语句传参数麻烦,因为sql语句的where条件不一定,可能多也可能少,占位符需要和参数一一对应。
MyBatis
MyBatis 的优点
1.简单易学:易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现;
2.灵活度高:通过定制 SQL 语句,可以比较灵活的访问数据库,获取数据;
3.功能完整:提供了连接管理,缓存支持,线程支持,(分布式)事务管理等功能,还提供了其他 ORM 模型的支持。
什么是MyBatis
Mybitis使用步骤
1.创建项目并导入需要的jar包
创建mybitis项目:
所需jar包如下:
2.放入配置文件
第一个是日志配置文件(选择放入),第二个是主配置文件(一定要放入)
配置文件内容:
创建代码文件
1.bean
bean包下我们用来创建实体类(BanJi):
package banji.bean;
public class BanJi {
private int classid;
private String classname;
public BanJi() {
super();
// TODO Auto-generated constructor stub
}
public BanJi(int classid, String classname) {
super();
this.classid = classid;
this.classname = classname;
}
public int getClassid() {
return classid;
}
public void setClassid(int classid) {
this.classid = classid;
}
public String getClassname() {
return classname;
}
public void setClassname(String classname) {
this.classname = classname;
}
@Override
public String toString() {
return "BanJi [classid=" + classid + ", classname=" + classname + "]";
}
}
2.dao
在dao层,我们放一些工具,用来加载配置文件、创建工厂、创建sql对象,以及释放资源:
package dao;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class DaoUtils {
private static SqlSessionFactory factory;
static {
try {
//1.加载配置文件
InputStream stream=Resource.getResourceAsStream(
"mybatis-config.xml");
//2.创建工厂
factory=new SqlSessionFactoryBuilder().build(stream);
}catch (Exception e){
e.printStackTrace();
}
}
//3.获取sql对象
public stsic SqlSession getSqlSession(){
return factory.openSession();
}
//4.释放资源
public static void closeResource(SqlSession sqlSession) {
sqlSession.close();
}
return factory.openSession();
3.mapper
mapper下放一个接口和xml文件(写sql语句)
1.接口
//使用mybitis时,id和方法名相同,又因为id必须唯一,所以方法不允许重载
package mapper;
import java.util.List;
import bean.BanJi;
public interface Classmapper {
//新增
public int addBanJi(BanJi bj);
//删除
public int delBanJi(int classid);
//修改
public int updateBanJi(BanJi bj);
//查询
//根据classid查找班级
public BanJi findBanJiByClassid(int classid);
//查询所有班级
public List<BanJi> findAllBanJi();
//查询一共还有多少个班级
public int findBanJiCount();
//根据班级编号查找班级名称
public BanJi findClassnameByClassid(int classid) ;
}
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">
<!--
sqlMapper文件:执行方法和sql语句的映射
-->
<mapper namespace="test">
<!-- 查询所有班级-->
<!-- 此处的id必须和接口中的方法名相同 -->
<!-- resultType:出参类型 -->
<!-- parameterType:入参类型 -->
<select id="findAllBanJi" resultType="banji.bean.BanJi">
select * from class
</select>
<!-- 根据classid查询所有班级-->
<select id="findBanJiByClassid" resultType="banji.bean.BanJi">
select * from class where classid = #{v}
</select>
<!-- 根据classid删除所有班级-->
<delete id="delBanJi" parameterType="int">
delete from class where classid = #{v}
</delete>
<!-- 根据classid删除所有班级-->
<insert id="addBanJi" parameterType="banji.bean.BanJi">
insert into class(classid,classname)
values(#{classid},#{classname})
</insert>
<!-- 根据classid修改班级-->
<update id="updateBanJi" parameterType="banji.bean.BanJi">
update class set classname=#{classname} where classid=#{classid}
</update>
<!-- 查询班级数-->
<select id="findBanJiCount" resultType="int">
select count(*) from class
</select>
</mapper>
4.test
测试类:
package test;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import bean.BanJi;
import dao.BanJi_DaoUtils;
import mapper.Classmapper;
public class Test {
public static void main(String[] args) {
//创建sql对象
SqlSession sqlSession=DaoUtils.getSqlSession();
List<BanJi> selectList = sqlSession.selectList(
"findstudentall");
for(BanJi bj:selectList) {
System.out.println(bj);
}
sqlSession.close();
}
}
结果:
Mybitis配置文件
配置文件的层级结构
configuration元素
功能:标识配置文件的起始,所有配置信息都存放在这里
enviroment元素
功能:配置数据库环境信息,注册数据源, 配置数据库事务。
其中,1.default:默认使用的数据库环境
2.transactionManager:配置数据库事务
3.dataSource:配置环境信息中数据源连接的信息。
dataSource的数据源有:非连接池的数据源(UNPOOLED )、连接池的数据源(POOLED )、JNDI的数据源(JNDI)、其他类型数据源
4.property:配置环境信息的属性
properties元素
功能:配置属性的元素,可以在配置文件的上下文中使用 该属性。
<properties resource="jdbc.properties"></properties>
由于property下明文存放了数据库信息,如用户名和密码,那就会有被窃取的可能,那如何解决呢?
解决方法就是单独配置一个properties配置文件来存放数据库信息,properties配置文件是外部文件:
typeAliases元素
功能:Mybatis内部支持的别名
我们使用Mybatis 需要将查询的虚拟表映射为java中的实体类的对象,就需 要让Mybatis知道这些我们自定义的“类型” 。
所以我们在主配置文件中进行配置typeAliases
<typeAliases>
<package name="bean"/>
</typeAliases>
然后就可以在BanJimapper.xml文件中直接使用类名作为出参入参类型:
<select id="findAllBanJi" resultType="BanJi">
select * from class
</select