框架(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>
逆向工程
以后补充