首先看一下整体布局:
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()+ "]";
}
}