Mybatis学习

本文介绍了MyBatis的基本配置流程,包括SqlMapConfig.xml全局配置文件的详细解析,SqlSessionFactory与SqlSession的创建过程,以及如何通过Mapper接口和XML映射文件实现数据库操作。此外,还探讨了一级缓存和二级缓存的使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

框架(Mybatis主要精力在sql上)

1、SqlMapConfig.xml(名称不固定)是mybatis的全局配置文件,配置了数据源,事务等。还配置了mapper.xml(表和类的映射关系) <typeAliases 可以指定Mapper.xml中的parameterType和resultType的类型

<?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"/>
	<environments default="development">
		<environment id="development">
			<!-- 事务控制,由Mybatis提供 ,和Spring整合后,由spring提供-->
			<transactionManager type="JDBC" />
			<!-- 配置数据库连接信息,由Mybatis提供 ,和spring整合后,由第三方提供 -->
			<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/wxg/model/user.xml" />
		<mapper resource="com/wxg/mapper/UserMapper.xml" />
	</mappers>
</configuration>

2、根据上述配置文件生成SqlSessionFactory(会话工厂)(用于创建SqlSession)

3、SqlSession(会话),用于操作数据库,发出crud的SQL。

4、通过Executor(执行器是接口,两个实现基本执行器,缓存执行器)操作数据库。(SqlSession通过Executor操作数据库)。

5、mappedstatement(底层封装对象),对数据库存储封装,包括sql语句,输入参数,输出结果类型。对数据进行操作。

输入类型可以是 java简单类型,List Map,pojo等。

输出类型也可以是 java简单类型,List Map,pojo等。

映射文件

在映射文件中配置sql语句

两种形式 1、原始的ibatis方式开发Dao 接口和DaoImpl   

<?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">
<mapper namespace="test"><!-- 随意起名,如果使用代理mapper则需要按照规则 -->
	<!-- 在select标签中编写查询的SQL语句, 设置select标签的id属性为getUser,id属性值必须是唯一的,不能够重复,
使用parameterType属性指明查询时使用的参数类型(#{}里面的内容简单类型随意),resultType属性指明查询返回的结果集类型 
		resultType="me.gacl.domain.User"就表示将查询结果封装成一个User类的对象返回 User类就是users表所对应的实体类 -->
	<select id="getUser" parameterType="int" resultType="com.itcast.model.User">
		select * from t_user where id=#{id}
	</select>
	<update id="updateUserById" parameterType="com.itcast.model.User">
		update t_user set username=#{username},password=#{password} where id = #{id}
	</update>
</mapper>

 Test程序

        InputStream inputStream = MyBatisTest.class.getClassLoader().getResourceAsStream("SqlMapConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        String statement = "test.getUser";//映射sql的标识字符串,第一个参数namespace+"."+id,第二个参数匹配类型,返回值匹配返回值
        User user = session.selectOne(statement, 1);
        session = sqlSessionFactory.openSession();
        System.out.println(user.getUsername()+":"+user.getPassword());
      session.close();

2、采用Mapper接口方式

需要编写UserMapper接口(相当于dao接口)

package com.itcast.mapper
import java.util.List;
import com.wxg.model.User;
public interface UserMapper {
	public User getUser(int id);	
 	public void updateById(User user);//参数只能有一个,可以使用包装类型的。service层不用包装类型
}

需要UserMapper.xml映射文件。返回值可以是resultType 和resultMap(可实现懒加载)

<?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">
<mapper namespace="com.wxg.security.mapper.UserMapper"><!--要等于接口名 下面的函数名返回值参数也要一致-->
	
	<resultMap type="com.wxg.security.model.User" id="userList">
		<id column="id" property="id"/>
		<result column="username" property="username"/>
		<result column="password" property="password"/>
		<result column="accountNonExpired" property="accountNonExpired"/>
		<result column="accountNonLocked" property="accountNonLocked"/>
		<result column="credentialsNonExpired" property="credentialsNonExpired"/>
		<result column="enabled" property="enabled"/>
	</resultMap>
	
	<resultMap type="com.wxg.security.model.User" id="userRolesList" extends="userList">
		<collection property="roles" ofType="com.wxg.security.model.Role">
			<id column="did" property="id"/>
			<result column="roleName" property="roleName"/>
			<result column="descs" property="descs"/>
		</collection>
	</resultMap>
	
	<sql id="superQuery">
		<if test="username!=null and username!=''">
			and username like '%${username}%'
		</if>
		<if test="password!=null and password!=''">
			and password = #{password}
		</if>
		<if test="enabled!=null and enabled!=''">
			and enabled = #{enabled}
		</if>
		<foreach collection="ids" item="id" open="AND id in (" close=")" separator=",">
			#{id}
		</foreach>
	</sql>	
	<select id="getUserById" parameterType="int" resultType="com.wxg.security.model.User">
		select * from t_user where id=#{id}
	</select>
	<update id="updata" parameterType="com.wxg.security.model.User">
		update t_user set username=#{username},password=#{password} where id = #{id}
	</update>
	<select id="getUserByUsername" parameterType="string" resultMap="userRolesList">
		select a.*,b.id did,b.roleName,b.descs from t_user a,t_role b,t_user_role c
		where a.id=c.user_id and c.role_id=b.id and a.username=#{value}
	</select>
	<select id="getUserByNameAndIds" parameterType="com.wxg.security.mapper.UserQuery" resultMap="userList">
		select * from t_user 
		<where>
			<include refid="superQuery"></include>
		</where>
	</select>
</mapper>

输入映射和输出映射

输入设置,定义高级查询类

public class UserQuery extends User{
	List<Integer> ids = new ArrayList<Integer>();
}

输出映射设置resultMap(其中一对一可以使用resultType)

延迟加载

一级缓存

sqlSession级别的缓存区(hashMap),相互不影响。是默认支持的。

一般事务都在service级别,同一个service使用一级缓存。

sql.commit()操作,会清空sqlSession的一级缓存,避免脏读。

二级缓存

开启二级缓存<settings><setting name=“cacheEnabeld”value="true"></settings>

是mapper级别的缓存。多个sqlSession共享。

开区本mapper中的二级缓存<cache/>

Spring整合Mybatis

需要整合包 spring-mybatis.jar

需要spring管理sqlSessionFactory的单例模式。在applicationContext.xml配置中

<context:property-placeholder location="classpath:config.properties" ignore-unresolvable="true"/>
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="${driver}"/>
        <property name="url" value="${url}"/>
        <property name="username" value="${username}"/>
        <property name="password" value="${password}"/>
        <!-- 初始化链接大小 -->
        <property name="initialSize" value="${initialSize}"/>
        <!-- 连接池最大数量 -->
        <property name="maxActive" value="${maxActive}"/>
       <!--  连接池最大空闲 -->
        <property name="maxIdle" value="${maxIdle}"/>
       <!--  连接池最小空闲 -->
        <property name="minIdle" value="${minIdle}"/>
        <!-- 获取链接最大等待时间 -->
        <property name="maxWait" value="${maxWait}"/>
    </bean>
<!-- 使用sqlSessionFactory创建sqlSession。-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <!-- 自动扫描mapping.xml 如果mapper.xml和Mapper.java在同一个包可省略-->
        <property name="mapperLocations" value="classpath:mapperXML/*Mapper.xml"/>
    </bean>
    <!-- 持久层的maaper都需要spring管理。-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.wxg.security.mapper"/>
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
    </bean>

逆向工程

以后补充

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值