文章目录
Mapper对SQL的两种映射
基于XML的映射
定义XML SQL 的配置文件
- 这是student的
<?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.lanou.spring.dao.StudentDao">
//
<resultMap id="stu" type="Student">
<result property="sname" column="sname" />
//为了让Java类里的属性名和数据库里的列名一样(强制的)
<result property="nickName" column="nick_name" />
</resultMap>
<select id="queryResultMap" resultMap="stu">
select * from student;
</select>
</mapper>
- 这是teacher的
<?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.lanou.spring.dao.TeacherDao">
<!-- 此处的id是查询语句的名称,对应接口中的方法名 -->
<select id="queryAll" resultType="Teacher">
select * from teacher;
</select>
</mapper>
在定义与SQL对应的Mapper接口(student&teacher)
package com.lanou.spring.dao;
import com.lanou.spring.bean.Teacher;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface TeacherDao {
List<Teacher> queryAll();
/**
* 多参数查询
* @param id
* @param age
* @return
*/
List<Teacher> queryByIdAndAge(@Param("tid") int id, @Param("age") int age);
int insertTeacher(Teacher teacher);
int insertTeacherByParam(@Param("tname") String tname, @Param("age") int age);
Teacher queryById(int id);
int updateTeacherById(Teacher teacher);
int deleteTeacherById(int id);
}
因为学生的接口是注解形式的,一会可以在下文看见
批量插入,修改,删除等操作
<!-- 带一个简单类型的参数, 这种情况下parameterType属性可以省略,mybatis可以自动推断出类型 -->
<select id="queryById" parameterType="int" resultType="Teacher">
select * from teacher where id = #{id};
</select>
<!-- 带两个参数,需要在接口中通过@Param注解指定名称(因为编译时参数名不会保留) -->
<select id="queryByIdAndAge" resultType="Teacher">
select * from teacher where id = #{id} and age <= #{age};
</select>
<!-- insert、update、delete的返回值都是int(影响行数) -->
<!-- 自定义类型参数,通过#{属性名}可以直接获取引入类型参数的属性值 -->
<insert id="insertTeacher" parameterType="Teacher">
insert into teacher(tname) values (#{tname});
</insert>
<insert id="insertTeacherByParam">
insert into teacher(tname, age) values (#{tname}, #{age});
</insert>
<update id="updateTeacherById" parameterType="Teacher">
update teacher set tname = #{tname}, age = #{age} where id = #{id}
</update>
<delete id="deleteTeacherById">
delete from teacher where id = #{id};
</delete>
对数据库的结果集进行映射(***)
映射结果集
<resultMap id="stu" type="Student">
<result property="sname" column="sname" />
<result property="nickName" column="nick_name" />
</resultMap>
在查询语句中引用定义的resultmap
<select id="queryResultMap" resultMap="stu">
select * from student;
</select>
基于注解的映射
package com.lanou.spring.dao;
import com.lanou.spring.bean.Student;
import org.apache.ibatis.annotations.Select;
import java.util.List;
public interface StudentDao {
@Select("select * from student;")
List<Student> queryAll();
List<Student> queryResultMap();
}
package com.lanou.spring.dao;
import com.lanou.spring.bean.Category;
import org.apache.ibatis.annotations.Select;
import java.util.List;
public interface CategoryDao {
@Select("select id,name from teacher")
List<Category> queryAll();
}
在Test类中测试一下
package com.lanou.spring;
import static org.junit.Assert.assertTrue;
import com.lanou.spring.bean.Student;
import com.lanou.spring.bean.Teacher;
import com.lanou.spring.dao.CategoryDao;
import com.lanou.spring.dao.StudentDao;
import com.lanou.spring.dao.TeacherDao;
import lombok.extern.slf4j.Slf4j;
import org.junit.Before;
import org.junit.Test;
import java.util.List;
/**
* Unit test for simple App.
*/
@Slf4j
public class AppTest {
TeacherDao teacherDao = null;
StudentDao studentDao = null;
CategoryDao categoryDao = null;
@Before
public void setUp() {
categoryDao = MyBatisTools.getInstance().getSessionFactory("yanfa13").openSession().getMapper(CategoryDao.class);
studentDao = MyBatisTools.getInstance().openSession().getMapper(StudentDao.class);
teacherDao = MyBatisTools.getInstance().openSession().getMapper(TeacherDao.class);
}
/**
* 练习查询多个库(用到了多环境配置)
*/
@Test
public void testMultiDatabase() {
// 查询其他数据库中的数据
System.out.println(categoryDao.queryAll());
}
@Test
public void testQueryAll() {
// 查询学生表
List<Student> studentList = studentDao.queryAll();
// List<Student> studentList = studentDao.queryResultMap();
log.info("studentList: " + studentList);
//查询教师表
TeacherDao teacherDao = MyBatisTools.getInstance().openSession().getMapper(TeacherDao.class);
List<Teacher> teacherList = teacherDao.queryAll();
log.info("teacherList: " + teacherList);
}
@Test
public void testInsert() {
// 新增Teacher表
System.out.println("--------------插入前:");
List<Teacher> teacherList = teacherDao.queryAll();
System.out.println(teacherList);
int ret = teacherDao.insertTeacher(new Teacher("特斯拉"));
log.info("影响的行数: " + ret);
// 比较low的写法(不推荐)
//int ret = teacherDao.insertTeacherByParam("哥斯拉", 99);
//log.info("影响的行数: " + ret);
System.out.println("--------------插入后:");
teacherList = teacherDao.queryAll();
System.out.println(teacherList);
}
@Test
public void testQueryById() {
Teacher teacher = teacherDao.queryById(41);
System.out.println(teacher);
}
/**
* 多个参数查询语句
*/
@Test
public void testQueryByIdAndAge() {
List<Teacher> teacherList = teacherDao.queryByIdAndAge(6, 99);
log.info("查询结果:" + teacherList);
}
@Test
public void testUpdate() {
Teacher teacher = new Teacher();
teacher.setId(6);
teacher.setAge(99);
teacher.setTname("吉吉国王");
int rows = teacherDao.updateTeacherById(teacher);
log.info("更新行数:" + rows);
}
@Test
public void testDelete() {
int rows = teacherDao.deleteTeacherById(30);
log.info("删除行数:" + rows);
}
}