Mybatis原生Dao开发与Mapper代理开发,spring整合Mybatis使用Mapper代理开发

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Stephen_mu/article/details/88304616

    1.Mybatis原生Dao开发

            前提加载mybatisConfig.xml配置文件(里面配置了mapper(映射文件)配置)创建SqlSessionFactory对象
            1.在Dao层方法内部通过sqlSession对象执行相关操作
            2.相关操作内部会读取Mapper.xml(映射文件),
            3.通过
Executor(baseExecutor,CachingExecutor)执行相关的数据库操作
            4.创建MapperedStatement对象,根据一些唯一的key创建Cache对象
            5.按照映射规则返回相关结果
            
            案例: mapper.xml映射配置文件
                        

 <mapper namespace="celebrityStatement">
       <!--mysql自增主键 -->
       <insert id="insertCelebrity" parameterType="com.ncs.entity.Celebrity">
       <!--如果使用自增长的主键,且需要返回自增长的主键属性值给到原来保存成功的对象上 --> 
       <selectKey keyProperty="c_id" order="AFTER" resultType="java.lang.Integer">
            select LAST_INSERT_ID()
       </selectKey>
          insert into celebrity(c_id,c_name) values(#{c_id},#{c_name})
       </insert>
  </mapper>    


                    CelebrityDaoImpl.java
                   

                    @Override
                    public int saveCelebrity(Celebrity celebrity) {
                    
                        // 加载Mybatis配置文件资源,创建会话工厂
                        SqlSessionFactory factory = null;
                        try {
                            factory = new SqlSessionFactoryBuilder()
                                    .build(Resources.getResourceAsStream("resources/mybatis/mybatisConfig.xml"));
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                        // 获取会话对象
                        SqlSession session = factory.openSession();
                        int insert = session.insert("celebrityStatement.insertCelebrity", celebrity);
                        return insert;
                    }

         2.Mapper代理开发

             加载mybatisConfig.xml配置文件,创建SqlSessionFactory
            1.按照Mapper.xml映射配置文件的相关规则,书写Mapper.java接口(注意:Mapper接口,必须按照Mapper.xml映射相关规则,否则程序不成功)
                      注意修改mapper.xml中namespace值为mapper接口地址 
            2.通过SqlSession对象,依靠反射生成Mapper接口的代理对象

            3.通过代理对象执行相关操作
            4.通过Executor(baseExecutor,CachingExecutor)执行相关的数据库操作
            5.创建MapperedStatement对象,根据一些唯一的key创建Cache对象
            6.按照映射规则返回相关结果
                 案例:   mapper.xml配置文件
                            

<mapper namespace="com.ncs.mapper.CelebrityMapper">
     <!--注意修改mapper.xml中namespace值为mapper接口地址-->
     <select id="getByName" parameterType="string" statementType="STATEMENT" resultType="com.ncs.entity.Celebrity">
     select * from celebrity where c_name like '%${value}%'
     </select>
</mapper>    

                          Mapper.java接口
                           

//注意:Mapper接口,必须按照Mapper.xml映射相关规则,否则程序不成功
public interface CelebrityMapper {  
         Celebrity getById(int id);
         Celebrity getByName(String name);
         int insertCelebrity(Celebrity celebrity);
         int deleteCelebrityById(int id);
         int updateCelebrity(Celebrity celebrity);
}


                        Mybatis配置文件配置Mapper映射文件
                            <!--加载ORM映射文件 -->
                          

<mappers>
     <mapper resource="resources/mapper/CelebrityMapper.xml"></mapper>
     <!--由于mybatis自身无mapper批量扫描,必须借助spring的MapperScannerConfigurer(来源mybatis和spring的整合)  -->
     <!--这种扫描似乎无法批量扫描resource路径下的资源,因为这是一个package标签-->
     <!-- <package name="com.ncs.mapper" /> -->
     
</mappers> 


                    
                        代理实现操作:
                          

                            @Override
                            public Celebrity getByName(String Name) {
                                // 加载Mybatis配置文件资源,创建会话工厂
                                SqlSessionFactory factory = null;
                                try {
                                    factory = new SqlSessionFactoryBuilder()
                                            .build(Resources.getResourceAsStream("resources/mybatis/mybatisConfig.xml"));
                                } catch (IOException e) {
                                    // TODO Auto-generated catch block
                                    e.printStackTrace();
                                }
                                // 获取会话对象
                                SqlSession session = factory.openSession();      
                                //通过反射获取代理对象                                
                                CelebrityMapper mapper = session.getMapper(CelebrityMapper.class);
                                Celebrity result = mapper.getByName(Name);                           
                                return result;
                            }

 3.spring整合Mybatis使用Mapper代理开发

                     1.加载Mybatisconfig.配置文件,创建SqlSessionFactory,并且将SqlSessionFactory交给Spring管理

                     2.扫描所有的mapper接口,通过SqlSessionFactory生成的sqlSession为mapper接口创建代理对象,并且将代理对象也全部交给spring管理

<!--Spring整合Mybatis,在这里配置SqlSessionFactoryBean -->
	<bean id="sqlSessionFactory"
		class="org.mybatis.spring.SqlSessionFactoryBean">
		<!--加载Mybatis配置文件,将sqlSessionFactory交给springIOC容器管理 -->
		<property name="configLocation"
			value="classpath:resources/mybatis/mybatisConfig.xml"></property>
		<property name="dataSource" ref="dataSource" />
	</bean>

	<!--org.mybatis.spring.mapper.MapperFactoryBean复杂配置的解决方案 开启mapper接口快速扫描,简化配置 -->
	<!-- 自动扫描 将Mapper接口生成代理注入到Spring -->
	<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
		<!--指定mapper接口路径,一次性扫描所有的mapper接口 -->
		<property name="basePackage" value="com.ncs.mapper"></property>
		<property name="sqlSessionFactoryBeanName"
			value="sqlSessionFactory"></property>
	</bean>

   其他步骤和和为与spring整合的mapper代理开发方式一样

                     3.创建mapper接口

                      

                     4.在mybatisConfig.xml配置文件中扫描mapper映射文件

	<!--加载ORM映射文件 -->
	<mappers>
		<mapper resource="resources/mapper/UserMapper.xml"></mapper>
		<mapper resource="resources/mapper/OrderformMapper.xml"></mapper>
		<mapper resource="resources/mapper/OrderdetailsMapper.xml"></mapper>
		<mapper resource="resources/mapper/CommodityMapper.xml"></mapper>

		<!--映射文件批量扫描,mapper映射文件 -->
		<!-- <package name="com.ncs.mapper" /> -->
	</mappers>

                     5.书写mapper.xml

<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ncs.mapper.UserMapper">

	<!--指定Mapper开启二级缓存 -->
	<!-- <cache></cache> -->

	<resultMap id="BaseResultMap" type="com.ncs.pojo.User">
		<!-- WARNING - @mbg.generated This element is automatically generated by 
			MyBatis Generator, do not modify. -->
		<result column="id" jdbcType="INTEGER" property="id" />
		<result column="u_name" jdbcType="VARCHAR" property="uName" />
		<result column="u_sex" jdbcType="CHAR" property="uSex" />
		<result column="u_age" jdbcType="INTEGER" property="uAge" />
		<result column="birthday" jdbcType="TIMESTAMP"
			property="birthday" />
		<result column="address" jdbcType="VARCHAR" property="address" />
		<result column="remark" jdbcType="VARCHAR" property="remark" />
	</resultMap>
	<sql id="Example_Where_Clause">
		<!-- WARNING - @mbg.generated This element is automatically generated by 
			MyBatis Generator, do not modify. -->
		<where>
			<foreach collection="oredCriteria" item="criteria"
				separator="or">
				<if test="criteria.valid">
					<trim prefix="(" prefixOverrides="and" suffix=")">
						<foreach collection="criteria.criteria" item="criterion">
							<choose>
								<when test="criterion.noValue">
									and ${criterion.condition}
								</when>
								<when test="criterion.singleValue">
									and ${criterion.condition} #{criterion.value}
								</when>
								<when test="criterion.betweenValue">
									and ${criterion.condition} #{criterion.value}
									and
									#{criterion.secondValue}
								</when>
								<when test="criterion.listValue">
									and ${criterion.condition}
									<foreach close=")" collection="criterion.value"
										item="listItem" open="(" separator=",">
										#{listItem}
									</foreach>
								</when>
							</choose>
						</foreach>
					</trim>
				</if>
			</foreach>
		</where>
	</sql>
	<sql id="Update_By_Example_Where_Clause">
		<!-- WARNING - @mbg.generated This element is automatically generated by 
			MyBatis Generator, do not modify. -->
		<where>
			<foreach collection="example.oredCriteria" item="criteria"
				separator="or">
				<if test="criteria.valid">
					<trim prefix="(" prefixOverrides="and" suffix=")">
						<foreach collection="criteria.criteria" item="criterion">
							<choose>
								<when test="criterion.noValue">
									and ${criterion.condition}
								</when>
								<when test="criterion.singleValue">
									and ${criterion.condition} #{criterion.value}
								</when>
								<when test="criterion.betweenValue">
									and ${criterion.condition} #{criterion.value}
									and
									#{criterion.secondValue}
								</when>
								<when test="criterion.listValue">
									and ${criterion.condition}
									<foreach close=")" collection="criterion.value"
										item="listItem" open="(" separator=",">
										#{listItem}
									</foreach>
								</when>
							</choose>
						</foreach>
					</trim>
				</if>
			</foreach>
		</where>
	</sql>
	<sql id="Base_Column_List">
		<!-- WARNING - @mbg.generated This element is automatically generated by 
			MyBatis Generator, do not modify. -->
		id, u_name, u_sex, u_age, birthday, address, remark
	</sql>
	<select id="selectByExample"
		parameterType="com.ncs.pojo.UserExample" resultMap="BaseResultMap">
		<!-- WARNING - @mbg.generated This element is automatically generated by 
			MyBatis Generator, do not modify. -->
		select
		<if test="distinct">
			distinct
		</if>
		<include refid="Base_Column_List" />
		from user
		<if test="_parameter != null">
			<include refid="Example_Where_Clause" />
		</if>
		<if test="orderByClause != null">
			order by ${orderByClause}
		</if>
	</select>
	<delete id="deleteByExample"
		parameterType="com.ncs.pojo.UserExample">
		<!-- WARNING - @mbg.generated This element is automatically generated by 
			MyBatis Generator, do not modify. -->
		delete from user
		<if test="_parameter != null">
			<include refid="Example_Where_Clause" />
		</if>
	</delete>
	<insert id="insert" parameterType="com.ncs.pojo.User">
		<!-- WARNING - @mbg.generated This element is automatically generated by 
			MyBatis Generator, do not modify. -->
		insert into user (id, u_name, u_sex,
		u_age, birthday, address,
		remark)
		values (#{id,jdbcType=INTEGER}, #{uName,jdbcType=VARCHAR},
		#{uSex,jdbcType=CHAR},
		#{uAge,jdbcType=INTEGER},
		#{birthday,jdbcType=TIMESTAMP}, #{address,jdbcType=VARCHAR},
		#{remark,jdbcType=VARCHAR})
	</insert>
	<insert id="insertSelective" parameterType="com.ncs.pojo.User">
		<!-- WARNING - @mbg.generated This element is automatically generated by 
			MyBatis Generator, do not modify. -->
		insert into user
		<trim prefix="(" suffix=")" suffixOverrides=",">
			<if test="id != null">
				id,
			</if>
			<if test="uName != null">
				u_name,
			</if>
			<if test="uSex != null">
				u_sex,
			</if>
			<if test="uAge != null">
				u_age,
			</if>
			<if test="birthday != null">
				birthday,
			</if>
			<if test="address != null">
				address,
			</if>
			<if test="remark != null">
				remark,
			</if>
		</trim>
		<trim prefix="values (" suffix=")" suffixOverrides=",">
			<if test="id != null">
				#{id,jdbcType=INTEGER},
			</if>
			<if test="uName != null">
				#{uName,jdbcType=VARCHAR},
			</if>
			<if test="uSex != null">
				#{uSex,jdbcType=CHAR},
			</if>
			<if test="uAge != null">
				#{uAge,jdbcType=INTEGER},
			</if>
			<if test="birthday != null">
				#{birthday,jdbcType=TIMESTAMP},
			</if>
			<if test="address != null">
				#{address,jdbcType=VARCHAR},
			</if>
			<if test="remark != null">
				#{remark,jdbcType=VARCHAR},
			</if>
		</trim>
	</insert>
	<select id="countByExample"
		parameterType="com.ncs.pojo.UserExample" resultType="java.lang.Long">
		<!-- WARNING - @mbg.generated This element is automatically generated by 
			MyBatis Generator, do not modify. -->
		select count(*) from user
		<if test="_parameter != null">
			<include refid="Example_Where_Clause" />
		</if>
	</select>
	<update id="updateByExampleSelective" parameterType="map">
		<!-- WARNING - @mbg.generated This element is automatically generated by 
			MyBatis Generator, do not modify. -->
		update user
		<set>
			<if test="record.id != null">
				id = #{record.id,jdbcType=INTEGER},
			</if>
			<if test="record.uName != null">
				u_name = #{record.uName,jdbcType=VARCHAR},
			</if>
			<if test="record.uSex != null">
				u_sex = #{record.uSex,jdbcType=CHAR},
			</if>
			<if test="record.uAge != null">
				u_age = #{record.uAge,jdbcType=INTEGER},
			</if>
			<if test="record.birthday != null">
				birthday = #{record.birthday,jdbcType=TIMESTAMP},
			</if>
			<if test="record.address != null">
				address = #{record.address,jdbcType=VARCHAR},
			</if>
			<if test="record.remark != null">
				remark = #{record.remark,jdbcType=VARCHAR},
			</if>
		</set>
		<if test="_parameter != null">
			<include refid="Update_By_Example_Where_Clause" />
		</if>
	</update>
	<update id="updateByExample" parameterType="map">
		<!-- WARNING - @mbg.generated This element is automatically generated by 
			MyBatis Generator, do not modify. -->
		update user
		set id = #{record.id,jdbcType=INTEGER},
		u_name =
		#{record.uName,jdbcType=VARCHAR},
		u_sex = #{record.uSex,jdbcType=CHAR},
		u_age = #{record.uAge,jdbcType=INTEGER},
		birthday =
		#{record.birthday,jdbcType=TIMESTAMP},
		address =
		#{record.address,jdbcType=VARCHAR},
		remark =
		#{record.remark,jdbcType=VARCHAR}
		<if test="_parameter != null">
			<include refid="Update_By_Example_Where_Clause" />
		</if>
	</update>
</mapper>


         4.Mybatis关于Mapper接口方法只能存在一个参数的解决方案:
               1.由于mapper文件只能设置一个ParameterType,参数一个的情况下,用户可以采用将多参数封装成一个Pojo(包装类)来实现多参数的解决。
               2.注意:业务层(Service)中不推荐使用包装类pojo,这样不利于业务层的维护。

猜你喜欢

转载自blog.csdn.net/Stephen_mu/article/details/88304616