复习环境搭建
Test01
public class Test01 {
@Test
public void test01(){
//Mybastis是对 jdbc的封装 配置pom.xml依赖
//MySessionUtil SqlSession是Mybatis的核心 获取Session对象 update,select,delete,insert, getMapper()
//读写数据库需要数据的四大信息,mybatis将写在核心配置文件中
//准备数据库与表,还有表中的数据user order
//准备log4j.properties
SqlSession session = MySessionUtils.getSession();
System.out.println(session);
//关闭资源
session.commit();
session.close();
}
}
pom.xml
<!-- 1:依赖配置 -->
<dependencies>
<!-- junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!-- MySql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.32</version>
</dependency>
<!-- Mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<!--日志包-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
src\main\java\com\wzx\util\MySessionUtils.java
//Session工具类
public class MySessionUtils {
private static SqlSessionFactory sessionFactory;
//static 静态代码,在类加载的时候执行一次,且只执行一次
static{
// 》1 创建SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
// 》2 创建SqlSessionFactory对象
InputStream inputStream = MySessionUtils.class.getClassLoader().getResourceAsStream("SqlMapConfig.xml");
sessionFactory = sqlSessionFactoryBuilder.build(inputStream);//加载核心配置文件 参1 输入流
// 》3 加载SqlMapConfig.xml配置文件
}
public static SqlSession getSession() {
// 》4 创建SqlSession对象
SqlSession sqlSession = sessionFactory.openSession();
return sqlSession;
}
}
src\main\resources\SqlMapConfig.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>
<typeAliases>
<package name="com.wzx.bean"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!-- 四大信息 -->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis02?characterEncoding=utf-8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!-- 一个mapper标签可以指定一个映射文件-->
<mappers>
<!-- <mapper resource="UserMapper.xml"/>-->
<!-- <mapper resource="com/wzx/dao/UserDao.xml"/>-->
</mappers>
</configuration>
准备数据库
create database mybatis02;
use mybatis02;
create database day13 default charset='UTF8';
use day13;
create table user (
id int(11) primary key auto_increment,
username varchar(32) not null comment '用户名称',
birthday date default null comment '生日',
sex char(1) default null comment '性别',
address varchar(256) default null comment '地址'
);
insert into `user` values (null, '王五', '2015-05-10', '2', null);
insert into `user` values (null, '张三', '2014-07-10', '1', '北京市');
insert into `user` values (null, '张小明', '2018-11-11', '1', '郑州');
insert into `user` values (null, '陈小明', '2019-07-20', '1', '广州');
insert into `user` values (null, '张三丰', '2011-04-11', '1', '西安');
insert into `user` values (null, '陈小明', '2019-09-10', '2', '杭州');
insert into `user` values (null, '王五', '2014-07-07', null, null);
#创建订单表
create table `order`(
id int primary key auto_increment,
user_id int not null ,
number varchar(50) not null,
createtime datetime not null,
note varchar(100) default null,
constraint FK_order_id foreign key (user_id) references user(id)
);
insert into `order` values ('3', '1', '1000010', '2018-02-04 13:22:35', '备注3');
insert into `order` values ('4', '1', '1000011', '2017-02-03 13:22:41', null);
insert into `order` values ('5', '5', '1000012', '2019-02-12 16:13:23', null);
insert into `order` values ('6', '6', '1000012', '2025-02-12 16:13:23', null);
insert into `order` values ('7', '7', '1000012', '2020-02-12 16:13:23', null);
src\main\resources\log4j.properties
# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
查询所有的订单数据
编写业务逻辑
SqlSession session = MySessionUtils.getSession();
//搜索方法--》sql语句
OrderDao dao = session.getMapper(OrderDao.class);//getMapper对接口使用动态代理技术实现,直接返回个实现类对象
List<Order> list = dao.findAll();
System.out.println(list);
//关闭资源
session.commit();
session.close();
定义实体类
public class Order {
// 订单id
private int id;
// 用户id
private Integer userId;
// 订单号
private String number;
// 订单创建时间
private Date createtime;
// 备注
private String note;
定义Dao类
public interface OrderDao {
//select * from `order`;
public List<Order> findAll();
}
核心配置文件中引入
<!-- 一个mapper标签可以指定一个映射文件-->
<mappers>
<!-- <mapper resource="UserMapper.xml"/>-->
<mapper resource="com/wzx/dao/OrderDao.xml"/>
</mappers>
映射文件
<?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="com.wzx.dao.OrderDao">
<select id="findAll" resultType="order">
select * from `order`;
</select>
</mapper>
学习目标
- (1)ResultMap(重要)
查询数据封装的原理
字段名和成员名不一致
ResultMap标签 - (2)动态sql(重要)
动态sql-if标签
动态sql-foreach标签 - (3)关联查询(重要)
关联查询-一对一
关联查询-一对多
关联查询-综合案例
字段名和成员名不一致
- (1)为什么id属性能被Mybatis赋值?
》底层使用id生成setId
》使用反射调用setId方法,setId(10) 方法内完成赋值 id = 10 - (2)为什么user_id属性能被Mybatis赋值?
》底层使用user_id生成setUser_id
》使用反射调用setUser_id方法,类中只有setUserId - (3)所以 为什么强调 表与类的对应关系?
字段名和成员名要一致
ResultMap
- (1)ResultMap有什么用?
建立查询字段与实体类成员变量的映射关系
即 查询字段是user_id但是Mybatis去赋值userId
》字段名与变量名不一致,可以赋值
》实现一对多,多对多的查询
(2)ResultMap标签映射关系,resultMap使用
在不改表,也不改类的基础上,完成查询数据对变量的赋值。
<!--
id:ResultMap标识,标签语句中 resultMap的值必须和该id一致
type:指定你要映射哪一个JavaBean
如果字段名和成员名一样,则可以不用指定映射关系
-->
<resultMap id="resultMap1" type="com.wzx.pojo.Order">
<!--在这里要指定数据库表字段和JavaBean成员变量之前的映射关系-->
<!--先指定主键字段和成员之间的映射关系-->
<id column="id" property="id"></id>
<!--先指定非主键字段和成员之间的映射关系
column:字段名
property:成员变量名
-->
<result column="user_id" property="userId"></result>
<result column="number" property="number"></result>
<result column="createtime" property="createtime"></result>
<result column="note" property="note"></result>
</resultMap>
<select id="queryAllOrders" resultMap="resultMap1">
SELECT id,user_id,number,createtime,note FROM orderx
</select>