侧边栏壁纸
博主头像
coydone博主等级

记录学习,分享生活的个人站点

  • 累计撰写 306 篇文章
  • 累计创建 51 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Mybatis参数深入

coydone
2022-03-08 / 0 评论 / 0 点赞 / 348 阅读 / 5,817 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-04-10,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

parameterType配置参数

SQL语句传参,使用标签parameterType属性来设定。该属性的取值可以是基本类型,引用类型(例如:String 类型),还可以是实体类类型(POJO 类)。同时也可以使用实体类的包装类。

基本类型和String我们可以直接写类型名称,也可以使用 包名.类名 的方式,例如:java.lang.String。实体类类型,目前我们只能使用全限定类名。

究其原因,是Mybaits在加载时已经把常用的数据类型注册了别名,从而我们在使用时可以不写包名,而我们的是实体类并没有注册别名,所以必须写全限定类名。

传递 POJO 包装对象

开发中通过 POJO 传递查询条件 ,查询条件是综合的查询条件,不仅包括用户查询条件还包括其它的查询条件(比如将用户购买商品信息也作为查询条件),这时可以使用包装对象传递输入参数。POJO 类中包含 POJO 。

需求:根据用户名查询用户信息,查询条件放到 QueryVo 的 User 属性中。编写 QueryVo

public class QueryVo implements Serializable {
    private User user;
    public User getUser() {
        return user;
    }
    public void setUser(User user) {
        this.user = user;
    }
}

编写持久层接口

//根据 QueryVo 中的条件查询用户
List<User> findByVo(QueryVo vo);

持久层接口的映射文件

<!-- 根据用户名称模糊查询,参数变成一个 QueryVo 对象了 -->
<!-- namespace指定命名空间,一般为Dao层接口的限定名 -->
<!-- namespace命名空间 防止sql语句的id重名
      namespace 命名 包名+类名/包名+mapper文件名
      parameterType 指sql语句参数类型
      resultType 返回结果类型
      useGeneratedKeys="true" 使用自增主键
  -->
<mapper namespace="com.coydone.dao.UserDao">
    <select id="findByVo" resultType="com.coydone.domain.User"
            parameterType="com.coydone.domain.QueryVo">
        select * from user where username like #{user.username};
    </select>
</mapper>    

测试包装类作为参数

@Test
public void testFindByQueryVo() {
    QueryVo vo = new QueryVo();
    User user = new User();
    user.setUserName("%王%");
    vo.setUser(user);
    List<User> users = userDao.findByVo(vo);
    for(User u : users) {
        System.out.println(u);
    }
}

resultType配置结果类型

resultType属性可以指定结果集的类型,它支持基本类型和实体类类型。它和 parameterType 一样,如果注册过类型别名的,可以直接使用别名。没有注册过的必须使用全限定类名。例如:我们的实体类此时必须是全限定类名。

同时,当是实体类名称时,还有一个要求,实体类中的属性名称必须和查询语句中的列名保持一致,否则无法实现封装。

基本类型示例

int findTotal();
<!-- 查询总记录条数 -->
    <select id="findTotal" resultType="int">
    select count(*) from user;
</select>

实体类类型示例

List<User> findAll();
<!-- 配置查询所有操作 -->
<select id="findAll" resultType="com.coydone.domain.User">
    select * from user
</select>

当实体类属性和数据库表的列名已经不一致时:

1、使用别名查询:

<!-- 配置查询所有操作 -->
<select id="findAll" resultType="com.coydone.domain.User">
select id as userId,username as userName,birthday as userBirthday,sex as userSex,address as userAddress from user
</select>

2、使用resultMap结果类型

resultMap标签可以建立查询的列名和实体类的属性名称不一致时建立对应关系。从而实现封装。在select标签中使用resultMap属性指定引用即可。同时resultMap 可以实现将查询结果映射为复杂类型的 pojo,比如在查询结果映射对象中包括 pojo 和 list 实现一对一查询和一对多查询。

3、ResultMap标签自定义返回结果类型(用在返回复杂结构)

示例:执行查询时使用ResultMap属性返回结果

注意:查询持久化操作resultType和resultMap两个属性不能同时存在,推荐使用resultType属性。

resultType指定返回实体的属性必需要与表的字段名称相同才返回获取结果。

resultMap指定自定义返回结果(指定属性列的对应关联)

<!-- 建立 User 实体和数据库表的对应关系
    type 属性:指定实体类的全限定类名
    id 属性:给定一个唯一标识,是给查询 select 标签引用用的。
    id 标签:用于指定主键字段
    result 标签:用于指定非主键字段
    column 属性:用于指定数据库列名
    property 属性:用于指定实体类属性名称
-->
    <resultMap type="com.coydone.domain.User" id="userMap"> <id column="id" property="userId"/>
    <result column="username" property="userName"/>
    <result column="sex" property="userSex"/>
    <result column="address" property="userAddress"/>
    <result column="birthday" property="userBirthday"/>
</resultMap>

映射配置

<!-- 配置查询所有操作 -->
<select id="findAll" resultMap="userMap">
    select * from user
</select>

mybatis定义内置的java类型别名

内置类型别名      java类型
_int            int
_short          short
_long           long
_float          float
int             java.lang.Integer
float           java.lang.Float
double          java.lang.Double
list            java.uitl.List
arraylist       java.uitl.ArrayList
map             java.uitl.Map

SqlMapConfig.xml配置文件

SqlMapConfig.xml中配置的内容和顺序:

properties(属性)
    property
settings(全局配置参数)
    setting
typeAliases(类型别名)
    typeAliase
    package
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境集合属性对象)
    environment(环境子属性对象)
        transactionManager(事务管理)
        dataSource(数据源)
mappers(映射器)
    mapper
    package

properties标签配置

在使用 properties 标签配置时,我们可以采用两种方式指定属性配置。

第一种

<properties>
    <property name="jdbc.driver" value="com.mysql.jdbc.Driver"/>
    <property name="jdbc.url" value="jdbc:mysql://localhost:3306/eesy"/>
    <property name="jdbc.username" value="root"/>
    <property name="jdbc.password" value="root123"/>
</properties>

第二种:在 classpath(类路径)下定义 jdbcConfig.properties 文件

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/eesy
jdbc.username=root
jdbc.password=root123

properties标签配置

<properties resource="jdbcConfig.properties">
</properties>

此时我们的dataSource标签就变成了引用上面的配置。

<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>

typeAliases(类型别名)

自定义别名,在 SqlMapConfig.xml 中配置:

<typeAliases>
    <!-- 单个别名定义 -->
    <typeAlias alias="user" type="com.coydone.domain.User"/>
    <!-- 批量别名定义,扫描整个包下的类,别名为类名(首字母大写或小写都可以) -->
    <package name="com.coydone.domain"/>
    <package name="其它包"/>
</typeAliases>

mappers(映射器)

<mapper resource=" " />
使用相对于类路径的资源
如:<mapper resource="com/coydone/dao/IUserDao.xml" />
<mapper class=" " />
使用 mapper 接口类路径
如:<mapper class="com.coydone.dao.UserDao"/>
注意:此种方法要求 mapper 接口名称和 mapper 映射文件名称相同,且放在同一个目录中。
<package name=""/>
注册指定包下的所有 mapper 接口
如:<package name="com.coydone.dao"/>
注意:此种方法要求 mapper 接口名称和 mapper 映射文件名称相同,且放在同一个目录中。

SQL片段

SQL片段,常用于提高SQL的复用性。

<!-- 定义sql片段 -->
<sql id="selectUser">
    select * from User 
</sql>
<!-- 查询某个用户的详细信息 -->
<select id="selectUserById" parameterType="java.lang.Integer" 
        resultType="com.bjsxt.pojo.User">
    <!-- select * from user where uid=${value}-->
    <!-- 引用sql片段 -->
    <include refid="selectUser"></include>
    where pid=${value}  
</select>
0

评论区