Mybatis的实际应用

目录

1.mybatis的企业开发模式

如何实现企业开发模式

 2.传递多个参数

3.添加时如何返回递增的主键值

4.解决列名和属性名不一致


1.mybatis的企业开发模式

使用SqlSession封装的一些方法可以完成crud操作,但是SqlSession封装的方法,传递的参数statement, 传递占位符的参数只能传递一个。而且他的方法名称都是固定。而真实在开发环境下我们不使用SqlSession封装的方法,而是习惯自己定义方法,自己调用自己的方法。

如何实现企业开发模式

1.创建dao接口并定义所需要实现的方法

public interface UserDao {
    //定义查询所有方法
    public List<User> findAll();
}

2.创建映射文件

此处的名命空间必须和dao层中的接口类名相同

<?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">
<!--namespace:命名空间
       必须和dao相同
-->
<mapper namespace="com.zjw.dao.UserDao">
    <select id="findAll" resultType="com.zjw.entity.User">
        select * from tb_user
    </select>
</mapper>

3.测试

@Test
    public void testFindAll() throws Exception{
        Reader resourceAsReader = Resources.getResourceAsReader("mybatis.xml");
        SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(resourceAsReader);
        SqlSession session=factory.openSession();
		//获取相应接口的代理对象
        UserDao userDao=session.getMapper(UserDao.class);
        //执行接口中的方法,会调用映射文件中的对应sql语句
        List<User> list = userDao.findAll();
        System.out.println(list);
        session.commit();
        session.close();
    }

 2.传递多个参数

我们在dao接口中某些方法可能需要传递多个参数,例如:实现登录功能(传入username,password)

此时我们就可以通过@Param注解来为参数起名,用于对应。

//dao中的内容
public interface UserDao {
     
     User login(@Param("userName") String userName,@Param("userPassword") String userPassword);
    
}
//mapper映射问件中的内容

    <select id="login"  resultMap="loginMap">
        select * from user where  user_name=#{userName} and user_password=#{userPassword}
    </select>

3.添加时如何返回递增的主键值

<!--添加用户
          useGeneratedKeys:设置使用生成的主键
          keyProperty: 赋值给哪个属性
    -->
    <insert id="addUser" parameterType="com.zjw.entity.User"
            useGeneratedKeys="true" keyProperty="userId">
          insert into tb_user values(null,#{userName},#{realName})
    </insert>

4.解决列名和属性名不一致

我们在执行查询相关的功能时,可能会遇到返回一个null或某列没有值的情况,出现问题的原因就在于表中的列名与我们实体类中的属性名不一致。

可以有两种解决办法:

第一种: 为查询的列起别名,而别名和属性名一致。

<!--根据id查询学生信息-->
    <select id="findOne" resultType="com.zjw.entity.Student">
        select stu_id id,stu_name name,stu_age age from tb_stu where stu_id=#{id}
    </select>

第二种: 使用resultMap完成列和属性之间的映射关系。

<resultMap id="StuMapper" type="com.zjw.entity.Student">
         <!--主键的映射关系 column:列名 property:属性名-->
         <id column="stu_id" property="id"/>
         <!--普通列的映射关系-->
         <result column="stu_name" property="name"/>
         <result column="stu_age" property="age"/>
    </resultMap>

 <!--resultType和ResultMap二者只能用一个-->
    <select id="findOne" resultMap="StuMapper">
        select * from tb_stu where stu_id=#{id}
    </select>

5.联表查询

 多对一 : 从多的一方来查询一的一方。

根据学生id查询学生信息并携带班级信息。

select * from tb_stu s join tb_class c on s.class_id=c.cid where stu_id=1

首先看实体类的创建


@Data
@NoArgsConstructor
@AllArgsConstructor
public class Student {
    private int id;
    private String name;
    private int age;
    private String sex;
    private Integer classId;

    private ClassRoom classroom;//学生所属的班级
}
//如何把联表查询体现到实体类上。
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ClassRoom {
    private Integer cid;
    private String cname;

}

再来看映射文件

<resultMap id="baseMap" type="com.zjw.entity.Student">
            <id column="stu_id" property="id"/>
            <result column="stu_name" property="name"/>
            <result column="stu_age" property="age"/>
            <result column="sex" property="sex"/>
            <result column="class_id" property="classId"/>
            <!--association: 表示一的一方
                 property: 它表示属性名
                 javaType: 该属性名对应的数据类型
            -->
            <association property="clazz" javaType="com.zjw.entity.ClassRoom">
                <id column="cid" property="cid"/>
                <result column="cname" property="cname"/>
            </association>
    </resultMap>
    <select id="findStudentById" resultMap="baseMap">
         select * from tb_stu s join tb_class c on s.class_id=c.cid where stu_id=#{id}
    </select>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值