【Mybatis】——基础

是什么?


        和hibernate一样,mybatis是一个持久层的框架。不同点是mybatis封装的是sql语句,而hibernate封装的比较彻底,面向对象操作,sql自动生成。如果项目需求变化小可以使用hibernate,如果需求变化比较多可以选择mybatis。


        mybatis让程序将主要精力放在sql上,通过mybatis提供的映射方式,自由灵活生成(半自动化,大部分需要程序员编写sql)满足需要sql语句。



为什么出现?


         mybatis和hibernate都是对jdbc的封装,可以解决jdbc使用时的一些问题,下面来看一下使用原生jdbc会出现的问题

        1、数据库连接,使用时就创建,不使用立即释放,对数据库进行频繁连接开启和关闭,造成数据库资源浪费,影响 数据库性能。
                解决:可以使用数据库连接池管理数据库连接。
 
        2、将sql语句硬编码到java代码中,如果sql 语句修改,需要重新编译java代码,不利于系统维护。
                解决:将sql语句配置在xml配置文件中,即使sql变化,不需要对java代码进行重新编译。
 
 
        3、向preparedStatement中设置参数,对占位符号位置和设置参数值,硬编码在java代码中,不利于系统维护。
                解决:将sql语句及占位符号和参数全部配置在xml中。
 
        4、从resutSet中遍历结果集数据时,存在硬编码,将获取表的字段进行硬编码,不利于系统维护。
                解决:将查询的结果集,自动映射成java对象。

        以上四个问题的解决办法结合就出现的mybatis,这也是mybatis的使用特点。


mybatis框架

        

        mybatis可以将向preparedStatement中的输入参数自动进行输入映射,将查询结果集(resultset)灵活映射成java对象(输出映射)。


和hibernate比较


        对比之前学习过的hibernate的框架图两者的流程几乎是一样的,配置文件中保存一些必要的配置,使用sessionFactory创建session,调用session中的方法操作数据库。不同之处参考文章开篇。


mybatis简单实例


         java环境:jdk1.7;数据库:mysql5.6;eclipse
         jar:mybatis,mysql驱动

        工程结构



        需求说明

                 根据id查询用户
                 根据用户名模糊查询用户

         相关配置

                SqlMapConfig.xml:配置数据库连接池的相关内容

                sqlmap:其中存放的是映射文件,以一个实例了解其中配置的参数的含义

<?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">

<!-- namespace命名空间,作用就是对sql进行分类化管理,理解sql隔离 
注意:使用mapper代理方法开发,namespace有特殊重要的作用
-->
<mapper namespace="test">

	<!-- 在 映射文件中配置很多sql语句 -->
	<!-- 需求:通过id查询用户表的记录 -->
	<!-- 通过 select执行数据库查询
	id:标识 映射文件中的 sql
	将sql语句封装到mappedStatement对象中,所以将id称为statement的id
	parameterType:指定输入 参数的类型,这里指定int型 
	#{}表示一个占位符号
	#{id}:其中的id表示接收输入 的参数,参数名称就是id,如果输入 参数是简单类型,#{}中的参数名可以任意,可以value或其它名称
	
	resultType:指定sql输出结果 的所映射的java对象类型,select指定resultType表示将单条记录映射成的java对象。
	 -->
	<select id="findUserById" parameterType="int" resultType="cn.itcast.mybatis.po.User">
		SELECT * FROM USER WHERE id=#{id}
	</select>
	<!-- 根据用户名称模糊查询用户信息,可能返回多条
	resultType:指定就是单条记录所映射的java对象 类型
	${}:表示拼接sql串,将接收到参数的内容不加任何修饰拼接在sql中。
	使用${}拼接sql,引起 sql注入
	${value}:接收输入 参数的内容,如果传入类型是简单类型,${}中只能使用value
	 -->
	<select id="findUserByName" parameterType="java.lang.String" resultType="cn.itcast.mybatis.po.User">
		SELECT * FROM USER WHERE username LIKE '%${value}%'
	</select>
	
</mapper>

类似hibernate需要将映射文件添加到全局配置文件中。

         

程序中代码

public class MybatisFirst {

	// 根据id查询用户信息,得到一条记录结果
	@Test
	public void findUserByIdTest() throws IOException {

	// mybatis配置文件
	String resource = "SqlMapConfig.xml";
	// 得到配置文件流
	InputStream inputStream = Resources.getResourceAsStream(resource);

	// 创建会话工厂,传入mybatis的配置文件信息
	SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
		.build(inputStream);

	// 通过工厂得到SqlSession
	SqlSession sqlSession = sqlSessionFactory.openSession();

	// 通过SqlSession操作数据库
	// 第一个参数:映射文件中statement的id,等于=namespace+"."+statement的id
	// 第二个参数:指定和映射文件中所匹配的parameterType类型的参数
	// sqlSession.selectOne结果 是与映射文件中所匹配的resultType类型的对象
	// selectOne查询出一条记录
	User user = sqlSession.selectOne("test.findUserById", 1);

	System.out.println(user);

	// 释放资源
	sqlSession.close();

	}
	
	// 根据用户名称模糊查询用户列表
	@Test
	public void findUserByNameTest() throws IOException {
		// mybatis配置文件
		String resource = "SqlMapConfig.xml";
		// 得到配置文件流
		InputStream inputStream = Resources.getResourceAsStream(resource);

	// 创建会话工厂,传入mybatis的配置文件信息
	SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
		.build(inputStream);

	// 通过工厂得到SqlSession
	SqlSession sqlSession = sqlSessionFactory.openSession();
	// list中的user和映射文件中resultType所指定的类型一致
	List<User> list = sqlSession.selectOne("test.findUserByName", "小明");
	System.out.println(list);
	sqlSession.close();

	}
	
}

小结

         parameterType
                在映射文件中通过parameterType指定输入 参数的类型。
        resultType
                在映射文件中通过resultType指定输出结果的类型。
 
        #{}和${}
 
                #{}表示一个占位符号,#{}接收输入参数,类型可以是简单类型,pojo、hashmap。
                如果接收简单类型,#{}中可以写成value或其它名称。
 
                ${}表示一个拼接符号,会引用sql注入,所以不建议使用${}。
                ${}接收输入参数,类型可以是简单类型,pojo、hashmap。
                如果接收简单类型,${}中只能写成value。

                #{}和${}接收pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性.属性...的即属性导航方式获取对象属性值。

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值