一、DAO传统开发模式
步骤:
1、创建全局配置文件
2、创建映射文件
3、将映射文件加载到全局配置文件
4、使用
SqlSessionFactoryBuilder() --> SqlSessionFactory() --> SqlSession
全局配置文件中加载映射配置文件
<!--resource: 映射文件的全路径-->
<mapper resource = "../..xml" />
<!-- 配置自定义类型别名
type:本来的类型
alias:别名
<package name=""/>批量扫描某一个包:如果是批量配置别名那么别名就是类名
并且首字母大写或小写都可以
-->
<typeAliases>
<!-- <typeAlias type="com.wtu.entity.User" alias="user"/> -->
<package name="com.wtu.entity"/>
</typeAliases>
映射文件
<mapper namespace = "namespace">
<select/update/insert/delete id = "ID" parameterType="Class" resultType="Class">
SQL 语句 eg:select * from user where id = #{id}
</select/update/insert/delete>
</mapper>
注:#{} 表示一个占位符 ${}表示一个连接符,连接字符串
parameterType、resultType为类的全名或别名
当resultType为自定义Class时,数据库返回的结果集以Class中set方法后面的名称对对象属性进行赋值
使用:
//获取全局文件输入流对象
InputStream in = Resource.getResourceAsStream("全局配置文件的路径");
//获取SqlSessionFactory对象
SqlSessionFactory factory = new SqlSessionFactoryBuilder().builder(in);
//得到SqlSession对象
SqlSession session = factory.openSqlSession();
//执行Sql语句
session.selectOne("namespace.ID",(Object)parameter);
session.selectList("namespace.ID",(Object)parameter);
session.delete("namespace.ID",(Object)parameter);
session.update("namespace.ID",(Object)parameter);
session.insert("namespace.ID",(Object)parameter);
二、Mapper 代理模式开发DAO
要点
1、映射文件的namespace为Mapper接口的全路径
2、Mapper接口中的方法名必须与映射文件在中SQL语句保持一致
3、Mapper接口中方法返回值类型必须与SQL语句中resultType一致
当接口返回值为List时,resultType与List中的元素类型一致
4、接口中方法的参数类型必须与SQL语句的parameterType一致
使用
SqlSession session = factory.openSqlSession();
/*通过SqlSession对象得到Mapper接口的一个代理对象
参数是Mapper接口的类型*/
MapperInterface mapperInterface = session.getMapper(MapperInterface.Class);
然后可以使用mapperInterface对象调用接口中方法
Mappers
用来在全局配置文件中加载映射文件
注意: 通过mapper接口来加载
1、映射文件的文件名必须与mapper接口名相同
2、映射文件和Mapper接口在同一目录下
3、这种方式只适合mapper代理开发模式
eg:<mapper class = "com.hust.mapper.UserMapper"/>
批量加载映射文件
注意:批量加载映射文件 自动取扫描一个包,将该包下的所有映射文件加载到全局配置文件
1、映射文件的文件名必须与mapper接口名相同
2、映射文件和Mapper接口在同一目录下
3、这种方式只适合mapper代理开发模式
eg: <package name="com.hust.mapper">
三、高级应用
<when> <if> <foreach> 连接
<select/update/insert/delete id="methodName" parameterType="Class" resultMap="resultMapID">
select * from Table where id = #{id}
<when> <!-- 当条件不满足时,<when>自动删除多余的连接词-->
<if test="condition1">
and ......
</if>
<if test = "condition2">
and ......
</if>
<if test = "list != null">
<foreach collection="list" open="" close="" separater="" item="item">
#{item}
</foreach>
</if>
</when>
</select/update/insert/delete>
属性值:test: true false
<resultMap>
<resultMap type="Class" id = "resultMapID" >
<id column="_id" property="property1"/> <!-- 每行记录的唯一标识符-->
<result column="column2" property="property2" >
<result column="column3" property="property3"/>
</resultMap>
自己编写结果集映射
column:数据库返回的列名
property:对象的属性名
resultMap:一对多或多对多的查询中,必须使用它为查询结果的类型
一对一
Class1与Class2为一对一的关系
Class1成员变量: Class2 class2;
二者连接查询结果
<resutlMap type="Class1" id="resutlMapID">
<id column="columnID" property="ClassProperty1">
<result column="column2" property="Class1Property2"/>
<result column="column3" property="Class1Property3"/>
<association property="class2" javaType="Class2"> <!-- 一对一 -->
<id column="columnID" property="Class2Property1">
<result column="column2" property="Class2Property2"/>
<result column="column3" property="Class2Property3"/>
<associaton/>
</resultMap>
id:唯一标识一行
一对多
Class1与Class2为一对的多关系
Class1成员变量: List<Class2> class2List;
二者连接查询结果
<resultMap type="CLass1" id="ResultMapID">
<id column="columnID" property="Class1Property1">
<result column="column2" property="Class1Property2">
<result column="column3" property="Class1Property3">
<collecttion property="class2List" ofType="CLass2"> <!-- ofType集合中元素的类型-->
<id column="columnID" property="Class1Property1">
<result column="column2" property="Class2Property2">
<result column="column3" property="Class2Property3">
</collection>
</resutlMap>
id:唯一标识一行
多对多:在局部是一对多
注意:
<association property="" javaType="">
<collection property="" ofType="">
网友评论