MyBatis详细教程

首先看一下整体布局:

1、beans:存放pojo类,用于存放数据

     mapper:声明查询方法的接口类,xml文件时对应的mapper.xml文件-->写对数据库操作的sql语句

                  注:当mapper.xml文件放在src时必须放在对应接口同一个包,命名一致。配置文件需要指明package位置

     test:测试类

     utils:工具类,Factory得到SqlFactory,且使用的是单例方式

二、代码展示

1 mybatis.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 resource="jdbc.properties"></properties>  
	<typeAliases>                     //别名
		<package name="beans"/>
	</typeAliases> 
	<environments default="first">
		<environment id="first">
			<transactionManager type="JDBC"></transactionManager>
			<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>                      //指明映射文件位置
		<package name="mapper"/>
	</mappers>
</configuration>

2、jdbc.properties

Driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/student?characterEncoding=utf-8
username=root
password=zxc123456

3 、OrderMapper接口

package mapper;

import java.util.List;

import beans.Order;

public interface OrderMapper {
        //查询返回集合
	public List<Order> select();
	
        //一对一查询
	public List<Order> selectOnetoOne();
}

对应的OrderMapper.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="mapper.OrderMapper">
<!-- 字段名字不一样  column是数据库字段,property是实体类属性-->
	<resultMap type="beans.Order" id="result">
                <!-- id标签是主键,其他的是result -->
		<result column="userId" property="user_Id"/>
	</resultMap>
<!-- 数据库字段与类属性名不一致用resultMap,一致用resultType -->
	<select id="select" resultMap="result">
		select * from student.order
	</select>
	
	<!-- 一对一映射 此映射需要把全部字段属性配置在resultMap -->
	<resultMap type="order" id="selector2">
		<id column="orderId" property="orderId"/>
		<result column="userId" property="user_Id"/>
		<result column="number" property="number"/>
		
		<association property="user" javaType="User">
			<result column="stuName" property="stuName"/>
		</association>
	</resultMap>
<!-- 查询的时候要在表前写上数据库名字 -->
	<select id="selectOnetoOne" resultMap="selector2">
		select o.orderId,o.userId,o.number,u.stuName from student.order o left join student u on o.userId=u.stuId
	</select>
</mapper>

对应的测试类

package test;

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

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.junit.Test;

import beans.Order;
import beans.QueryVo;
import beans.User;
import mapper.OrderMapper;
import mapper.UserMapper;
import utils.Factory;

public class QueryTest {
	//通过Id查询信息
	@Test
	public void queryTest() throws IOException
	{								//getFactory是静态方法,可以直接类名调用
		SqlSessionFactory factory = Factory.getFactory();	
		SqlSession session =factory.openSession();
		UserMapper mapper =session.getMapper(UserMapper.class);
		
		User user = mapper.query(1);
		System.out.println(user);
		session.close();
	}
	
	//通过名字模糊查询信息    mapper动态
	@Test
	public void test() throws IOException 
	{
		User user = new User();
		QueryVo queryVo = new QueryVo();
		user.setStuName("王");
		queryVo.setUser(user);
		
		SqlSessionFactory sessionFactory = Factory.getFactory();
		SqlSession openSession = sessionFactory.openSession();
		UserMapper mapper = openSession.getMapper(UserMapper.class);
		List<User> list = mapper.queryBao(queryVo);
		for (User user2 : list) {
			System.out.println(user2);
		}
		openSession.close();
	}
	
	//数据库属性名与实体类属性名字不一样时候查询信息
	@Test
	public void test1() throws IOException {
		SqlSessionFactory factory = Factory.getFactory();
		SqlSession session = factory.openSession();
		OrderMapper mapper = session.getMapper(OrderMapper.class);
		List<Order> order = mapper.select();
		for (Order or : order) {
			System.out.println(or);
		}
		session.close();
	}
	
	//通过姓名和性别查询信息(存在null可能性)
	@Test
	public void test2() throws IOException 
	{
		SqlSessionFactory sessionFactory =Factory.getFactory();
		SqlSession openSession = sessionFactory.openSession();
		UserMapper mapper = openSession.getMapper(UserMapper.class);
		
		User user = new User();
//		user.setStuName("王优秀");
		user.setStuGender("女");;
		List<User> queryByNameAndSex = mapper.queryByNameAndSex(user);
		System.out.println(queryByNameAndSex.toString());
		openSession.close();
	}

	//多个id查询信息
	@Test
	public void test3() throws IOException {
		QueryVo vo = new QueryVo();
//		List<Integer> list = new ArrayList<>();
//		list.add(1);
//		list.add(10);
//		list.add(20);
//		vo.setList(list);
		Integer[] ids =new Integer[3];
		ids[0]=1;
		ids[1]=10;
		ids[2]=20;
		vo.setIds(ids);
		
		SqlSessionFactory sessionFactory = Factory.getFactory();
		SqlSession openSession = sessionFactory.openSession();
		UserMapper mapper = openSession.getMapper(UserMapper.class);
		List<User> queryByidsVo = mapper.queryByidsVo(vo);
		for (User user : queryByidsVo) {
			System.out.println(user);
		}
		openSession.close();
	}

	//多个id查询信息2
		@Test
		public void test4() throws IOException {
			Integer[] ids =new Integer[3];
			ids[0]=1;
			ids[1]=10;
			ids[2]=20;
			
			List<Integer> list=new ArrayList<>();
			list.add(1);
			list.add(10);
			
			
			SqlSessionFactory sessionFactory = Factory.getFactory();
			SqlSession openSession = sessionFactory.openSession();
			UserMapper mapper = openSession.getMapper(UserMapper.class);
			List<User> queryByidsVo = mapper.queryByIdsList(list);
			for (User user : queryByidsVo) {
				System.out.println(user);
			}
			openSession.close();
		}
}

4 UserMapper接口类

package mapper;

import java.util.List;

import beans.QueryVo;
import beans.User;

public interface UserMapper {
	
public User query(int id);
	//通过包装类查询
	public List<User> queryBao(QueryVo vo);
	
        //通过bean实现多条件查询
	public List<User> queryByNameAndSex(User user);
	
        //数组、集合、包装类作为入参查询
	public List<User> queryByIds(Integer[] ids);
	public List<User> queryByIdsList(List<Integer> ids);
	public List<User> queryByidsVo(QueryVo vos);
	
	public List<User> queryByDuoToOne();
}

对应的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">
<mapper namespace="mapper.UserMapper">

	<sql id="selector">
		select * from student
	</sql>
<!-- #{}、${}区别:#表占位符,$起到连接作用,可以用在引号内 -->
<!-- stuId=#{v} 中{}内随意,${}括号内必须是value -->
	<select id="query" parameterType="int" resultType="beans.User">
		 select * from student where stuId=#{v}
	</select>
	
	<!-- 包装类入参 -->
	<select id="queryBao" parameterType="beans.QueryVo" resultType="beans.User">
		select * from student where stuName like '%${user.stuName}%'
	</select>
	
	<!-- 通过姓名和性别查询信息,if可以判断是否满足条件,where可以删除前面的and,也就是说and要放在后面哪个条件中 -->
	<select id="queryByNameAndSex" parameterType="user" resultType="user">
		<include refid="selector"/> 
		<where>
		<if test="stuName != null and stuName !=''">
		stuName=#{stuName}
		</if>
		<if test="stuGender !=null and stuGender !=''">
		and stuGender = #{stuGender}  
		</if>
		</where>            
	</select>
	
	<!-- 多个id查询    foreach -->
	<select id="queryByidsVo" parameterType="queryvo" resultType="user">
		<include refid="selector"/>
		<where>
			<foreach collection="ids" item="id" separator="," open="stuId in(" close=")">
				#{id}
			</foreach>
		</where>
	</select>
	<select id="queryByIdsList" resultType="user">
		<include refid="selector"/>
		<where>
		<!-- 数组array,List对应list -->
			<foreach collection="list" item="id" separator="," open="stuId in(" close=")">
				#{id}
			</foreach>
		</where>
	</select>
	
	<!-- 一对多映射 -->
	<resultMap type="user" id="selector3">
		<id column="stuId" property="stuId"/>
		<result column="stuName" property="stuName"/>
		<result column="stuAge" property="stuAge"/>
		<result column="stuGender" property="stuGender"/>
		
		<collection property="listOrder" ofType="order">
			<id column="orderId" property="orderId"/>
		</collection>
	</resultMap>
	
	<select id="queryByDuoToOne" resultMap="selector3">
		select u.*,o.orderId from student u left join student.order o on u.stuId = o.userId
	</select>
</mapper>

测试类:

package test;

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

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.junit.Test;

import beans.Order;
import beans.User;
import mapper.OrderMapper;
import mapper.UserMapper;
import utils.Factory;

public class QueryTest2 {
	//一对一查询
	@Test
	public void queryTest() throws IOException
	{
		SqlSessionFactory factory = new Factory().getFactory();	
		SqlSession session =factory.openSession();
		OrderMapper mapper =session.getMapper(OrderMapper.class);
		
		List<Order> selectOnetoOne = mapper.selectOnetoOne();
		for (Order order : selectOnetoOne) {
			System.out.println(order);
		}
	}
	
	@Test
	public void queryTest2() throws IOException{
		SqlSessionFactory factory = new Factory().getFactory();	
		SqlSession session =factory.openSession();
		UserMapper mapper =session.getMapper(UserMapper.class);
		
		List<User> queryByDuoToOne = mapper.queryByDuoToOne();
		for (User user : queryByDuoToOne) {
			System.out.println(user);
		}
	}
}

5 Factory

package utils;

import java.io.IOException;
import java.io.InputStream;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class Factory {
	private static SqlSessionFactory factory=null;

	public static SqlSessionFactory getFactory() throws IOException {
		if(factory==null) {
			InputStream in = Resources.getResourceAsStream("mybatis.xml");
			SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
			factory =builder.build(in);
		}
		return factory;
	}	
}

6、beans类

Order.class

package beans;

public class Order {
	private int orderId;
	private int user_Id;
	private int number;
	
	//一对一映射
	private User user;
	
	
	public User getUser() {
		return user;
	}
	public void setUser(User user) {
		this.user = user;
	}
	public int getOrderId() {
		return orderId;
	}
	public void setOrderId(int orderId) {
		this.orderId = orderId;
	}
	public int getUser_Id() {
		return user_Id;
	}
	public void setUser_Id(int user_Id) {
		this.user_Id = user_Id;
	}
	public int getNumber() {
		return number;
	}
	public void setNumber(int number) {
		this.number = number;
	}
	@Override
	public String toString() {
		return "Order [orderId=" + orderId + ", user_Id=" + user_Id + ", number=" + number + ", user=" + user + "]";
	}
	
	
	
}

QueryVo.class

package beans;

import java.util.List;

public class QueryVo {
	private User user;
	
	Integer[] ids;
	
	List<Integer> list;
	
	
	public Integer[] getIds() {
		return ids;
	}

	public void setIds(Integer[] ids) {
		this.ids = ids;
	}

	public List<Integer> getList() {
		return list;
	}

	public void setList(List<Integer> list) {
		this.list = list;
	}

	public User getUser() {
		return user;
	}

	public void setUser(User user) {
		this.user = user;
	}
	
}

User.class

package beans;

import java.util.List;

public class User{
	String stuName;
	int stuAge;
	int stuId;
	String stuGender;
	
	List<Order> listOrder;
	public int getOrderId() {
		int OrderId=0;
		for (Order order : listOrder) {
			 OrderId=order.getOrderId();
		}
		return OrderId;
	}
	
	public String getStuName() {
		return stuName;
	}
	public void setStuName(String stuName) {
		this.stuName = stuName;
	}
	public int getStuAge() {
		return stuAge;
	}
	public void setStuAge(int stuAge) {
		this.stuAge = stuAge;
	}
	public int getStuId() {
		return stuId;
	}
	public void setStuId(int stuId) {
		this.stuId = stuId;
	}
	public String getStuGender() {
		return stuGender;
	}
	public void setStuGender(String stuGender) {
		this.stuGender = stuGender;
	}
	@Override
	public String toString() {
		return "User [stuName=" + stuName + ", stuAge=" + stuAge + ", stuId=" + stuId + ", stuGender=" + stuGender
				+ ", listOrder=" +getOrderId()+ "]";
	}
	
	
	
}

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值