mybatis

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 区别

1. Hibernate是全自动化ORM; Mybatis是半自动化ORM。
2. Hibernate简化dao层,不用考虑SQL语句的编写和结果映射,重点放在业务逻辑上;
Mybatis需要手写SQL语句以及结果映射。
3. Hibernate是一个重量级的框架,内部生成SQL语句,反射操作太多,导致性能下降;
Mybatis是一个轻量级的框架,需要自己写sql语句,有较少的反射操作。
4.Hibernate 不方便做SQL优化,遇到较复杂的SQL语句需要绕过框架实现复杂,
对多字段的结构进行部分映射困难;
Mybatis 不仅可以做SQL优化还可以SQL与Java分离,还可以自行编写映射关系,
复杂的SQL语句Mybatis效率更高
Mybatis优势:可以进行更细致的SQL优化;容易掌握
Hibernate优势:dao层开发比mybatis简单,mybatis需要维护SQL和结果映射;hibernate数据库移植性好

为什么使用ORM模型?

        为什么我们要用ORM模型,而不使用JDBC呢?

JDBC的缺点

硬编码:
SQL 语句存在 Java 代码中,不能很好的分离数据库语句和Java语句,造成代码不易维护;
SQL参数固定:
SQL 语句的参数固定,使得 SQL 语句不灵活,无法满足多变的场景
代码重复度高:
大量的重复代码,以 ResultSet 为例,每次都需要重复解析结果集;
底层技术:
JDBC 属于底层的技术,不支持分布式,缓存等技术,对于复杂场景的应对不好;

mybatis 解决了jdbc 的问题

1.数据库连接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库连接池可解决此问题。

解决方法:在SqlMapConfig.xml中配置数据连接池,使用连接池管理数据库链接。

2.Sql语句写在代码中造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。

解决:将Sql语句配置在XXXXmapper.xml文件中与java代码分离。

3.向sql语句传参数麻烦,因为sql语句的where条件不一定,可能多也可能少,占位符需要和参数一一对应。

解决:Mybatis自动将java对象映射至sql语句,通过statement中的parameterType定义输入参数的类型

MyBatis 

MyBatis 的优点

1.简单易学易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现;

2.灵活度高通过定制 SQL 语句,可以比较灵活的访问数据库,获取数据;

3.功能完整提供了连接管理,缓存支持,线程支持,(分布式)事务管理等功能,还提供了其他 ORM 模型的支持。

什么是MyBatis

        MyBatis是一款ORM模型,支持定制化 SQL、存储过程以及高级映射。可以使用简单的 XML 或注解来配置和映射 原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录

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

  • 13
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值