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