Mybatis框架2
1. 使用接口结合xml文件。
- 创建一个接口,该接口要和映射文件匹配。
public interface OrderDao { public Order getOrder(int id); public void addOrder(Order order); public void updateOrder(Order order); public List<Order> selectByPrice(@Param("min") int min,@Param("max") int max); }
解决字段与属性不匹配的问题
<?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后的内容要和接口所在的包以及接口的名字一样 -->
<mapper namespace="com.zhiyou100.mcl.dao.OrderDao">
<!-- resultMap后写想要调用的resultMap标签的id -->
<select id="getOrder" resultMap="order">
select * from orders where order_id=#{id}
</select> <!-- id:为标签起名,方便调用 -->
<resultMap type="com.zhiyou100.mcl.bean.Order" id="order">
<id column="order_id" property="id"/>
<result column="order_no" property="no"/>
<result column="order_price" property="price"/> </resultMap>
</mapper>
2.测试
class UsersTest { static SqlSession session = null; static UsersDao usersDao=null; @BeforeAll static void setUpBeforeClass() throws Exception { Reader reader = Resources.getResourceAsReader("conf.xml"); //构建 sqlSession 的工厂 SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader); //创建能执行映射文件中 sql 的 sqlSession session = sessionFactory.openSession(); usersDao=session.getMapper(UsersDao.class); } @Test void testGetUser() { Users user = usersDao.getUser(2); System.out.println(user); }
3. 链表查询
3.1多对一的情况
比如要通过班级号查找老师的信息
首先创建班级和老师的实体类
public class Teacher { private int id; private String name; } public class Clazz { private int id; private String name;
private int teacherId private Teacher teacher; }
可以看到,clazz类中有一个属性是老师这个对象,将实体类看做一个属性
创建接口
public interface ClazzDao { public Clazz getClazz(int id); public Clazz selectById(int id); public void addOrder(Order order); public void updateOrder(Order order); }
映射文件中的代码
<?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">
<mapper namespace="com.zhiyou100.mcl.dao.ClazzDao">
<select resultMap="clazz" id="getClazz">
select * from class c,teacher t,student s where c.teacher_id=t.t_id and s.class_id=c.c_id and c_id=#{cId}
</select>
<resultMap type="com.zhiyou100.mcl.bean.Clazz" id="clazz">
<id column="c_id" property="cId"/>
<result column="c_name" property="cName"/>
<result column="teacher_id" property="teacherId"/>
<!--
association:用于一对一的关联查询
property:对象的属性的名称
column:所对应的外键的字段名称
JavaType:对象属性的类型
select:使用另一个查询封装的结果
-->
<association property="teacher" javaType="com.zhiyou100.mcl.bean.Teacher" >
</association>
<id column="t_id" property="tId"/>
<result column="t_name" property="tName"/>
</association>
</mapper>
3.2一对多的情况
比如查询班级的学生
创建学生实体类
public class Student { private int sId; private String sName; private int classId; }
在班级类中添加新的属性 List<Student> student;
public class Clazz { private int cId; private String cName; private int teacherId; private Teacher teacher; private List<Student> student;
}
映射文件
<select id="selectById" resultMap="clazz"> select * from class where c_id=#{cId} </select> <resultMap type="com.zhiyou100.mcl.bean.Clazz" id="clazz"> <id column="c_id" property="cId"/> <result column="c_name" property="cName"/> <result column="teacher_id" property="teacherId"/> <collection property="student" ofType="com.zhiyou100.mcl.bean.Student" ></collection> </resultMap>
4. Mybatis中$和#的区别。
#{}:占位符号,可以防止sql注入(替换结果会增加单引号‘’)
${}:sql拼接符号(替换结果不会增加单引号‘’,like和order by后使用,存在sql注入问题,需手动代码中过滤)
5.添加时如何获得添加成功的数据的主键值
<insert id="addUser" parameterType="com.zhiyou100.mcl.bean.Users" useGeneratedKeys="true" keyProperty="id">
insert into users(name,age) values(#{name},#{age})
</insert>
useGeneratedKeys="true" 表示使用自动生成的id
keyProperty 把生成的id赋值到哪个属性上

浙公网安备 33010602011771号