MyBatis的增删改查的那些事

前言

(未完结)

Mybatis 的 insert、update、delete 可以返回的类型有:Integer、Long、Boolean(true 为成功,false 为失败)。

正文

1、增加数据

<!-- 
    获取插入的自增类型的主键的值需要设置useGeneratedKeys="true",
    然后用 keyProperty 来说明这个主键对应的是该对象的哪个属性,
    执行完插入之后这个主键的值便会被设置到改对象的这个属性里面去
-->
<insert id="insertUser" parameterType="user" useGeneratedKeys="true" keyProperty="id">
    insert into user(
        name,dept,website,phone
    ) values (
        #{name},#{dept},#{website},#{phone}
    )
</insert>


<!-- 
    下面这个是获取 oracle 数据库的自增序列的操作
    keyProperty和上个数据说明一样
    order="BEFORE" 指查询 selectKey 在插入语句之前执行
    order="AFTER" 和上面那个相反,作为了解!主用 BEFORE
    resultType="Integer" 是指定查出来的序列是什么类型,需要对应成 javaBean 的主键类型
 -->
<insert id="insertUser">

    <!-- 以下是 order="before" 的操作 -->
    <selectKey keyProperty="id" order="BEFORE" resultType="Integer">
        select USER_SEQ.nextval from dual
    </selectKey>
    insert into user(
        id,name,dept,website,phone
    ) values (
        #{id},#{name},#{dept},#{website},#{phone}
    )
    <!-- 以上是 order="before" 的操作 -->

    <!-- 以下是 order="after" 的操作 -->
    <selectKey keyProperty="id" order="AFTER" resultType="Integer">
        select USER_SEQ.currval from dual
    </selectKey>
    insert into user(
        id,name,dept,website,phone
    ) values (
        USER_SEQ.nextval,#{name},#{dept},#{website},#{phone}
    )         
    <!-- 以上是 order="after" 的操作 -->

</insert>

2、查询数据

①、一对一

<!-- 
    查询条件仅单个参数的时候
        随便用什么名字都可以进行取值,如下面的anyIdName
    查询条件有多个参数的时候
        需要用@Param来标注该参数在 mapper.xml 里面怎么去取对应的值
        或者使用POJO/Map来进行传参,以下简单写一个Map的样例
    PS:
        1、如果多个参数刚好是我们的业务逻辑的数据模型的话建议直接用POJO
        2、如果不是我们业务逻辑的数据模型,没用对应的POJO,不经常使用的话,为了方便,也可以使用Mop
        3、如果不是我们业务逻辑的数据模型,但是经常要用,推荐编写一个TO(Transfer Object) 数据传输对象
        如Page{
            int index;
            int size;
        }
-->
class UserService(){
    public void method(){
        Map map = new HashMap();
        map.put("id",1);
        map.put("username","xy");
        //...获取 mapper 的代码
        userMapper.getUserByMap(map);
    }
}

interface UserMapper{
    public User getUserById(Integer id);
    public User getUserByIdAndName(@Param("id") Integer id,@Param("username")String username);
    public User getUserByMap(Map map);
    public User getUserByIdAndName_user(@Param("id") Integer id,@Param("user") User user);
    public User getUserById_List(List<Integer> ids);
    public List<User> getAllUsers();
    //返回 map,key 为 字段名 value为值
    public Map<String,Object> getUserByIdReturnMap(Integer id);
    //返回 map,key 为主键 value为封装后的javaBean
    @MapKey("id") //告诉 mybatis 哪个字段作为 key
    public Map<Integer,User> getAllUsersReturnMap();
}

<select id="getUserById" resultType="user">
    select * from user where id=#{anyIdName}
</select>

<select id="getUserByIdAndName" resultType="user">
    select * from user where id=#{id} and username=#{username}
</select>

<select id="getUserByMap" resultType="user">
    select * from user where id=#{id} and username=#{username}
</select>

<select id="getUserByIdAndName_user" resultType="user">
    select * from user where id=#{id} and username=#{user.username}
</select>

<select id="getUserById_List" resultType="user">
    <!-- 获取第一个 id -->
    select * from user where id=#{list[0]}
</select>

<!-- 当返回的是一个集合的时候,resultType 要写集合中元素的类型
<select id="getAllUsers" resultType="user">
    select * from user
</select>

②、多对一

多个人对应同一个部门

class User{
    private int id;
    private String userName;
    private Dept dept;    //实际user表存的是 部门表的 id 字段为 dept_id 
    //...省略getter&setter方法
}

class Dept{
    private int id;
    private String deptName;
    //...省略getter&setter方法
}

interface UserMapper{
    public User getUsersAndDept(int id);
}
interface DeptMapper{
    public Dept getDept(int id);
}

<resultMap id="resultUsersAndDeptMap" type="xx.xx.xx.User">
    <id column="id" property="id" />
    <result column="userName" property="user_name" />

    <!-- 封装 dept 方式一 -->
    <!-- 
        property="dept" 指定联合的对象
        javaType 指定属性对象的类型
     -->
    <association property="dept" javaType="xx.xx.xx.Dept">
        <id column="did" property="id"/>
        <result column="dept_Name" property="deptName"/>
    </association>

    <!-- 封装 dept 方式二 -->
    <result column="did" property="dept.id">
    <result column="dept_name" property="dept.deptName">

    <!-- 封装 dept 方式三 -->
    <!-- 
        其实多对一也可以分步查询,也可以先通过 userId 查询用户信息,然后通过查出来的 deptId 查询部门信息。
        这样可以使用懒加载懒加载需要配置setting,如下:
        <settings>
            <setting>
                <setting name="lazyLoadingEnabled" value="true" />
                <setting name="aggressiveLazyLoading" value="fasle" />
            </setting>
        </settings
    -->
    <association property="dept"
            select="xx.xx.xx.DeptMapper.getDept"
            column="dept_id"
        >
    </association>
</resultMap>

<!-- UserMapper.xml -->
<select id="getUsersAndDept" resultType="resultUsersAndDeptMap">
    select u.*,d.id did,d.dept_name from user u,dept d where u.dept_id = d.id and u.id=#{id} 
</select>

<select id="getUserOnly" resutlType="xx.xx.xx.User">
    select * from user where id=#{id}
</select>

<!-- DeptMapper.xml -->
<select id="getDept" resultType="xx.xx.xx.Dept">
    select * from dept where id=#{id}
</select>

③、一对多

class User{
    private int id;
    private String userName;
    private Dept dept;    //实际user表存的是 部门表的 id 字段为 dept_id 
    //...省略getter&setter方法
}

class Dept{
    private int id;
    private String deptName;
    private List<User> users;
    //...省略getter&setter方法
}

interface UserDao{
    public User getUsersAndDept(int id);
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值