Mybatis框架运行机制(增删改查,一对一,一对多,日志系统,单元测试,版本控制,缓存,动态Sql)

Mybatis:

对JDBC是一个轻量级的封装。一个持久层一个框架
支持普通SQL查询,存储过程和高级映射的优秀持久层框架
可以使用简单的XML或注解用于配置和原始映射,将接口和java的POJO(plai old java objects,普通的java对象)映射成数据库中的记录。
1.步骤:
1>.导包 mybatis.jar + mysql-connector-java.jar

2>.在src目录下创建conf.xml文件(mybatis-conf.xml)
     配置数据库连接信息
     注册mapper.xml文件(将实体类的映射文件写好之后,加入)

3>.定义数据表对应的实体类

     定义操作数据表的SQL映射文件xxxMapper.xm;

1>.写dtd头文件

2>.namesapce(映射文件的路径)

3>.语句中的id为唯一

4>.parameterType参数类型

5>.resultType 返回的结果集类型

4>.测试

1>.创建sqlSession工厂:使用类加载器加载mybatis配置文件→ 构建sqlSession的工厂

SqlSessionFactory sessionFactory=new SqlSessionFactoryBuilder().build("mybatis-conf.xml")

2>.使用session.getMapper(Dao层.class)

3>.测试

2.常识

mybatis-config.xml配置文件中注册文件

1>.resource用于注册xxxMapper.xml文件

2>.class 注册xxx<apper映射接口(IBookDao)

创建SqlSession工厂时(基于注解,基于xml)

1>xxxMapper(IBookDao) mapper(BookDao)=SqlSession.getMapper(xxxMapper.class)

对数据表CRUD一共三种方法

1>.配置文件+数据表实例+xxxMapper.xml+SqlSessionFactory+xxxDao

测试时候通过session.getMapper(xxxDao.class)

2>.配置文件+数据表实例+SqlsessionFactory+xxxDao(里面有注解)→注解

测试时候通过session.getMapper(xxxDao.class)获得

3>.配置文件+数据表实例+jdbc.properties(需要在配置文件中引用,用${}获得参数)+xxxMapper.xml+SqlSessionFactory+xxxDao(接口方法)

测试时候通过session.getMapper(xxxDao.class)获得

3.一对一查询,一对多查询

因为获得不到主键表的数据

1>.把语句整合在一起,使用两个构造resultMap

2>.把语句分开写,使用外键关联查询

<!DOCTYPE mapper
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hellojava.dao.IPersonDao">
	<!-- 第一种方法 -->
	<resultMap type="Person" id="personResult">
		<id column="perId" property="perId"/>
		<result column="perName" property="perName"/>
		<association property="card" javaType="Card">
			<id column="cardId" property="cardId"/>
			<result column="cardNumber" property="cardNumber"/>
		</association>
	</resultMap>
	<select id="loadPersonById" parameterType="int" resultMap="personResult">
		select P.perId,P.perName,C.cardId,C.cardNumber from
			person P,card C where P.perId=C.cardId and P.perId=#{perId}
	</select>
	<!-- 第二种方法 -->
	<resultMap type="Person" id="ResultPerson">
		<id column="perId" property="perId"/>
		<result column="perName" property="perName"/>
		<association property="card" javaType="Card"
			select="loadCard" column="perId"></association>
	</resultMap>
	<select id="loadPerson" parameterType="int" resultMap="ResultPerson">
		select * from person where PerId=#{perId}
	</select>
	<select id="loadCard" parameterType="int" resultType="Card">
		select * from card where cardId=#{cardId}
	</select>
</mapper>
4.边缘问题
1>.日志系统

查看bug error fatal(重大错误) info trace

可以在log4j.properties更改配置,然后查找对应的日志

2>.测试(单元测试)

继承TestCase,使用断言进行测试(绿,红进度条)

3>.版本控制 SVN(服务器,客户端 eclipse插件)

开发时候,小组各自上传自己文件

5.缓存

一级缓存基于session,清楚缓存:

1>.clear() 2>.close() 3>.update(当数据发生更改也会清楚,其实是更新对应的缓存)

二级缓存基于Mapper文件,cache配置:

1>.eviction剔除的算法(先进先出)FIFO

2>.flushInterval 刷新的频率 1000

3>.readonly 是否只读 false

4>.size 缓存默认大小 10

5>.type 缓存中存储的数据类型

测试二级缓存,使用两个不同的SqlSession对象去执行相同查询条件的查询,第二次查询时不会再发生Sql语句

而是从缓存中取出数据。

6.动态Sql

1>.添加集合List 使用foreach遍历 separator分隔符

2>.更新数据 使用if判断 拼接语句

3>.模糊查询 在查询条件添加%(mapper文件里面只能bind一个模糊条件,其他会得不到参数)

<mapper namespace="com.hellojava.dao.IBookDao">
	<insert id="saves" parameterType="java.util.List">
		insert into book(bookName,bookAuthor,bookPrice,bookInfo) values
			<foreach collection="list" item="b" separator=",">
				(#{b.bookName},#{b.bookAuthor},#{b.bookPrice},#{b.bookInfo})
			</foreach>
	</insert>
	<update id="update" parameterType="Book">
		update book
		<trim prefix="set" suffixOverrides=",">
		<if test="bookName!=null">
			bookName=#{bookName},
		</if>
		<if test="bookAuthor!=null">
			bookAuthor=#{bookAuthor},
		</if>
		<if test="bookPrice>0">
			bookPrice=#{bookPrice},
		</if>
		<if test="bookInfo!=null">
			bookInfo=#{bookInfo},
		</if>
		</trim>
		<where>
			bookId=#{bookId}
		</where>
	</update>
	<select id="load" parameterType="Book" resultType="Book">
		select * from book
		<bind name="bname" value="'%' + _parameter.getBookName() + '%'"/>
		<where>
			<trim suffixOverrides="AND|OR">
				<if test="bookId>0">
					bookId=#{bookId} and
				</if>
				<if test="bookName!=null">
					bookName like #{bname} and
				</if>
				<if test="bookAuthor!=null">
					bookAuthor like #{bookAuthor} and
				</if>
			</trim>
		</where>
	</select>
</mapper>
7.mybais-config.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>
	<properties resource="jdbc.properties"></properties>
	<typeAliases>
		<package name="com.hellojava.entity"/>
	</typeAliases>
	<environments default="development">
		<environment id="development">
			<transactionManager type="JDBC"></transactionManager>
			<dataSource type="POOLED">
				<property name="driver" value="${jdbc.driver}"/>
				<property name="url" value="${jdbc.url}"/>
				<property name="username" value="${jdbc.username}"/>
				<property name="password" value="${jdbc.password}"/>
			</dataSource>
		</environment>
	</environments>
	<mappers>
		<mapper resource="com/hellojava/mapper/BookMapper.xml"/>
	</mappers>
</configuration>



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值