- 新增
<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.");
}
- 修改
<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();
}
- 删除一条
<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();
}
- 删除多条,整形数组
<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>
- 删除多条-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();
}
- 删除多条,Map
<delete id="deleteMap" parameterType="int">
delete from person
where id in
<foreach collection="map" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
</delete>
- 删除多条,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();
}
- 获取记录总数
<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);
}
- 简化
- 别名
<!-- 起别名 -->
<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>
-
- 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随意构造
- 动态SQL语句
- <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>
-
- <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>
-
- <foreach>
<foreach collection="ids" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
where id in
(
<foreach collection="array" item="id" separator=",">
#{id}
</foreach>
)
- 对象关联
- 对一,需求:人员可以有扩展信息
人员person
扩展person_info 拓展用户信息,例如
人员和扩展信息表一对一
在mybatis中关联关系只有两种
对一 <association property=""></association>,
对多<collection property=""></collection>
结果集中有重名字段。
如果发生这种情况,重名情况,Mybatis,拿一个id字段的值,放到setId内。
如何处理?
赋别名
-
- 配置文件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>
-
- 客户端调用
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);
}
}
}
- 对多,人员可以拥有多本书籍
需求,某个人有几本书
package cn.itcast.domain;
-
- 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;
}
}
-
- 改造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;
}
}
-
- 对多,配置
<?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>
-
- 客户端调用
@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());
}
某个用户的书籍
- SQL优化
缩小中间结果集
Select p.*,info.*,book.* from person left join person_info left join book on…..
-
- 视图
在做大型项目,视图可能废除。项目组不允许在项目中使用视图
-
- Hibernate
它在中小型项目中使用,无法SQL优化。