1. 程式人生 > >java增強: mybatis框架

java增強: mybatis框架

  1. mybatis簡介
  2. 如何使用: 入門級
  3. 進階教程

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,   一個使用者---->多個訂單(每個訂單: 多個產品 ),關係如下, (需求: 查詢出a使用者的所有訂單資訊, 商品資訊 )

   <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>