JavaEE_mybatis

1. 创建 maven 工程

创建 mybatis01 的工程,工程信息如下:
Groupid:dcp.it
ArtifactId:mybatis01
Packing:jar

2 添加 Mybatis3.4.5 的坐标

在 pom.xml 文件中添加 Mybatis3.4.5 的坐标,如下:

 <dependencies>
 <dependency>
 <groupId>org.mybatis</groupId>
 <artifactId>mybatis</artifactId>
 <version>3.4.5</version>
 </dependency>
 <dependency>
 <groupId>junit</groupId>
 <artifactId>junit</artifactId>
 <version>4.10</version>
 <scope>test</scope>
 </dependency>
 <dependency>
 <groupId>mysql</groupId>
 <artifactId>mysql-connector-java</artifactId>
 <version>5.1.6</version>
 <scope>runtime</scope>
 </dependency>
 <dependency>
 <groupId>log4j</groupId>
 <artifactId>log4j</artifactId>
 <version>1.2.12</version>
 </dependency>
 </dependencies>

3 编写 User 实体类

/**
* 
* <p>Title: User</p>
* <p>Description: 用户的实体类</p>
* <p>Company: http://www.itheima.com/ </p>
*/
public class User implements Serializable {
private Integer id;
private String username;
private Date birthday;
private String sex;
private String address;
public Integer getId() {
return id; }
public void setId(Integer id) {
this.id = id; }
public String getUsername() {
return username; }
public void setUsername(String username) {
this.username = username; }
public Date getBirthday() {
return birthday; }
public void setBirthday(Date birthday) {
this.birthday = birthday; }
public String getSex() {
return sex; }
public void setSex(String sex) {
this.sex = sex; }
public String getAddress() {
return address; }
public void setAddress(String address) {
this.address = address; }
@Override
public String toString() {
return "User [id=" + id + ", username=" + username + ", birthday=" + birthday
+ ", sex=" + sex + ", address="
+ address + "]"; } }

4 编写持久层接口 IUserDao

IUserDao 接口就是我们的持久层接口(也可以写成 UserDao 或者 UserMapper),具体代码如下:

/**
* 
* <p>Title: IUserDao</p>
* <p>Description: 用户的持久层操作</p>
* <p>Company: http://www.itheima.com/ </p>
*/
public interface IUserDao {
/**
* 查询所有用户
* @return
*/
List<User> findAll();
}

5 编写持久层接口的映射文件 IUserDao.xml

要求:
创建位置:必须和持久层接口在相同的包中。
名称:必须以持久层接口名称命名文件名,扩展名是.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="com.itheima.dao.IUserDao">
<!-- 配置查询所有操作 -->
 <select id="findAll" resultType="com.itheima.domain.User">
select * from user
</select>

6 编写 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>
<!-- 配置 mybatis 的环境 --> 
<environments default="mysql">
<!-- 配置 mysql 的环境 --> 
<environment id="mysql">
<!-- 配置事务的类型 --> 
<transactionManager type="JDBC"></transactionManager>
<!-- 配置连接数据库的信息:用的是数据源(连接池) --> 
<dataSource type="POOLED"> 
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/ee50"/>
<property name="username" value="root"/>
<property name="password" value="1234"/>
</dataSource>
</environment>
</environments>
<!-- 告知 mybatis 映射配置的位置 -->
 <mappers> <mapper resource="com/itheima/dao/IUserDao.xml"/>
</mappers>
</configuration>

7 编写测试类

/**
* 
* <p>Title: MybatisTest</p>
* <p>Description: 测试 mybatis 的环境</p>
* <p>Company: http://www.itheima.com/ </p>
*/
public class MybatisTest {
public static void main(String[] args)throws Exception {

//1.读取配置文件
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.创建 SqlSessionFactory 的构建者对象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//3.使用构建者创建工厂对象 SqlSessionFactory
SqlSessionFactory factory = builder.build(in);
//4.使用 SqlSessionFactory 生产 SqlSession 对象
SqlSession session = factory.openSession();
//5.使用 SqlSession 创建 dao 接口的代理对象
IUserDao userDao = session.getMapper(IUserDao.class);
//6.使用代理对象执行查询所有方法
List<User> users = userDao.findAll();
for(User user : users) {
System.out.println(user);
}
//7.释放资源
session.close();
in.close();
} }

补充

1 在持久层接口中添加注解

/**
* 
* <p>Title: IUserDao</p>
* <p>Description: 用户的持久层操作</p>

* <p>Company: http://www.itheima.com/ </p>
*/
public interface IUserDao {
/**
* 查询所有用户
* @return
*/
@Select("select * from user")
List<User> findAll();
}

2 修改 SqlMapConfig.xml

<!-- 告知 mybatis 映射配置的位置 --> 
<mappers> <mapper class="com.itheima.dao.IUserDao"/>
</mappers>

3 注意事项:

在使用基于注解的 Mybatis 配置时,请移除 xml 的映射配置(IUserDao.xml)。
补充

设计模式分析

在这里插入图片描述
在这里插入图片描述

查找所有分析

在这里插入图片描述

代理对象分析

在这里插入图片描述

问题扩展:新增用户 id 的返回值

新增用户后,同时还要返回当前新增用户的 id 值,因为 id 是由数据库的自动增长来实现的,所以就相
当于我们要在新增后将自动增长 auto_increment 的值返回。

<insert id="saveUser" parameterType="USER">
<!-- 配置保存时获取插入的 id --> 
<selectKey keyColumn="id" keyProperty="id" resultType="int">
select last_insert_id();
</selectKey>
insert into user(username,birthday,sex,address) 
values(#{username},#{birthday},#{sex},#{address})
</insert>

dao实现类的执行过程

在这里插入图片描述

代理dao的执行过程

在这里插入图片描述

代理对象getMapper

在这里插入图片描述

自定义mybatis开发流程图

在这里插入图片描述

mybatis中的连接池

mybatis连接池提供了3种方式的配置:
	配置的位置:
		主配置文件SqlMapConfig.xml中的dataSource标签,type属性就是表示采用何种连接池方式。
	type属性的取值:
		POOLED	 采用传统的javax.sql.DataSource规范中的连接池,mybatis中有针对规范的实现
		UNPOOLED 采用传统的获取连接的方式,虽然也实现Javax.sql.DataSource接口,但是并没有使用池的思想。
		JNDI	 采用服务器提供的JNDI技术实现,来获取DataSource对象,不同的服务器所能拿到DataSource是不一样。
			 注意:如果不是web或者maven的war工程,是不能使用的。
			 我们课程中使用的是tomcat服务器,采用连接池就是dbcp连接池。

Mybatis中的延迟加载

问题:在一对多中,当我们有一个用户,它有100个账户。
      在查询用户的时候,要不要把关联的账户查出来?
      在查询账户的时候,要不要把关联的用户查出来?
	
      在查询用户时,用户下的账户信息应该是,什么时候使用,什么时候查询的。
      在查询账户时,账户的所属用户信息应该是随着账户查询时一起查询出来。

什么是延迟加载
	在真正使用数据时才发起查询,不用的时候不查询。按需加载(懒加载)
什么是立即加载
	不管用不用,只要一调用方法,马上发起查询。

在对应的四种表关系中:一对多,多对一,一对一,多对多
	一对多,多对多:通常情况下我们都是采用延迟加载。
	多对一,一对一:通常情况下我们都是采用立即加载。

Mybatis中的缓存

什么是缓存
	存在于内存中的临时数据。
为什么使用缓存
	减少和数据库的交互次数,提高执行效率。
什么样的数据能使用缓存,什么样的数据不能使用
	适用于缓存:
		经常查询并且不经常改变的。
		数据的正确与否对最终结果影响不大的。
	不适用于缓存:
		经常改变的数据
		数据的正确与否对最终结果影响很大的。
		例如:商品的库存,银行的汇率,股市的牌价。
Mybatis中的一级缓存和二级缓存
	一级缓存:
		它指的是Mybatis中SqlSession对象的缓存。
		当我们执行查询之后,查询的结果会同时存入到SqlSession为我们提供一块区域中。
		该区域的结构是一个Map。当我们再次查询同样的数据,mybatis会先去sqlsession中
		查询是否有,有的话直接拿出来用。
		当SqlSession对象消失时,mybatis的一级缓存也就消失了。
	
	二级缓存:
		存得是数据,不是对象,从二级缓存拿数据,写新的对象
		它指的是Mybatis中SqlSessionFactory对象的缓存。由同一个SqlSessionFactory对象创建的SqlSession共享其缓存。
		二级缓存的使用步骤:
			第一步:让Mybatis框架支持二级缓存(在SqlMapConfig.xml中配置)
			第二步:让当前的映射文件支持二级缓存(在IUserDao.xml中配置)
			第三步:让当前的操作支持二级缓存(在select标签中配置)

++注解开发: day01_eesy_02mybatis + day04_eesy_03annotation_mybatis + day04_eesy_04annoOne2Many

1.注解开发和xml配置********day01_eesy_02mybatis

2.xml配置sql*******day01_eesy_03mybatis_dao

dao实现类
使用xml配置sql

<?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="dcp.it.dao.IUserDao">
    <!-- 配置查询所有-->
    <select id="findAll" resultType="dcp.it.domain.User">
        select * from user;
    </select>
</mapper>

3.自定义的mybatis********day01_eesy_04mybatis_design

4.CRUD功能xml和xml的sql********day02_eesy_01mybatis_CRUD

5.dao实现类************day02_eesy_02mybatis_DAO

1.dao实现类的使用
2.测试类的初始化设置不同
3.自动提交事务给openSession(true)设置为true

dao类************day03_eesy_01dynamicSQL

IUserDao.xml:
1.if,foreach标签的使用:用来连接条件的
2.sql标签:抽取重复的sql语句
SqlMapConfig.xml:
1.domain的别名:typeAliases标签
2.properties资源路径
根据条件查询:QueryVo配置类
1.各种查询方法

xml的sql配置********day03_eesy_02one2many

1对多的IUserDao.xml配置
1对1的IAccountDao.xml配置

xml的sql配置**********day03_eesy_03many2many

多对多,2个xml配置文件

延迟加载*********day04_eesy_01lazy

<settings>
    <!--开启Mybatis支持延迟加载-->
    <setting name="lazyLoadingEnabled" value="true"/>
    <setting name="aggressiveLazyLoading" value="false"></setting>
</settings>

1.一对一:IAccountDao.xml配置
2.一对多:IUserDao.xml配置

缓存**********day04_eesy_02cache

1.test中
UserTest:一级缓存
SecondLevelCacheTest:二级缓存
2.需要开启缓存:SqlMapConfig.xml;改IUserDao.xml配置
3.二级缓存是二级缓存区取出数据,封装成新的对象,所以对象不一样

注解开发************day04_eesy_03annotation_mybatis

IUserDao.java接口:注解@Results和@ResultMap的写法:数据库里数据名称不一致的注解

注解开发****************day04_eesy_04annoOne2Many

IAccountDao.java接口:一对一注解@Results中@Result的@one
IUserDao.java接口:一对多注解@Results中@Result的@many

开启二级缓存
SqlMapConfig.xml配置
IUserDao.java接口:@CacheNamespace设置为true:@CacheNamespace(blocking = true)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值