企业开发模式

1.企业开发模式

真实在企业开发中我们需要写dao接口。而不是使用mybatis--sqlSession类中自带的方法。

创建Dao接口

每个表对应一个Dao接口。

public interface UserDao {
    /**
     * 根据id查询用户信息
     * @param id
     * @return
     */
    public User getById(int id);
}

创建映射文件

<?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.ykq.dao.UserDao">

    <!--id必须和UserDao接口中的方法名一致-->
    <select id="getById" resultType="com.ykq.entity.User">
        select * from t_user where id=#{id}
    </select>
</mapper>

测试类

public class TestUserDao {

    @Test
    public void testGetById() throws Exception {
        Reader resourceAsReader = Resources.getResourceAsReader("mybatis.xml");
        SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(resourceAsReader);
        SqlSession sqlSession = sqlSessionFactory.openSession();

        //获取UserDao接口的代理实现类。
        UserDao userDao = sqlSession.getMapper(UserDao.class);

        User user = userDao.getById(3);
        System.out.println(user);
    }
}

注意: namespace必须和接口绑定 id必须和方法对应 否则出现如下错误

安装mybatisX的插件

2.传递多个参数

默认mybatis为多个参数 起的名称param1 param2 .... 如果不想使用它默认的名称 我们则可以使用@Param("名称")注解。

3.映射文件中包含特殊字符

使用<=时候出现了语法问题。

解决方案有两种

第一种使用转义符。

第二种方案:

把有特殊字符的sql语句

 <select id="selectByAge" resultType="com.ykq.entity.User">
       <![CDATA[select * from t_user where  age >=#{min} and age <=#{max}]]>
    </select>

4.使用lombok插件

无需自己写get set toString 构造

引入lombok依赖

 <!--lombok依赖-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.24</version>
        </dependency>

使用lombok的注解

5.模糊查询如何使用

concat() 函数 字符串拼接

7.如何解决列名和属性名不一致问题。

因为列名和属性名不一致导致问题

解决方案有两种:

第一种: 查询时为列名起别名--别名和属性名一致。

第二种: 使用resultMap 属性

该属性可以完成列名和属性名之间的映射。

注意: resultMap属性和resultType属性不能同时出现。

8.完成多表联合查询。

需求: 查询学生信息时,携带该学生所在的班级信息。

分析: 在设计表的时候,通过外键建立这两张表的关联关系。

创建实体类如何体现这两个实体类的关系呢。

8.1多对一实现方式

班级实体类

@Data
public class Clazz {
    private Integer cid;
    private String cname;
}

学生实体类

@Data
public class Student {
    private Integer sid;
    private String stuName;
    private Integer age;
    private Integer classId;
    //该学生所在的班级信息。 多对一。
    private Clazz clazz;
}

映射文件

<?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.ykq.dao.StudentDao">


    <select id="getById" resultMap="studentMap">
        select * from t_student s join t_class c on s.class_id=c.cid where sid=#{id}
    </select>

    <resultMap id="studentMap" type="com.ykq.entity.Student" autoMapping="true">
        <id column="sid" property="sid"/>
        <result column="stu_name" property="stuName"/>
        <result column="class_id" property="classId"/>
        <!--association:表示多对一
              property:表示一的一方属性名
              javaType:表示一的一方的属性类型
        -->
        <association property="clazz" javaType="com.ykq.entity.Clazz" autoMapping="true">
             <id column="cid" property="cid"/>
        </association>
    </resultMap>
</mapper>

8.2一对多实现方式【了解】

需求: 查询班级信息---携带该班级下的所有学生

班级实体类

classMapper

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值