- mybatis簡介
- 如何使用: 入門級
- 進階教程
MyBatis ,持久層框架, 以XML 或註解的方式, 將接口和 Java 的 POJO(Plain Old Java Objects,普通的 Java對象)映射成數據庫中的記錄。
part1: 初步配置使用
(使用 idea + maven)
第一步: 創建一個module, java --> 添加maven 支持,在pom.xml中, 添加依賴
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.1</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.41</version>
</dependency>
第二步: 創建javabean類---->表和java類的映射配置: 類名Mapper.xml---> 配置數據庫連接信息: mybatis-config.xml
A, 創建package: a, 新建javabean類
public class User {
//字段
private int id;
private int age;
private String name;
private String sex;
private List<Orders> listOrders;
//構造
public User(int id ,int age, String name, String sex) {
this.age = age;
this.name = name;
this.sex = sex;
this.id=id;
}
public User() { }
//get,set
//toString()
}
B, 表和java類的映射配置: 類名Mapper.xml (放在: resources文件夾下)
<?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="users">
<insert id="insert">
insert into users2(name,sex) values(#{name},#{sex})
</insert>
<update id="update" >
update users2 set name=#{name}, sex=#{sex} where id=#{id}
</update>
<select id="selectById" resultType="a.User" >
select * from users2 where id=#{id}
</select>
<select id="selectAll" resultType="_user">
select * from users2
</select>
</mapper>
C, 配置數據庫連接信息: mybatis-config.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>
<properties>
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/db"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</properties>
<!--別名-->
<typeAliases>
<typeAlias type="a.User" alias="_user" />
<typeAlias type="a.Orders" alias="_orders" />
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="UserMapper.xml"/>
</mappers>
</configuration>
第三步: 開始使用mybatis 的java api
public class TestMybatis {
SqlSession session;
@Before
public void init() throws IOException {
//加載文件
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
//創建session
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
session = factory.openSession();
}
/**
* 插入
* @throws IOException
*/
@Test
public void t() throws IOException {
//crud
int res = session.insert("users.insert", new User(23, "insert3", "boy"));
session.commit();
session.close();
System.out.println("ok, " +res);
}
/**
* 更新
* @throws IOException
*/
@Test
public void t2() throws IOException {
//crud
int res = session.update("users.update", new User(1, 23, "updte2", "girl"));
session.commit();
session.close();
System.out.println("ok, "+ res);
}
/**
* 查詢
* @throws IOException
*/
@Test
public void t3() throws IOException {
//crud
User user = session.selectOne("users.selectById", 1);
session.commit();
session.close();
System.out.println("ok");
System.out.println(user);
}
/**
* 刪除
* @throws IOException
*/
@Test
public void t4() throws IOException {
//crud
int res = session.delete("users.delete");
session.commit();
session.close();
System.out.println("ok, "+res);
}
part2: 高級語法(多表關聯查詢)
A, 一個用戶---->多個訂單(每個訂單: 多個產品 ),關係如下
(需求1: 查詢出a用戶的所有訂單信息, 商品信息 )
(需求2: 查詢出產品p的所在訂單信息, 用戶信息)
//需求1: 解答
<select id="selectOrderListDetailsById" resultMap="map3" >
select orders2.id orderId,
orders2.user_id user_id,
orders2.product_id order_productId,
users2.id userId,
users2.name userName,
users2.sex userSex,
product.id productId,
product.name productName,
product.price productPrice
from users2
left join orders2
on users2.id=orders2.user_id
left join product
on orders2.product_id=product.id
where users2.id=#{id}
</select>
<resultMap id="map3" type="_user">
<id column="userId" property="id" ></id>
<result column="userName" property="name" ></result>
<result column="userSex" property="sex" ></result>
<collection property="listOrders" ofType="_orders" column="userId">
<id column="orderId" property="id" ></id>
<collection property="listProduct" ofType="_product" column="orderId">
<id column="id" property="productId" ></id>
<result column="productName" property="name" ></result>
<result column="productPrice" property="price" ></result>
</collection>
</collection>
</resultMap>
//需求2: 解答
<!--id | price | user_id | product -->
<!--id | name | sex-->
<select id="selectById" resultMap="map1" >
select orders2.id orderId,
orders2.user_id user_id,
orders2.product_id order_productId,
users2.id userId,
users2.name userName,
users2.sex userSex,
product.id productId,
product.name productName,
product.price productPrice
from product
left join orders2
on orders2.product_id=product.id
left join users2
on users2.id=orders2.user_id
where product.id=#{id}
</select>
<resultMap id="map1" type="_product">
<id column="productId" property="id" ></id>
<result column="productName" property="name" ></result>
<result column="productPrice" property="price" ></result>
<association property="orders" javaType="_orders">
<id column="orderId" property="id" ></id>
<association property="user" javaType="_user">
<id column="userId" property="id" ></id>
<result column="userName" property="name" ></result>
<result column="userSex" property="sex" ></result>
</association>
</association>
</resultMap>