mybatis

实例一

EmployeeMapper.java

package mybatis.mapper;

import mybatis.pojo.Employee;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

public interface EmployeeMapper {
    public Employee getEmployeeById(int id);
    public int deleteEmployeeById(int id);
    public List<Employee> queryBySalary(Double salary);
    public int insertEmployee(Employee employee);
    public List<Employee> queryByNameAndSalary(@Param("a") String name, @Param("b") Double salary);
    public int insertEmpMap(Map data);
}

Employee.java

package mybatis.pojo;

public class Employee {
    private int empId;
    private String empName;
    private Double empSalary;

    @Override
    public String toString() {
        return "Employee{" +
                "empId=" + empId +
                ", empName='" + empName + '\'' +
                ", empSalary=" + empSalary +
                '}';
    }

    public int getEmpId() {
        return empId;
    }

    public void setEmpId(int empId) {
        this.empId = empId;
    }

    public String getEmpName() {
        return empName;
    }

    public void setEmpName(String empName) {
        this.empName = empName;
    }

    public Double getEmpSalary() {
        return empSalary;
    }

    public void setEmpSalary(Double empSalary) {
        this.empSalary = empSalary;
    }
}

EmployeeMapper.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.mapper.EmployeeMapper">
    <select id="getEmployeeById" resultType="mybatis.pojo.Employee">
        select emp_id empId,emp_name empName,emp_salary empSalary from t_emp where emp_id=#{id}
    </select>
    <delete id="deleteEmployeeById">
        select from t_emp where emp_id=#{id};
    </delete>
    <select id="queryBySalary" resultType="mybatis.pojo.Employee">
        select emp_id empId,emp_name empName,emp_salary empSalary from t_emp where emp_salary=#{salary}
    </select>
    <insert id="insertEmployee">
        insert into t_emp(emp_name,emp_salary) values (#{empName},#{empSalary});
    </insert>
    <select id="queryByNameAndSalary" resultType="mybatis.pojo.Employee">
        select emp_id empId,emp_name empName,emp_salary empSalary from t_emp where emp_salary=#{b} and emp_name=#{a};
    </select>
    <insert id="insertEmpMap">
    insert into t_emp(emp_name,emp_salary) values (#{name},#{salary});
</insert>

</mapper>

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>
    <!--
        这些属性可以在外部进行配置,并可以进行动态替换。
        你既可以在典型的 Java 属性文件中配置这些属性,也可以在 properties 元素的子元素中设置
    -->
    <!--
        MyBatis 可以配置成适应多种环境,这种机制有助于将 SQL 映射应用于多种数据库之中, 现实情况下有多种理由需要这么做。
        例如,开发、测试和生产环境需要有不同的配置;或者想在具有相同 Schema 的多个生产数据库中使用相同的 SQL 映射。还有许多类似的使用场景。
    -->
    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
    <!--默认使用的环境 ID(比如:default="development")。-->
    <environments default="development">
        <!--每个 environment 元素定义的环境 ID(比如:id="development")。-->
        <environment id="development">
            <!--事务管理器的配置(比如:type="JDBC")。-->
            <!--
                事务管理器(transactionManager)
                在 MyBatis 中有两种类型的事务管理器(也就是 type="[JDBC|MANAGED]"):
                JDBC – 这个配置直接使用了 JDBC 的提交和回滚设置,它依赖从数据源获得的连接来管理事务作用域。
                MANAGED – 这个配置几乎没做什么。它从不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。
                默认情况下它会关闭连接。然而一些容器并不希望连接被关闭,因此需要将 closeConnection 属性设置为 false 来阻止默认的关闭行为。
                如果你正在使用 Spring + MyBatis,则没有必要配置事务管理器,因为 Spring 模块会使用自带的管理器来覆盖前面的配置。
                这两种事务管理器类型都不需要设置任何属性。它们其实是类型别名,换句话说,你可以用 TransactionFactory 接口实现类的全限定名或类型别名代替它们。
            -->
            <transactionManager type="JDBC"/>
            <!--数据源的配置(比如:type="POOLED")-->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/xyz"/>
                <property name="username" value="root"/>
                <property name="password" value="20050606a"/>
            </dataSource>
        </environment>
    </environments>
    <!--
     既然 MyBatis 的行为已经由上述元素配置完了,我们现在就要来定义 SQL 映射语句了。
     但首先,我们需要告诉 MyBatis 到哪里去找到这些语句。
     在自动查找资源方面,Java 并没有提供一个很好地解决方案,所以最好的办法是直接告诉 MyBatis 到哪里去找映射文件。
     你可以使用相对于类路径的资源引用,或完全限定资源定位符(包括 file:/// 形式的 URL),或类名和包名等。
    -->
    <mappers>
        <!-- 使用相对于类路径的资源引用 -->
        <!--单独加载某个映射配置文件-->
        <!--<mapper resource="mybatis/mapper/PersonMapper.xml"/>-->
        <!-- 使用完全限定资源定位符(URL) -->
        <!--<mapper url="file:///home/lhz/Documents/code/mybatis/src/main/resources/mybatis/mapper/PersonMapper.xml"/>-->
        <!--<mapper url="file:///D:/mybatis/src/main/resources/cn/lhz/mapper/PersonMapper.xml"/>-->
        <!--加载某包下所有的映射配置文件-->
        <mapper resource="mappers/EmployeeMapper.xml"></mapper>
    </mappers>
</configuration>

实例2

package mybatis.mapper;

import mybatis.pojo.Customer;

import java.util.List;

public interface CustomerMapper {
    List<Customer> queryList();
}
package mybatis.mapper;

import mybatis.pojo.Order;

public interface OrderMapper {
    Order queryOrderById(Integer id);
}
package mybatis.pojo;

import lombok.Data;

import java.util.List;

@Data
public class Customer {
    private int customer_id;
    private String customer_name;
    private List<Order> orderList;
}
package mybatis.pojo;

import lombok.Data;

@Data
public class Order {
    private Integer orderId;
    private String orderName;
    private Integer customerId;
    private Customer customer;
}
<?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.mapper.CustomerMapper">
    <resultMap id="customerMap" type="mybatis.pojo.Customer">
        <id column="customer_id" property="CustomerId"/>
        <result column="customer_name" property="CustomerName"/>
        <collection property="orderList" ofType="mybatis.pojo.Order">
            <id column="order_id" property="orderId"/>
            <result column="order_name" property="orderName"/>
            <result column="customer_id" property="customerId"/>
        </collection>
    </resultMap>

    <select id="queryList" resultMap="customerMap">
        select * from t_order tor JOIN t_customer tur on tor.customer_id=tur.customer_id;
    </select>

</mapper>

<?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.mapper.OrderMapper">
    <resultMap id="orderMap" type="mybatis.pojo.Order">
        <id column="order_id" property="orderId"/>
        <result column="order_name" property="orderName"/>
        <result column="customer_id" property="customerId"/>
        <association property="customer" javaType="mybatis.pojo.Customer">
            <id column="customer_id" property="customerId"/>
            <result column="customer_name" property="customerName"/>
        </association>
    </resultMap>
    <select id="queryOrderById" resultMap="orderMap">
        select * from t_order tor JOIN t_customer tur on tor.customer_id=tur.customer_id where tor.order_id=#{id};
    </select>
</mapper>

<?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>
    <!--
        这些属性可以在外部进行配置,并可以进行动态替换。
        你既可以在典型的 Java 属性文件中配置这些属性,也可以在 properties 元素的子元素中设置
    -->
    <!--
        MyBatis 可以配置成适应多种环境,这种机制有助于将 SQL 映射应用于多种数据库之中, 现实情况下有多种理由需要这么做。
        例如,开发、测试和生产环境需要有不同的配置;或者想在具有相同 Schema 的多个生产数据库中使用相同的 SQL 映射。还有许多类似的使用场景。
    -->
    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
        <setting name="autoMappingBehavior" value="FULL"/>
    </settings>
    <!--默认使用的环境 ID(比如:default="development")。-->
    <environments default="development">
        <!--每个 environment 元素定义的环境 ID(比如:id="development")。-->
        <environment id="development">
            <!--事务管理器的配置(比如:type="JDBC")。-->
            <!--
                事务管理器(transactionManager)
                在 MyBatis 中有两种类型的事务管理器(也就是 type="[JDBC|MANAGED]"):
                JDBC – 这个配置直接使用了 JDBC 的提交和回滚设置,它依赖从数据源获得的连接来管理事务作用域。
                MANAGED – 这个配置几乎没做什么。它从不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。
                默认情况下它会关闭连接。然而一些容器并不希望连接被关闭,因此需要将 closeConnection 属性设置为 false 来阻止默认的关闭行为。
                如果你正在使用 Spring + MyBatis,则没有必要配置事务管理器,因为 Spring 模块会使用自带的管理器来覆盖前面的配置。
                这两种事务管理器类型都不需要设置任何属性。它们其实是类型别名,换句话说,你可以用 TransactionFactory 接口实现类的全限定名或类型别名代替它们。
            -->
            <transactionManager type="JDBC"/>
            <!--数据源的配置(比如:type="POOLED")-->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/xyz"/>
                <property name="username" value="root"/>
                <property name="password" value="20050606a"/>
            </dataSource>
        </environment>
    </environments>
    <!--
     既然 MyBatis 的行为已经由上述元素配置完了,我们现在就要来定义 SQL 映射语句了。
     但首先,我们需要告诉 MyBatis 到哪里去找到这些语句。
     在自动查找资源方面,Java 并没有提供一个很好地解决方案,所以最好的办法是直接告诉 MyBatis 到哪里去找映射文件。
     你可以使用相对于类路径的资源引用,或完全限定资源定位符(包括 file:/// 形式的 URL),或类名和包名等。
    -->
    <mappers>
        <!-- 使用相对于类路径的资源引用 -->
        <!--单独加载某个映射配置文件-->
        <!--<mapper resource="mybatis/mapper/PersonMapper.xml"/>-->
        <!-- 使用完全限定资源定位符(URL) -->
        <!--<mapper url="file:///home/lhz/Documents/code/mybatis/src/main/resources/mybatis/mapper/PersonMapper.xml"/>-->
        <!--<mapper url="file:///D:/mybatis/src/main/resources/cn/lhz/mapper/PersonMapper.xml"/>-->
        <!--加载某包下所有的映射配置文件-->
<!--        <mapper resource="mappers/OrderMapper.xml"></mapper>-->
        <mapper resource="mappers/CustomerMapper.xml"></mapper>
    </mappers>
</configuration>
import mybatis.mapper.CustomerMapper;
import mybatis.pojo.Customer;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import java.io.IOException;
import java.util.List;

public class OrderTest {
   private SqlSession sqlSession;
    @BeforeEach
    public void init() throws IOException {
      sqlSession = new SqlSessionFactoryBuilder().build(
                Resources.getResourceAsStream("mybatis-config.xml")
        ).openSession();
    }
    @Test
    public void test() throws IOException {
        CustomerMapper mapper = sqlSession.getMapper(CustomerMapper.class);
        List<Customer> customers = mapper.queryList();
        for (Customer customer : customers) {
            System.out.println(customer);
        }
    }
    @AfterEach
    public void destory() {
        sqlSession.close();
    }
}

动态SQL

if

<select id="findActiveBlogWithTitleLike"
     resultType="Blog">
  SELECT * FROM BLOG
  WHERE state = ‘ACTIVE’
  <if test="title != null">
    AND title like #{title}
  </if>
</select>
<select id="findActiveBlogLike"
     resultType="Blog">
  SELECT * FROM BLOG WHERE state = ‘ACTIVE’
  <if test="title != null">
    AND title like #{title}
  </if>
  <if test="author != null and author.name != null">
    AND author_name like #{author.name}
  </if>
</select>

choose、when、otherwise

<select id="findActiveBlogLike"
     resultType="Blog">
  SELECT * FROM BLOG WHERE state = ‘ACTIVE’
  <choose>
    <when test="title != null">
      AND title like #{title}
    </when>
    <when test="author != null and author.name != null">
      AND author_name like #{author.name}
    </when>
    <otherwise>
      AND featured = 1
    </otherwise>
  </choose>
</select>

where

<select id="findActiveBlogLike"
     resultType="Blog">
  SELECT * FROM BLOG
  <where>
    <if test="state != null">
         state = #{state}
    </if>
    <if test="title != null">
        AND title like #{title}
    </if>
    <if test="author != null and author.name != null">
        AND author_name like #{author.name}
    </if>
  </where>
</select>
<trim prefix="WHERE" prefixOverrides="AND |OR ">
  ...
</trim>

set

<update id="updateAuthorIfNecessary">
  update Author
    <set>
      <if test="username != null">username=#{username},</if>
      <if test="password != null">password=#{password},</if>
      <if test="email != null">email=#{email},</if>
      <if test="bio != null">bio=#{bio}</if>
    </set>
  where id=#{id}
</update>
<trim prefix="SET" suffixOverrides=",">
  ...
</trim>

foreach

<select id="batchFind" resultType="student" parameterType="list">
        SELECT * FROM student WHERE id in
        <foreach collection="list" item="item" open="(" separator="," close=")">
          #{item}
        </foreach>
</select>

sql

<select id="findUser" parameterType="user" resultType="user">
	SELECT * FROM user
	<include refid="whereClause"/>
</select>

<sql id="whereClause">
     <where>
         <if test="user != null">
         	AND username like '%${user.name}%'
         </if>
     </where>
</sql>

bind

<select id="selectBlogsLike" resultType="Blog">
  <bind name="pattern" value="'%' + _parameter.getTitle() + '%'" />
  SELECT * FROM BLOG
  WHERE title LIKE #{pattern}
</select>
posted @ 2025-03-19 22:23  LuoboWang  阅读(20)  评论(0)    收藏  举报