1.關聯查詢
l 創建一個Customer類,Order類
public class Customer {
private Integer id;
private String name;
private Integer age;
private Set<Order> orders;
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 Set<Order> getOrders() {
return orders;
}
public void setOrders(Set<Order> orders) {
this.orders = orders;
}
@Override
public String toString() {
return "Customer [id=" + id + ", name=" + name + ", age=" + age + ", orders=" + orders + "]";
}
}
package mybatis.entity;
public class Order {
private Integer id;
private String orderNumber;
private Integer price;
private Customer customer;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getOrderNumber() {
return orderNumber;
}
public void setOrderNumber(String orderNumber) {
this.orderNumber = orderNumber;
}
public Integer getPrice() {
return price;
}
public void setPrice(Integer price) {
this.price = price;
}
public Customer getCustomer() {
return customer;
}
public void setCustomer(Customer customer) {
this.customer = customer;
}
@Override
public String toString() {
return "Order [id=" + id + ", orderNumber=" + orderNumber + ", price=" + price + "]";
}
}
l 創建客戶表和訂單表
CREATE TABLE `t_customer` (
`id` int(5) NOT NULL auto_increment,
`name` varchar(20) default NULL,
`age` int(2) default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8
CREATE TABLE `t_order` (
`id` int(5) NOT NULL auto_increment,
`orderNumber` varchar(20) default NULL,
`price` int(10) default NULL,
`customer_id` int(5) default NULL,
PRIMARY KEY (`id`),
KEY `customer_id` (`customer_id`),
CONSTRAINT `t_order_ibfk_1` FOREIGN KEY (`customer_id`) REFERENCES `t_customer` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8
1.1 根據id查詢客戶,關聯查詢訂單
第一步:創建一個CustomerMapper.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="mybatis.entity.Customer">
<resultMap type="Customer" id="customerWithOrder">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="age" column="age"/>
<collection property="orders" ofType="Order">
<!-- <id property="id" column="id"/> -->
<id property="id" column="oid"/>
<result property="orderNumber" column="orderNumber"/>
<result property="price" column="price" />
</collection>
</resultMap>
<!--可以正常的查出信息,但是由於返回類型的原因,訂單信息無法封裝到Customer中,解決辦法如下:queryById2 -->
<select id="queryById" resultType="Customer">
select c.*, o.* from
t_customer c left outer join t_order o on c.id=o.customer_id where
c.id = #{id}
</select>
<!--兩個個表的id同名,會造成一些錯誤,例如沒有訂單信息的會有一個空的訂單記錄,有多個訂單信息得只能查出來一條,解決辦法如下:queryById3 -->
<select id="queryById2" resultMap="customerWithOrder">
select c.*, o.* from
t_customer c left outer join t_order o on c.id=o.customer_id where
c.id = #{id}
</select>
<select id="queryById3" resultMap="customerWithOrder">
select c.*, o.*,o.id as oid from
t_customer c left outer join t_order o on c.id=o.customer_id where
c.id = #{id}
</select>
</mapper>
第二步:將sql映射文件註冊到sqlMapConfig.xml中(所有相關表已經包含進來,剩餘相似步驟不提供文件了)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<typeAliases>
<typeAlias type="mybatis.entity.User" alias="User"/>
<typeAlias type="mybatis.entity.Book" alias="Book"/>
<typeAlias type="mybatis.entity.Customer" alias="Customer"/>
<typeAlias type="mybatis.entity.Order" alias="Order"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<!-- <property name="driver" value="com.mysql.jdbc.Driver" /> -->
<property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis_demo" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mybatis/entity/UserMapper.xml"/>
<mapper resource="mybatis/entity/BookMapper.xml"/>
<mapper resource="mybatis/entity/CustomerMapper.xml"/>
<mapper resource="mybatis/entity/OrderMapper.xml"/>
</mappers>
</configuration>
第三步:使用mybatis提供的api,操作數據庫
package mybatis;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
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 mybatis.entity.Customer;
import mybatis.entity.Order;
public class AssociationQueryTest {
static final String CUSTOMER_NAMESPAC = "mybatis.entity.Customer";
static final String ORDER_NAMESPAC = "mybatis.entity.Order";
SqlSession sqlSession = null;
@Before
public void createSqlSesion() throws IOException {
InputStream asStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(asStream);
sqlSession = sqlSessionFactory.openSession();
}
// 根據Customer查詢Order
@Test
public void testQuery() {
List<Customer> customers = sqlSession.selectList(CUSTOMER_NAMESPAC + ".queryById", 1);
for (Customer customer2 : customers) {
System.out.println(customer2);
}
sqlSession.close();
}
@Test
public void testQuery2() {
Customer customer = sqlSession.selectOne(CUSTOMER_NAMESPAC + ".queryById2", 1);
System.out.println(customer);
sqlSession.close();
}
@Test
public void testQuery3() {
Customer customer = sqlSession.selectOne(CUSTOMER_NAMESPAC + ".queryById3", 1);
System.out.println(customer);
sqlSession.close();
}
}
2.1 根據id查詢訂單,關聯查詢客戶
第一步:創建一個OrderMapper.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="mybatis.entity.Order">
<resultMap type="Order" id="orderColumns4Map">
<id property="id" column="id" />
<result property="orderNumber" column="orderNumber" />
<result property="price" column="price" />
<association property="customer" javaType="Customer">
<id property="id" column="cid" />
<result property="name" column="name" />
<result property="age" column="age" />
</association>
</resultMap>
<select id="queryById" resultMap="orderColumns4Map">
select o.*,c.*,c.id as cid from t_order o
left outer join t_customer c on o.customer_id=c.id where o.id=#{id}
</select>
</mapper>
第二步:將sql映射文件註冊到sqlMapConfig.xml中
第三步:使用框架提供的api操作數據庫:
// 根據Order查詢Customer
@Test
public void testQueryOrder() {
Order order = sqlSession.selectOne(ORDER_NAMESPAC+".queryById", 2);
System.out.println(order);
System.out.println(order.getCustomer());
sqlSession.close();
}
3. 動態sql
3.1 查詢
<select id="queryByCondition" resultType="User" parameterType="User">
select
<include refid="userColumns" />
from t_user
<!-- where 1=1 -->
<where>
<if test="id!=null">
and id=#{id}
</if>
<if test="name!=null">
and name=#{name}
</if>
<if test="age!=null">
and age=#{age}
</if>
</where>
</select>
@Test
public void queryUserByCondition() {
User user2 = new User();
user2.setId(1);
user2.setAge(23);
user2.setName("張三");
List<User> users = sqlSession.selectList(NAMESPACE + ".queryByCondition", user2);
for (User user : users) {
System.out.println(user);
}
sqlSession.close();
}
3.2 更新
<!-- 有必要使用set標籤,不然在進行屬性是否爲空的判斷中容易因爲‘,’出錯 -->
<update id="modifyByCondition" parameterType="User">
update t_user
<set>
<if test="name!=null">
name=#{name},
</if>
<if test="age!=null">
age=#{age},
</if>
<if test="address!=null">
address=#{address}
</if>
</set>
where id=#{id}
</update>
@Test
public void modifyUserByCondition() {
User user2 = new User();
user2.setId(1);
user2.setAge(23);
user2.setName("張三");
int num = sqlSession.update(NAMESPACE + ".modifyByCondition", user2);
System.out.println(num);
sqlSession.close();
}
4. 批量操作
4.1 批量插入數據
在sql映射文件中:
<insert id="insertDataList">
insert into t_user
(
<include refid="userColumns" />
)
values
<foreach collection="collection" item="user" separator=",">
(null,#{user.name},#{user.age},#{user.address})
</foreach>
</insert>
@Test
public void insertUserList() {
Set<User> userSets = new HashSet<User>();
for (int i = 0; i < 3; i++) {
User user = new User("Name:"+i, 20+i, "北京:"+i);
userSets.add(user);
}
int num = sqlSession.update(NAMESPACE + ".insertDataList", userSets);
sqlSession.commit();
System.out.println(num);
sqlSession.close();
}
4.2 根據id集合查詢多條數據
Sql映射文件中:
<select id="queryInList" resultType="User">
select
<include refid="userColumns" />
from t_user
<if test="collection != null & collection.size() > 0">
where id in
<foreach collection="collection" item="user" separator="," open="(" close=")">
#{user.id}
</foreach>
</if>
</select>
@Test
public void queryUserList() {
Set<User> userSets = new HashSet<User>();
for (int i = 1; i <=5; i++) {
User user = new User();
user.setId(i);
userSets.add(user);
}
List<User> users= sqlSession.selectList(NAMESPACE + ".queryInList", userSets);
for (User user : users) {
System.out.println(user);
}
sqlSession.close();
}