MyBatis基于代理机制,可以让我们无需再编写Dao的实现。直接把以前的dao接口定义成符合规则的Mapper。
注意事项:
① :接口必须Mapper结尾,名字是DomainMapper
② :mapper.xml文件要和Mapper接口建立关系,通过namespace:要能连接到Mapper接口
③ : User get(Long id)返回值,方法,参数类型等必须使:Mapper接口和mapper.xml保持一致

具体步骤代码如下:
1. 核心配置文件:mybatis-config.xml 及 db.properties
<?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>
<!-- 引入db.properties -->
<properties resource="db.properties"></properties>
<!-- 环境们的配置 -->
<environments default="development">
<!--环境的配置: -->
<environment id="development">
<!--使用jdbc方式管理事务 -->
<transactionManager type="JDBC" />
<!-- 数据源的四大配置 -->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</dataSource>
</environment>
</environments>
<!-- 注册对象关系映射文件 -->
<mappers>
<mapper resource="com/gs/domain/UserMapper.xml"/>
</mappers>
</configuration>
db.properties 文件
jdbc.driverClassName = com.mysql.jdbc.Driver jdbc.url = jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=UTF-8 jdbc.username = root jdbc.password = root
2. 创建sqlSession 对象的工具类:MyBatisUtils.java
package com.gs.tools;
import java.io.IOException;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class MyBatisUtils {
private static SqlSessionFactory factory= null;
static {
try {
factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSession getSession(){
return factory.openSession();
}
}
3. User.java 三个字段。
public class User {
private Long id;
private String username;
private String password;
......getter setter 无参 有参,toString()
}
4. UserMapper 接口
public interface UserMapper {
//得到一个用户
User get(Long id);
// 得到所有用户
List<User> getAll();
//批量删除用户
void deleteBatch(List<Long> list);
//批量插入用户
void insertBatch(List<User> lists);
}
5.UserMapper.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">
<!-- 使用sql映射器Mapper接口的方式
namespace的值 是 对应接口的全限定名称
-->
<mapper namespace="com.gs.mapper.UserMapper">
<!-- 得到一个用户 -->
<select id="get" parameterType="long" resultType="com.gs.domain.User">
select * from user where id = #{?}
</select>
<!--得到所有用户 -->
<select id="getAll" resultType="com.gs.domain.User">
select * from user
</select>
<!--批量删除用户 -->
<delete id="deleteBatch" parameterType="list">
delete from user where id in
<foreach collection="list" index="index" open="(" separator="," close=")" item="ids">
#{ids}
</foreach>
</delete>
<!-- 批量插入用户 -->
<insert id="insertBatch" parameterType="list">
insert into user(id,username,password)
values
<foreach collection="list" item="item" index="index" separator=",">
(#{item.id},#{item.username},#{item.password})
</foreach>
</insert>
</mapper>
6.测试类 testMybatis.java
package com.gs.test;
import java.util.ArrayList;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import com.gs.domain.User;
import com.gs.mapper.UserMapper;
import com.gs.tools.MyBatisUtils;
public class testMybatis{
@Test
public void getuser(){
SqlSession session = MyBatisUtils.getSession();
//获取UserMapper接口的对象
UserMapper userMapper = session.getMapper(UserMapper.class);
//namespace = 接口全限定名称 +.+ 方法名
User user = userMapper.get(1L);
System.out.println(user);
}
@Test
public void getAllUser(){
SqlSession session = MyBatisUtils.getSession();
UserMapper userMapper = session.getMapper(UserMapper.class);
List<User> users = userMapper.getAll();
System.out.println(users);
}
@Test
public void deleteBatchUser(){
SqlSession session = MyBatisUtils.getSession();
UserMapper userMapper = session.getMapper(UserMapper.class);
List<Long> lists = new ArrayList<>();
lists.add(2L);
lists.add(3L);
userMapper.deleteBatch(lists);
session.commit();//提交事务
session.close();
}
@Test
public void insertBatchUser(){
SqlSession session = MyBatisUtils.getSession();
UserMapper userMapper = session.getMapper(UserMapper.class);
List<User> lists = new ArrayList<>();
lists.add(new User(null,"樊俊杰","456"));
lists.add(new User(null,"樊太快了","789"));
userMapper.insertBatch(lists);
session.commit();//提交事务
session.close();
}
}

1. User 和 Dept 实体类
public class User {
private Long id;
private String name;
private String password;
private Dept dept;
}
public class Dept {
private Long id;
private String name;
}
2. DomainMapper.xml
<!-- 单向多对一嵌套结果(发一条左外连接sql解决问题,映射文件Mapper结果的手动封装ResultMap)
使用嵌套结果映射来处理重复的联合(association)结果的子集。
-->
<select id="getUser1" resultMap="many2oneMap">
select u.id, u.name, u.password, d.id did, d.name dname
from t_user u left join t_dept d on u.dept_id=d.id;
</select>
<!-- 封装查询的User结果 -->
<resultMap type="com.gs.manytoone.User" id="many2oneMap">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="password" property="password"/>
<!--user的dept属性是一个对象Dept,使用联合查询关键字来封装 association:联合查询-->
<association property="dept" javaType="com.gs.manytoone.Dept">
<id column="did" property="id"/>
<result column="dname" property="name"/>
</association>
</resultMap>
<!-- 单向多对一嵌套查询(先查询多方User,使用ResultMap来封装结果,在结果里,再通过User的dept属性,再查一次Dept对象.)
-->
<select id="getUser2" resultMap="many2oneList">
select id,name,password,dept_id from t_user;
</select>
<select id="getDeptById" parameterType="long" resultType="com.gs.manytoone.Dept">
select id,name from t_dept where id= #{id}
</select>
<resultMap type="com.gs.manytoone.User" id="many2oneList">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="password" property="password"/>
<association property="dept" column="dept_id"
select="com.gs.manytoone.DomainMapper.getDeptById">
</association>
</resultMap>
3. 测试类
@Test
public void getUser1() {
SqlSession session = MyBatisUtils.getSession();
List<User> users = session.selectList("com.gs.manytoone.DomainMapper.getUser1");
for (User user : users) {
System.out.println(user);
}
session.commit();
session.close();
}
@Test
public void getUser2() {
SqlSession session = MyBatisUtils.getSession();
List<User> users = session.selectList("com.gs.manytoone.DomainMapper.getUser2");
for (User user : users) {
System.out.println(user);
}
session.commit();
session.close();
}
4.查询的结果:
User [id=1, name=张三, password=123456, dept=Department [id=1, name=财务部]]
User [id=2, name=李四, password=111, dept=Department [id=1, name=财务部]]
User [id=3, name=五五, password=123, dept=Department [id=2, name=后勤部]]
User [id=4, name=周六, password=122, dept=Department [id=3, name=经理部]]
User [id=5, name=周七, password=12332, dept=Department [id=3, name=经理部]]
员工和部门:
在部门方,需要查询到当前部门下的所有员工。----集合查询
1. User 和 Dept 实体类
public class User {
private Long id;
private String name;
private String password;
}
public class Dept {
private Long id;
private String name;
private Set<User> users = new HashSet<>();
}
2. DomainMapper.xml
<!-- 单向一对多嵌套结果(一条sql语句) -->
<select id="getDept1" resultMap="one2manyMap">
select d.id did, d.name dname, u.id, u.name, u.password
from t_dept d left join t_user u
on d.id=u.dept_id order by d.id
</select>
<resultMap type="com.gs.onetomany.Dept" id="one2manyMap">
<id column="did" property="id"/>
<result column="dname" property="name"/>
<collection property="users" ofType="com.gs.onetomany.User">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="password" property="password"/>
</collection>
</resultMap>
<!-- 单向一对多嵌套查询(先查询多个Dept,使用ResultMap来封装结果,在结果里,再通过Dept的users属性,再查一次User对象.) -->
<select id="getDept2" resultMap="one2manyList">
select d.id did , d.name dname from t_dept d
</select>
<select id="getUserById" parameterType="long" resultType="com.gs.onetomany.User">
select id,name,password from t_user where dept_id=#{?}
</select>
<resultMap type="com.gs.onetomany.Dept" id="one2manyList">
<id column="did" property="id"/>
<result column="dname" property="name"/>
<collection property="users" column="did"
select="com.gs.onetomany.DomainMapper.getUserById">
</collection>
</resultMap>
3. 测试类
@Test
public void getUser1() {
SqlSession session = MyBatisUtils.getSession();
List<Dept> allDept = session.selectList("com.gs.onetomany.DomainMapper.getDept1");
for (Dept dept : allDept) {
System.out.println(dept);
}
session.commit();
session.close();
}
@Test
public void getUser2() {
SqlSession session = MyBatisUtils.getSession();
List<Dept> allDept = session.selectList("com.gs.onetomany.DomainMapper.getDept2");
for (Dept dept : allDept) {
System.out.println(dept);
}
session.commit();
session.close();
}
4.查询的结果:
Dept [id=1, name=财务部, users=[User [id=2, name=李四, password=111], User [id=1, name=张三, password=123456]]]
Dept [id=2, name=后勤部, users=[User [id=3, name=五五, password=123]]]
Dept [id=3, name=经理部, users=[User [id=5, name=周七, password=12332], User [id=4, name=周六, password=122]]]
原文:https://www.cnblogs.com/gshao/p/10473866.html