ssm之Mybatis框架知识点总结

jdbc缺点分析:

1、每次都要加载获取连接
2、sql语句和java代码耦合
3、参数类型需要手动判断
4、需要判断下标
5、需要手动设置参数
6、结果集中的类型需要手动判断
7、每次都要打开或关闭连接,浪费资源‘

Mybatis介绍

前身是Apache的一个叫iBatis的开源项目,2010年这个项目从Apache迁移到Google Code改名为Mybatis之后将版本升级到3.X,官网:blog.mybatis.org/,从3.2版本之后迁移到github。
Mybatis是一个类似于ssh框架的Hibernate的ORM持久化框架,支持普通的sql查询,存储过程以及高级映射。Mybatis通过使用简单的xml或注解用于配置和原始映射,将接口和pojo对象映射成数据库中的记录。

由于Mybatis是直接基于JDBC做了简单的映射包装,所以从性能角度来看:
JDBC>Mybatis>Hibernate
有人看了我之前博客,问我pojo是什么,对此我介绍一下pojo:
POJO(Plain Ordinary Java Object)简单的Java对象,实际就是普通JavaBeans,是为了避免和EJB混淆所创造的简称。
使用POJO名称是为了避免和EJB(Enterprise JavaBean, 企业级JavaBean,是一个用来构筑企业级应用的服务器端可被管理组件。)混淆起来, 而且简称比较直接。其中有一些属性及其getter setter方法的类,没有业务逻辑,有时可以作为VO(value -object)或dto(Data Transform Object)来使用。当然,如果你有一个简单的运算属性也是可以的,但不允许有业务方法,也不能携带有connection之类的方法。

延迟加载

cacheEnabled 该配置影响的所有映射器中配置的缓存的全局开关
lazyLoadingEnabled 延迟加载全局开关,当开启时,所有关联对象都会延迟加载,特定关联关系中可通过设置fetchType属性来覆盖该项的开关状态
aggressiveLazyLoading 当启用时,带有延迟加载属性的对象的加载与否完全取决于对任意延迟属性的调用;反之,每种属性将会按需加载
useGeneratedKeys 允许JDBC支持自动生成主键,需要驱动兼容。如果设置为true则这个设置强制使用自动生成主键,尽管一些驱动不能兼容但仍能正常工作(比如Derby)

延迟加载的意义在于虽然关联查询,但不是及时将关联的数据查询出来,而且在需要的时候进行查询。

配置

所需jar包

mybatis-3.2.7.jar

全局配置文件SqlMapConfig.xml

<?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>
	<!-- 和spring整合后 environments配置将废除 -->
	<environments default="development">
		<environment id="development">
			<!-- 使用jdbc事务管理 -->
			<transactionManager type="JDBC" />
			<!-- 数据库连接池 -->
			<dataSource type="POOLED">
				<property name="driver" value="com.mysql.jdbc.Driver" />
				<property name="url"
					value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8" />
				<property name="username" value="root" />
				<property name="password" value="root" />
			</dataSource>
		</environment>
	</environments>
	
	<!-- 加载映射文件 -->
	<mappers>
		<mapper resource="mybatis/User.xml"/>
	</mappers>
</configuration>

配置mymapper.xml(本人针对User操作,故叫User.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">
<!--namespace:命名空间,用于隔离SQL语句 
	#{}:占位符,相当于JDBC的?
	${}:字符串拼接符,引起SQL注入,如果是普通类型参数,{}内只能使用value
-->
<mapper namespace="user">
	<!-- id:Sql id ,语句的唯一标识
		parameterType:入参的数据类型
		resultType:返回结果的数据类型(指定单条记录所映射的Java对象类型)
	 -->
	<select id="SelectUser" parameterType="int" resultType="mybatis.pojo.User">
		select * 
		from `user` 
		where id=#{id1}
	</select>
	<!-- resultType:如果返回结果为集合,则只需要设置每一个的数据类型-->
	<select id="GetUserByName" parameterType="String" resultType="mybatis.pojo.User">
		select *
		from `user`
		<!-- where username like #{name} -->
		where username like '%${value}%'
	</select>
	<!--parameterType:指定入参的数据类型是pojo(包括用户信息) 
		#{}中指定pojo的属性名,接收到pojo对象的属性值,mybatis通过OGNL获取对象的属性值
	 -->
	<insert id="InsertUser" parameterType="mybatis.pojo.User">
		insert `user`(
			`username`,
			`birthday`,
			`sex`,
			`address`
		)
		values(
			#{username},
			#{birthday},
			#{sex},
			#{address}
		)
	</insert>

	<!-- useGeneratedKeys:使用自增,内部自动调用SELECT LAST_INSERT_ID()函数
		keyProperty与之配套使用,这里是user的主键
	 -->
	<insert id="InsertUser2" parameterType="mybatis.pojo.User" useGeneratedKeys="true" keyProperty="id">
		<!-- selectKey:主键返回
			keyProperty:user中的主键属性
			resultType:主键数据类型
			order:指定selectKey何时执行:AFTER之后,BEFOR之前
		 -->
		<!-- <selectKey keyProperty="id" resultType="int" order="AFTER">
			SELECT LAST_INSERT_ID()
		</selectKey> -->
		insert `user`(
			`username`,
			`birthday`,
			`sex`,
			`address`
		)
		values(
			#{username},
			#{birthday},
			#{sex},
			#{address}
		)
	</insert>
</mapper>

mybatis使用代码CRUD

1)配置SqlMapConfig.xml 全局的配置文件 (1、数据源,2、外部的mapper)
2)创建SqlSessionFactory
3)通过SqlSessionFactory创建SqlSession对象
4)通过SqlSession操作数据库 CRUD
5)调用session.commit()提交事务
6)调用session.close()关闭会话

public void selectUser() throws Exception {
		//创建SqlSessionFactoryBuilder对象
		SqlSessionFactoryBuilder ssfb= new SqlSessionFactoryBuilder();
		//创建核心配置文件的输入流
		InputStream inputStream=Resources.getResourceAsStream("SqlMapConfig.xml");
		//通过输入流创建SqlSessionFactory对象
		SqlSessionFactory factory=ssfb.build(inputStream);
		//创建SqlSession对象
		SqlSession session=factory.openSession();
		//执行查询
		User user=session.selectOne("user.SelectUser",1);
		
		System.out.println(user);
		
		//释放资源
		session.close();
	}

项目目录

发布了11 篇原创文章 · 获赞 5 · 访问量 737

猜你喜欢

转载自blog.csdn.net/JAVA_php_Jack/article/details/102839403