首页 > 其他 > 详细

mybatis总结

时间:2019-03-05 00:37:02      阅读:146      评论:0      收藏:0      [点我收藏+]

mybatis面试总结:https://blog.csdn.net/a745233700/article/details/80977133

 

1. SQL映射器Mapper接口

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();
	}
}

  

 

2. MyBatis提供两种方式处理我们多表关联对象,嵌套查询和嵌套结果。

技术分享图片

 

 1.(多对一)关联映射。  (一个部门有多个用户,先从多个用户入手。

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=经理部]]

2.  (一对多,多对多)集合映射

员工和部门:

   在部门方,需要查询到当前部门下的所有员工。----集合查询

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

 

mybatis总结

原文:https://www.cnblogs.com/gshao/p/10473866.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!