Mybatis框架2

1. 使用接口结合xml文件。

  1. 创建一个接口,该接口要和映射文件匹配。
    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赋值到哪个属性上

 

 

posted @ 2019-08-31 15:34  猪头太笨  阅读(125)  评论(0)    收藏  举报