目录
想查询student并且查询student所选择的专业major
想查询专业major并且查询该专业被哪些学生student选择
1.单表查询
在AdminDao类中写该方法
//根据id查询管理员对象
Admin findAdminById(int id);
在AdminMapper.xml文件中写相应的SQL语句
<select id="findAdminById" parameterType="int" resultType="Admin">
select * from admin where id = #{id}
</select>
在测试类的main方法中调用该方法,传入想要查询的管理员的信息(比如我们要查询id=1的管理员的信息)
此时数据库中id=1的数据如下
结果查询正确
若此时在数据库中新增一列admin_age年龄,在idea的Admin方法中新增一个adminAge的属性,则查询时不会查询出adminAge的值,因为数据库和java对于年龄的命名方式不同,他们两个都严格使用了他们的命名规范,所以怎么解决这一问题呢?
如果java中使用 标准驼峰命名 ,数据库中使用 下划线连接命名 ,可以开始全局设置实现自动转换<setting name="mapUnderscoreToCamelCase" value="true"/>
在mybatis.xml文件中配置全局设置实现自动转换,这样就可以解决命名的问题啦
此时数据库中id=1的数据如下
结果查询正确 ,包含年龄的值
2.多表查询
在mysql中创建两张表,一个student学生表,一个major专业表,想要通过传入学生student的id来查询学生的姓名、性别、学号和该学生选择的专业
接着在idea中创建student和major类,在两个类中设置相关的属性,并生成set,get方法
其中Student类中要传入专业Major的类
Major类中要传入Student类的集合(因为一个专业可以被多个学生选,而一个学生只能选择一个专业)
接着还是环境的搭建的步骤:
具体可以看我之前写过的文章http://t.csdnimg.cn/pl52Khttp://t.csdnimg.cn/pl52K
在dao包下创建StudentDao接口,创建对应的sql映射文件StudentMapper.xml,并配置接口地址到映射文件StudentMapper.xml中(其他的基本和之前创建的AdminMapper.xml文件一样)
在mybatis.xml文件配置sql映射文件
接着就可以写方法进行查询了操作啦! ! !
想查询student并且查询student所选择的专业major
①通过id查一个
在StudentDao类中写该方法
//通过id查一个
Student findStudentById(int id);
在StudentMapper.xml文件中写相应的SQL语句
因为是多表查询所以不用再传入resultType了,但是要传入resultMap来手动设置映射,这样major专业的名字就可以查询到了
<resultMap id="studentMap" type="Student">
<id column="id" property="id"></id>
<result column="num" property="num"></result>
<result column="name" property="name"></result>
<result column="gender" property="gender"></result>
<association property="major" javaType="Major">
<result column="mname" property="name"></result>
</association>
</resultMap>
<select id="findStudentById" parameterType="int" resultMap="studentMap">
SELECT
s.id,
s.num,
s.name,
s.gender,
m.name mname
FROM student s LEFT JOIN major m ON s.majorid = m.id WHERE s.id = #{id}
</select>
在测试类的main方法中调用该方法,传入想要查询的学生的id
多表查询的结果就出来啦!
②不传入值直接查所有的学生列表
在StudentDao类中写该方法
//查所有
List<Student> findStudents();
在StudentMapper.xml文件中写相应的SQL语句
<resultMap id="studentMap" type="Student">
<id column="id" property="id"></id>
<result column="num" property="num"></result>
<result column="name" property="name"></result>
<result column="gender" property="gender"></result>
<association property="major" javaType="Major">
<result column="mname" property="name"></result>
</association>
</resultMap>
<select id="findStudents" resultMap="studentMap">
SELECT
s.id,
s.num,
s.name,
s.gender,
m.name mname
FROM student s LEFT JOIN major m ON s.majorid = m.id
</select>
在测试类的main方法中调用该方法
多表查询的结果就出来啦!
③嵌套查询
在StudentDao类中写该方法
//嵌套查询
Student findStudentById1(int id);
在StudentMapper.xml文件中写相应的SQL语句
把一个关联查询,分成了两单表查询,先查询学生信息,然后通过学生专业外键查询关联的专业信息
<!--嵌套查询,把一个关联查询,分成了两单表查询,先查询学生信息,然后通过学生专业外键查询关联的专业信息-->
<resultMap id="studentMap1" type="Student">
<association property="major" javaType="Major" select="findMajorById" column="majorid"></association>
</resultMap>
<select id="findStudentById1" parameterType="int" resultMap="studentMap1">
SELECT
s.id,
s.num,
s.name,
s.gender,
s.majorid
FROM student s WHERE s.id = #{id}
</select>
<select id="findMajorById" parameterType="int" resultType="Major">
select name from major where id = #{id}
</select>
在测试类的main方法中调用该方法,传入想要查询的学生的id
多表查询的结果就出来啦!
想查询专业major并且查询该专业被哪些学生student选择
①通过id查一个
在MajorDao类中写该方法
//通过id查一个
Major findMajorById(int id);
在MajorMapper.xml文件中写相应的SQL语句
因为是多表查询所以不用再传入resultType了,但是要传入resultMap来手动设置映射,这样student学生的名字就可以查询到了
<resultMap id="majorMap" type="Major">
<id column="id" property="id"></id>
<result column="name" property="name"></result>
<collection property="students" javaType="List" ofType="Student">
<result column="num" property="num"></result>
<result column="sname" property="name"></result>
</collection>
</resultMap>
<select id="findMajorById" resultMap="majorMap">
SELECT m.id, m.name,s.num,s.name sname
FROM major m LEFT JOIN student s ON m.id = s.majorid WHERE m.id = #{id}
</select>
在测试类的main方法中调用该方法,传入想要查询的专业的id
多表查询的结果就出来啦!
②不传入值直接查所有的专业列表
在MajorDao类中写该方法
//查所有
List<Student> findStudents();
在MajorMapper.xml文件中写相应的SQL语句
<resultMap id="majorMap" type="Major">
<id column="id" property="id"></id>
<result column="name" property="name"></result>
<collection property="students" javaType="List" ofType="Student">
<result column="num" property="num"></result>
<result column="sname" property="name"></result>
</collection>
</resultMap>
<select id="findMajors" resultMap="majorMap">
SELECT m.id, m.name,s.num,s.name sname
FROM major m LEFT JOIN student s ON m.id = s.majorid
</select>
在测试类的main方法中调用该方法
多表查询的结果就出来啦!
③嵌套查询
在MajorDao类中写该方法
//嵌套查询
Major findMajorById1(int id);
在MajorMapper.xml文件中写相应的SQL语句
把一个关联查询,分成了两单表查询,先查询专业信息,然后通过学生的专业外键查询关联的学生信息
<!--嵌套查询-->
<resultMap id="majorMap1" type="Major">
<collection property="students" javaType="List" ofType="Student" select="findStudents" column="id"></collection>
</resultMap>
<select id="findMajorById1" resultMap="majorMap1">
SELECT id,name FROM major WHERE id = #{id}
</select>
<select id="findStudents" resultType="student">
select num,name from student where majorid = #{id}
</select>
在测试类的main方法中调用该方法,传入想要查询的专业的id
多表查询的结果就出来啦!
3. 设置自动映射级别
NONE完全关闭自动映射
PARTIAL当查询没有嵌套查询时,会自动映射,一旦有嵌套查询就不会自动映射
FULL 无论是否有嵌套都会自动映射
mabatis官方默认给的是部分映射:PARTIAL
4.注解
是直接将SQL语句写在Dao层的方法上(推荐SQL语句比较简单的使用),这样SQL语句就不用在sql 映射文件中写了,减少了代码的冗余,更加便利简洁
@Insert : 插入 sql , 和 xml insert sql 语法完全一样@Select : 查询 sql, 和 xml select sql 语法完全一样@Update : 更新 sql, 和 xml update sql 语法完全一样@Delete : 删除 sql, 和 xml delete sql 语法完全一样@Param : 入参@Results : 设置结果集合@Result : 结果
就比如这样,直接将SQL写在方法上