2. MyBatis基于配置文件的CRUD

  上一篇做了一个 MyBatis 的简单的入门, 这一节我们深入一下, 主要是学习如何对数据表做 CRUD操作.

  上一篇简单的做了一个查询,这一篇, 咱们按照 查, 增, 改, 删来讲.

 

一: 查

  1. 查询一个 Person 对象.

    这个简单的查询一个对象在上一篇中已经说了, 这里就不说了.

 

  2. 查询一个 属性值.

    为了获取 SqlSession 对象方便, 我把获取 SqlSession 的操作抽象成一个工具类.

public class MyBatisUtil {
    
    private MyBatisUtil(){}
    
    public static SqlSession getSqlSession() {
        
        InputStream is = MyBatisUtil.class.getClassLoader()
                    .getResourceAsStream("conf.xml");
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder()
                                .build(is);
        SqlSession session = sessionFactory.openSession();
        return session;
    }
    
}

 

    SQL 语句主要都写在 PersonMapper.xml 中, 然后调用对应的 id 属性值.

    PersonMapper.xml 中增加一个查询

<select id="getValue" parameterType="int" resultType="String">
    SELECT name FROM person WHERE id=#{id}
</select>

 

    因为我们查询的姓名是一个 String 类型, 所以我们的 resultType值为String.

    调用代码为:   

  @Test
    public void testGetValue(){
        
        SqlSession session = MyBatisUtil.getSqlSession();
        String statement = "com.mybatis.entities.PersonMapper.getValue";
        String str = session.selectOne(statement, 1);
        System.out.println(str);
        
    }

 

    一定要记住 com.mybatis.entities.PersonMapper.getValue 加粗的文字, 为<select>标签的 id 属性值.

    是不是 So Easy!

 

    3. 查询一组 Person 对象.

    这个就是返回一个集合, 直接上代码, 也很简单

    PersonMapper.xml 中增加一个查询

<select id="getPersons"  parameterType="int" resultType="com.mybatis.entities.Person">
    SELECT id, name, age FROM person
</select>

 

    返回值类型就是一个 Person 对象, 而查询是查询所有的.

    调用代码:   

  @Test
    public void testGetPersons(){
        
        SqlSession session = MyBatisUtil.getSqlSession();
        String statement = "com.mybatis.entities.PersonMapper.getPersons";
        List<Person> persons = session.selectList(statement);
        persons.forEach(person -> System.out.println(person));
        
    }

 

    List<Person> persons = session.selectList(statement);

    重点是这一个, 不是 selectOne, 而是 selectList, 查询一组对象. 没有给它传参数.

    

    4. 按条件查询或者模糊查询一组对象.

    先构造一个查询条件类 PersonCondition 如下:

package com.mybatis.util;

public class PersonCondition {

    private String name;
    private Integer minAge;
    private Integer maxAge;

    public PersonCondition() {
        super();
    }

    public PersonCondition(String name, Integer minAge, Integer maxAge) {
        super();
        this.name = name;
        this.minAge = minAge;
        this.maxAge = maxAge;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getMinAge() {
        return minAge;
    }

    public void setMinAge(Integer minAge) {
        this.minAge = minAge;
    }

    public Integer getMaxAge() {
        return maxAge;
    }

    public void setMaxAge(Integer maxAge) {
        this.maxAge = maxAge;
    }

    @Override
    public String toString() {
        return "PersonCondition [name=" + name + ", minAge=" + minAge + ", maxAge=" + maxAge + "]";
    }

}

 

    然后

    PersonMapper.xml 内容如下:

  <select id="getPersonsByCondition"  
        parameterType="com.mybatis.util.PersonCondition" 
        resultType="com.mybatis.entities.Person">
        <!-- 因为里边有大于号小于号, 所用用 <![CDATA[]]> 括起来-->
        <![CDATA[
            SELECT id, name, age FROM person 
            WHERE name like #{name} 
            AND age > #{minAge} 
            AND age < #{maxAge}
        ]]>
    </select>

 

    这里直接用 #{name} 来获取 PersonCondition 类中的name属性值.

    调用代码如下:

  @Test
    public void testGetPersonsByCondition(){
        
        // 构造一个查询条件类, name 要用 %% 括起来, mysql的语法.
        PersonCondition condition = new PersonCondition("%k%", 10, 20);
        
        SqlSession session = MyBatisUtil.getSqlSession();
        String statement = 
            "com.mybatis.entities.PersonMapper.getPersonsByCondition";
        // 把查询条件传进去
        List<Person> persons = session.selectList(statement, condition);
        persons.forEach(person -> System.out.println(person));
        
    }

 

 

二: 增

  利用 <insert> 标签来插入数据.

  PersonMapper.xml 内容如下:

<insert id="insertPerson" parameterType="com.mybatis.entities.Person">
    INSERT INTO person(name, age) VALUES(#{name}, #{age})
</insert>

 

  调用代码如下:

  @Test
    public void testInsertPerson(){
        
        SqlSession session = MyBatisUtil.getSqlSession();
        String statement = "com.mybatis.entities.PersonMapper.insertPerson";
        session.insert(statement, new Person(null, "AAA", 20));
        session.commit();
        
    }

 

 

  调用 session.insert(); 来完成插入.

  注意: MyBatis 的 session 默认是不自动提交的.

 

三: 改

  利用<update>标签和 session.update()方法完成.

  PersonMapper.xml 内容如下:

  <update id="updatePerson" parameterType="com.mybatis.entities.Person">
        UPDATE person SET name=#{name}, age=#{age} WHERE id=#{id}
    </update>

 

  调用代码如下:

  @Test
    public void testUpdatePerson(){
        
        SqlSession session = MyBatisUtil.getSqlSession();
        String statement = "com.mybatis.entities.PersonMapper.updatePerson";
        // 我们把 id 为 5 的人的姓名改为 BBB, 年龄改为 20
        session.update(statement, new Person(5, "BBB", 20));
        session.commit();
        
    }

 

 

四: 删

  利用 <delete> 标签, 和 session.delete() 方法完成操作.

  PersonMapper.xml

  <delete id="deletePerson" parameterType="int">
      <!-- 
          当传入的参数为 int 类型的时候, 用#{id}获取或者用#{abc} 获取都没问题,
          当时当传入一个对象的时候必须用 #{对象属性}来获取.
      -->
      DELETE FROM person WHERE id=#{abc}
  </delete>

 

  调用代码如下:

  @Test
    public void testDeletePerson(){
        
        SqlSession session = MyBatisUtil.getSqlSession();
        String statement = "com.mybatis.entities.PersonMapper.deletePerson";
        // 我们把 id 为 5 的人从数据库中删除
        session.delete(statement, 5);
        session.commit();
        
    }

 

 

    本篇博文代码点击 http://pan.baidu.com/s/1o7p1CyI 下载.

 

你可能感兴趣的:(2. MyBatis基于配置文件的CRUD)