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>

浙公网安备 33010602011771号