一、创建如下五张表:
二、创建maven项目,在pom.xml里添加mariadb,junit,mybatis依赖
<dependencies>
<dependency>
<groupId>mariadb</groupId>
<artifactId>mariadb-java-client</artifactId>
<version>1.8.0</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
</dependencies>
三、在resource目录下创建一个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节点
里面有配置信息 分别是环境和映射
其中环境里有datasource,里面有我们熟悉的连接数据库的四个字符串
-->
<configuration>
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="org.mariadb.jdbc.Driver"/>
<property name="url" value="jdbc:mariadb://localhost:3306/order"/>
<property name="username" value="root"/>
<property name="password" value="yutong19970820"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="OrderMapper.xml"/>
<mapper resource="ProductMapper.xml"/>
</mappers>
</configuration>
给当前mybatis项目添加日志功能,该STDOUT_LOGGING值的好处是不用添加第三方jar包就可以有日志的输出:
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
引入db的配置文件信息,后面用到的四个连接字符串就可以直接使用如value="${driver}"的方式来动态引入:
<properties resource="db.properties">
</properties>
其中:
<mappers>
<mapper resource="OrderMapper.xml"/>
<mapper resource="ProductMapper.xml"/>
</mappers>
当进行数据操作的时候要找到调用mybatis.xml文件将数据库连接启动,然后通过mapper标签去到别的xml文件进行SQL语句的查询,不同的数据操作要加上不同的xml文件
四、先根据uid查询订单,即根据uid查询该用户的订单。在resource目录下创建一个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,
每个方法对应自己的sql语句,每个sql语句对应有一个id
整个项目中所有的namespace.id必须是唯一的
resultType:结果的数据类型
-->
<mapper namespace="orderMapper">
<!--com.qianfeng.obu.OrderByUid 定义返回类型为OrderByUid,
OrderByUid中定义的都是想要查询的属性。能得到想要查询的值-->
<select id="getOrderByUid" resultType="com.qianfeng.obu.OrderByUid">
select o.oid,u.userName,o.sumPrice,o.address,o.payType from orders as o left join users as u on u.uid=o.uid where u.uid=1
</select>
</mapper>
创建一个对象类OrderByUid,里面的属性为想要查询的值,便于打印、得到所要查询的值的对象。此时resultType的值应填该类所在路径 :
public class OrderByUid {
private int oid;
private String userName;
private double sumPrice;
private String address;
private String payType;
public int getOid() {
return oid;
}
public void setOid(int oid) {
this.oid = oid;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public double getSumPrice() {
return sumPrice;
}
public void setSumPrice(double sumPrice) {
this.sumPrice = sumPrice;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getPayType() {
return payType;
}
public void setPayType(String payType) {
this.payType = payType;
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("OrderByUid{");
sb.append("oid=").append(oid);
sb.append(", userName='").append(userName).append('\'');
sb.append(", sumPrice=").append(sumPrice);
sb.append(", address='").append(address).append('\'');
sb.append(", payType='").append(payType).append('\'');
sb.append('}');
return sb.toString();
}
}
查询SQL语句为:(以想要查询uid为1 即zhangsan的订单为例)
select o.oid,u.userName,o.sumPrice,o.address,o.payType from orders as o left join users as u on u.uid=o.uid where u.uid=1
五、测试类
public void getOrderByUid(){
OrderByUid orderByUid = session.selectOne("orderMapper.getOrderByUid");
System.out.println(orderByUid);
}
namespace+id即(orderMapper.getOrderByUid)找到的是唯一的sql语句
结果如图:
OrderByUid{oid=1, userName='zhangsan', sumPrice=50.0, address='安徽', payType='支付宝'}
六、注意事项
- OrderMapper的映射文件:
1、namespace和id在整个项目中,必须要保证唯一
2、namespace+id找到的是唯一的sql语句,标签可能不对应,但是不影响执行结果,但是还是需要规范各个标签 - 测试类
1、创建SqlSession对象的时候,SqlSessionFactory对象的openSession()方法不包含参数,则使用事务手动提交,做完增删改操作后,需要调用SqlSession对象的commit()方法完成事务的提交。如果openSession()方法包含有一个true,代表自动提交生效,我们做完增删改操作时候,就完成了对应的增删改功能。openSession()方法默认的提交方式为手动提交
2、该类活用了junit的生命周期方法,每个测试方法执行之前都会调用标注有@Before注解的setUp()方法完成环境的准备工作,每个方法完成之后都自动的执行标注有@After注解的tearDown()方法完成资源的释放工作
3、SqlSession是mybatis中的核心对象,使用该对象即可完成对于所有操作的crud功能,里面有对应的方法,selectList(),查询列表(集合),selectOne()查询单个对象,insert(),delete,update()分别对应增删改功能。这三个方法的返回值均为受影响的行数。
4、每次使用完SqlSession对象之后,使用close()方法将SqlSession对象关闭,不建议关闭SqlSessionFactory对象
5、关于传递参数
(1).传递单个值,sql语句里面的占位符可以任意写
(2).多个值,可以使用Map来传值,map中的key要与sql语句中的占位符一致
(3).对象传值,sql语句中的字段值与对象的属性名一致
(4).零散值的传递,可以使用两种方式arg0, arg1,...或者param1,param2...