Mybatis学习笔记-使用Mybatis开发CRUD

  1. 新增

 

   <insert id="insert" parameterType="cn.itcast.domain.Person">

      insert into person

      (id,user_name,age,remark)

      values

      (#{id},#{name},#{age},#{remark})

   </insert>

 

        @Test      //新增

        public void testInsert(){

                 SqlSession session = factory.openSession();

                 Person p = new Person();

                 p.setId(4);

                 p.setName("hellen");

                 p.setAge(16);

                 p.setRemark("xijiang");

                

                 session.insert("cn.itcast.mapper.PersonMapper.insert", p);

                 session.commit();                    //提交事务

                

                 System.out.println("insert finished.");

        }

 

 

  1. 修改

   <update id="update" parameterType="cn.itcast.domain.Person">

      update person

      set user_name=#{name},age=#{age},remark=#{remark}

      where id = #{id}

   </update>

 

   public void testUpdate(){

      SqlSession session = factory.openSession();

      Person p = new Person();

      p.setId(4);

      //p.setName("hellen2");

      p.setAge(18);

      //p.setRemark("beijing");

     

   session.update("cn.itcast.mapper.PersonMapper.update", p);

      session.commit();

   }

 

  1. 删除一条

 

        <delete id="deleteById" parameterType="int">

                 delete from person

                 where id = #{pid}

        </delete>

 

        public void testDeleteById(){

                 SqlSession session = factory.openSession();

                

                 session.delete("cn.itcast.mapper.PersonMapper.deleteById", 4);

                 session.commit();

        }

 

 

  1. 删除多条,整形数组

        <delete id="delete" parameterType="int">

                 delete from person

                 where id in

                 <foreach collection="array" item="id" open="(" close=")" separator=",">

                         #{id}

                 </foreach>

        </delete>

 

        @Test      //删除多条-数组

        public void testDeleteByArray(){

                 SqlSession session = factory.openSession();

                 int[] ids = {4,6};

                 session.delete("cn.itcast.mapper.PersonMapper.deleteArray", ids);

                 session.commit();

        }

       

 

   <!-- 删除多条,LIST集合 -->

   <delete id="deleteList" parameterType="int">

      delete from person

      where id in

      <foreach collection="list" item="id" open="(" close=")" separator=",">

          #{id}

      </foreach>

   </delete>

 

  1. 删除多条-LIST

   public void testDeleteByList(){

      SqlSession session = factory.openSession();

      List<Integer> _list = new ArrayList<Integer>();

      _list.add(4);

      _list.add(6);

     

   session.delete("cn.itcast.mapper.PersonMapper.deleteList", _list);

      session.commit();

   }

 

       

  1. 删除多条,Map

        <delete id="deleteMap" parameterType="int">

                 delete from person

                 where id in

                 <foreach collection="map" item="id" open="(" close=")" separator=",">

                         #{id}

                 </foreach>              

        </delete>
 

       

  1. 删除多条,Map , ids 代表map中key

        <delete id="deleteMap" parameterType="map">

                 delete from person

                 where id in

                 <foreach collection="ids" item="id" open="(" close=")" separator=",">

                         #{id}

                 </foreach>              

        </delete>

 

        @Test      //删除多条 MAP

        public void testDeleteByMap(){

                 SqlSession session = factory.openSession();

                 Map<String,Object> paraMap = new HashMap<String,Object>();

                 int[] ids = {4,6};

                 paraMap.put("ids", ids);

                

                 session.delete("cn.itcast.mapper.PersonMapper.deleteMap", paraMap);

                 session.commit();

        }

 

 

  1. 获取记录总数

   <select id="count" resultType="int">

      SELECT COUNT(*) FROM person

   </select>

        @Test      //获取记录总数

        public void testCount(){

                 SqlSession session = factory.openSession();

                 int i = session.selectOne("cn.itcast.mapper.PersonMapper.count");

                 System.out.println(i);

        }

 

  1. 简化
    1. 别名

   <!-- 起别名 -->

   <typeAliases>

      <typeAlias type="cn.itcast.domain.Person" alias="Person"/>

   </typeAliases>

 

        <!-- 查询一个,按id查询 -->

        <select id="get" parameterType="int" resultType="Person">

                 select * from person

                 where id = #{pid}

        </select>

 

    1. SQL片段

<sql id="cols">id,user_name,age,remark</sql>

 

        <select id="find" resultMap="personRM">

                 select <include refid="cols"/> from person

        </select>

 

传参:map和po对象实体,查询条件封装

例如:年龄(整数),出生日期,入职日期(日期)

日期,有开始时间,结束时间

Map随意构造

 

  1. 动态SQL语句
    1. <where> 能自动去掉where最前面and或者or

 

   <select id="find" parameterType="map" resultMap="personRM">

      select <include refid="cols"/> from person

      <where>

      <if test="name!=null">and user_name like #{name}</if>

      <if test="age!=null">and age=#{age}</if>

      </where>

   </select>

 

    1. <set>自动删除最后一个逗号

                 <set>

                         <if test="name!=null">user_name=#{name},</if>

                         <if test="age!=null">age=#{age},</if>

                         <if test="remark!=null">remark=#{remark},</if>

                 </set>

    1. <foreach>

                 <foreach collection="ids" item="id" open="(" close=")" separator=",">

                         #{id}

                 </foreach>      

 

                 where id in

                 (

                 <foreach collection="array" item="id" separator=",">

                         #{id}

                 </foreach>

                 )

 

 

  • 对象关联
  1. 对一,需求:人员可以有扩展信息

人员person

扩展person_info    拓展用户信息,例如

 

人员和扩展信息表一对一

 

在mybatis中关联关系只有两种

对一 <association property=""></association>,

对多<collection property=""></collection>

 

结果集中有重名字段。

如果发生这种情况,重名情况,Mybatis,拿一个id字段的值,放到setId内。

 

如何处理?

赋别名

 

    1. 配置文件PersonInfoMapper.xml

<?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="cn.itcast.mapper.PersonInfoMapper">

        <resultMap type="cn.itcast.domain.Person" id="personInfoRM">

                 <id property="id" column="ID"/>

                 <result property="name" column="USER_NAME"/>

                 <result property="age" column="AGE"/>

                 <result property="remark" column="REMARK"/>

        </resultMap>

       

        <!-- 使用继承方式,配置对一关联关系  -->

        <resultMap type="cn.itcast.domain.Person" id="personPersonInfoRM" extends="personInfoRM">

                 <association property="personInfo" javaType="cn.itcast.domain.PersonInfo">

                         <id property="id" column="INFOID"/>

                         <result property="station" column="STATION"/>

                         <result property="joinDate" column="JOIN_DATE"/>

                 </association>

        </resultMap>

       

        <!-- 查询,人员和人员扩展信息 -->

        <select id="findPersonInfo" parameterType="map" resultMap="personPersonInfoRM">

SELECT

        p.id,p.user_name,p.age,p.remark,

        i.id AS infoid,i.station,i.join_date

FROM

(SELECT id,user_name,age,remark FROM person) p

LEFT JOIN

(SELECT id,station,join_date FROM person_info) i

ON p.id=i.id

<where>

        <if test="name!=null">user_name=#{name}</if>

</where>

        </select>

 

</mapper>

 

    1. 客户端调用

package test;

 

import java.io.IOException;

import java.io.InputStream;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

 

import org.apache.ibatis.io.Resources;

import org.apache.ibatis.session.SqlSession;

import org.apache.ibatis.session.SqlSessionFactory;

import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import org.junit.Before;

import org.junit.Test;

 

import cn.itcast.domain.Person;

 

/**

 * @Description:

 * @Author:            传智播客 java学院       陈子枢

 * @Company:       http://java.itcast.cn

 * @CreateDate:    2014年11月15日

 */

public class TestPersonInfo {

        private SqlSessionFactory factory;

       

        @Before  //最先执行,初始化SessionFactory

        public void init() throws IOException{

                 String resource = "sqlMapConfig.xml";

                 InputStream is = Resources.getResourceAsStream(resource);

                 factory = new SqlSessionFactoryBuilder().build(is);

        }

       

        @Test      //查询管理的一对一

        public void testPersonInfo(){

                 SqlSession session = factory.openSession();

                 Map map = new HashMap();

                 List<Person> personList = session.selectList("cn.itcast.mapper.PersonInfoMapper.findPersonInfo", map);

                 for(Person p : personList){

                         System.out.println(p);

                 }

        }

}

 

  1. 对多,人员可以拥有多本书籍

 

需求,某个人有几本书

package cn.itcast.domain;

    1. Book实体

/**

 * @Description:

 * @Author:            传智播客 java学院       陈子枢

 * @Company:       http://java.itcast.cn

 * @CreateDate:    2014年11月15日

 */

public class Book {

        private Integer id;

        private String name;

        private Double money;

        public Integer getId() {

                 return id;

        }

        public void setId(Integer id) {

                 this.id = id;

        }

        public String getName() {

                 return name;

        }

        public void setName(String name) {

                this.name = name;

        }

        public Double getMoney() {

                 return money;

        }

        public void setMoney(Double money) {

                 this.money = money;

        }

       

}

    1. 改造person对象

package cn.itcast.domain;

import java.util.List;

 

/**

 * @Description:

 * @Author:            传智播客 java学院       陈子枢

 * @Company:       http://java.itcast.cn

 * @CreateDate:    2014年11月15日

 */

public class Person {

        private PersonInfo personInfo;       //对一关联

        private List<Book> books;               //对多关联

       

        private Integer id;

        private String name;

        private Integer age;

        private String remark;

        public Integer getId() {

                 return id;

        }

        public void setId(Integer id) {

                 this.id = id;

        }

        public String getName() {

                 return name;

        }

        public void setName(String name) {

                 this.name = name;

        }

        public Integer getAge() {

                 return age;

        }

        public void setAge(Integer age) {

                 this.age = age;

        }

        public String getRemark() {

                 return remark;

        }

        public void setRemark(String remark) {

                 this.remark = remark;

        }

        public PersonInfo getPersonInfo() {

                 return personInfo;

        }

        public void setPersonInfo(PersonInfo personInfo) {

                 this.personInfo = personInfo;

        }

        public List<Book> getBooks() {

                 return books;

        }

        public void setBooks(List<Book> books) {

                 this.books = books;

        }

 

 

}

 

    1. 对多,配置

<?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="cn.itcast.mapper.PersonInfoMapper">

        <resultMap type="cn.itcast.domain.Person" id="personInfoRM">

                 <id property="id" column="ID"/>

                 <result property="name" column="USER_NAME"/>

                 <result property="age" column="AGE"/>

                 <result property="remark" column="REMARK"/>

        </resultMap>

       

        <!-- 使用继承方式,配置对一关联关系  -->

        <resultMap type="cn.itcast.domain.Person" id="personPersonInfoRM" extends="personInfoRM">

                 <association property="personInfo" javaType="cn.itcast.domain.PersonInfo">

                         <id property="id" column="INFOID"/>

                         <result property="station" column="STATION"/>

                         <result property="joinDate" column="JOIN_DATE"/>

                 </association>

        </resultMap>

       

        <!-- 使用继承方式,配置对多的关联关系 -->

        <resultMap type="cn.itcast.domain.Person" id="personBookRM" extends="personPersonInfoRM">

                 <collection property="books" ofType="cn.itcast.domain.Book">

                         <id property="id" column="BOOK_ID"/>

                         <result property="name" column="BOOK_NAME"/>

                         <result property="money" column="MONEY"/>

                 </collection>

        </resultMap>

       

        <!-- 查询,人员和人员扩展信息 -->

        <select id="findPersonInfo" parameterType="map" resultMap="personPersonInfoRM">

SELECT

        p.id,p.user_name,p.age,p.remark,

        i.id AS infoid,i.station,i.join_date

FROM

(SELECT id,user_name,age,remark FROM person) p

LEFT JOIN

(SELECT id,station,join_date FROM person_info) i

ON p.id=i.id

<where>

        <if test="name!=null">user_name=#{name}</if>

</where>

        </select>

       

        <!-- 查询某个人的人员信息,(扩展信息,书籍) -->

        <select id="findPersonInfoBook" parameterType="map" resultMap="personBookRM">

SELECT

        p.id,p.name,p.age,p.remark,

        p.infoid,p.station,p.join_date,

        b.book_id,b.book_name,b.money

FROM

(

        SELECT

                 p.id,p.name,p.age,p.remark,

                 i.infoid,i.station,i.join_date

        FROM

                 (SELECT id,user_name AS NAME,age,remark FROM person) p

        LEFT JOIN

                 (SELECT id AS infoid,station,join_date FROM person_info) i

        ON p.id=i.infoid

) p

LEFT JOIN

        (SELECT id AS book_id,NAME AS book_name,money,person_id FROM book) b

ON p.id=b.person_id

        </select>

 

</mapper>

 

    1. 客户端调用

        @Test      //查询某个人员(人员和人员信息的一对一,人员和书籍的一对多

        public void testPersonBook(){

                 SqlSession session = factory.openSession();

                 Map map = new HashMap();

                 List<Person> personList = session.selectList("cn.itcast.mapper.PersonInfoMapper.findPersonInfoBook", map);

                 System.out.println(personList.size());

        }

 

某个用户的书籍

 

  1. SQL优化

缩小中间结果集

Select p.*,info.*,book.* from person left join person_info left join book on…..

 

 

    1. 视图

在做大型项目,视图可能废除。项目组不允许在项目中使用视图

 

    1. Hibernate

它在中小型项目中使用,无法SQL优化。

猜你喜欢

转载自blog.csdn.net/a5421901/article/details/88074182