1 处理逻辑:
1.创建实体类,一个实体类对应一个表格,创建setter,getter
2.创建Dao接口,定义相应的查询方法
package com.itheima.dao;
import com.itheima.domain.User;
import java.util.List;
public interface UserDao {
// 查询所有
List<User> findAll();
}
3.配置mybatis主配置文件,主要包括配置sql环境,配置驱动,表,账户名和密码,最重要的mappers,对给个Dao进行配置
<?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>
<!--配置环境-->
<environments default="mysql">
<!--配置msqyl环境-->
<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/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="nopaimqq"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/itheima/dao/UserDao.xml"/>
</mappers>
</configuration>
4.配置Dao文件,先让mybatis定位到相应的Dao,接着配置相应的查找方法,通过id属性配对
<?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">
<!--找到对应的dao-->
<mapper namespace="com.itheima.dao.UserDao">
<!--id就是dao的方法名-->
<select id="findAll" resultType="com.itheima.domain.User">
select * from user
</select>
</mapper>
2 测试
1.读取配置文件,连接数据库和获得映射
2.由工厂模式
创建工厂,接着创建session
3.由于Dao里面的查询接口是没有实现的,所以,使用代理对象进行实例化一个Dao对象
4.执行Dao内的方法,并且进行相应输出
5.释放资源
package com.itheima.test;
import com.itheima.dao.UserDao;
import com.itheima.domain.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.InputStream;
import java.util.List;
public class Test {
public static void main(String[] args)throws Exception{
// 1.读取配置文件
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
// 2. 创建工厂;
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
// 3. 使用工厂创建Session对象;
SqlSession session = factory.openSession();
// 4. 使用Session创建Dao接口的代理对象;
UserDao userDao = session.getMapper(UserDao.class);
// 5. 使用代理对象执行方法, 省略了接口的实现;
List<User> users = userDao.findAll();
for (User user : users) {
System.out.println(user);
}
// 6. 释放资源;
session.close();
in.close();
}
}
3 连接池与非连接池
优点:使用连接池可以减少重复建立连接,断开连接的步骤,加速数据库的CRUD速度。
3.1 传统的非连接池化(UNPOOLED)
也就是几个步骤:
1.注册驱动:classforname
2.get connection
4 标签内的配置进行动态查询
4.1 在配置内使用if标签动态条件查询
1.先写接口。
2.配置
<!--在配置内使用if标签进行条件查询-->
<select id="selectbyCondition" parameterType="com.itheima.domain.User" resultType="com.itheima.domain.User">
select * from user
<where>
<if test="username != null">
and username like #{username}
</if>
<if test="sex != null">
and sex = #{sex}
</if>
</where>
</select>
首先看到传入的参数是User类型,我使用的类的属性和表的列名是一一对应的;原理就是通过配置生成了这样一个查询语句
select * from user where username like #{username} and sex = #{sex}
比如定义一个查询的user,其中username = “%王%”, sex = 男,那其实就是查询了表内名字带个王字的,而性别是男的的对象。
4.2 使用foreach标签进行子查询
子查询sql语句为
select * from user where id in (41,42,43)
配置如下
<!--在配置内使用foreach标签进行子查询-->
<select id="selectbyQueryVoIds" parameterType="com.itheima.domain.QueryVo" resultType="com.itheima.domain.User">
select * from user
<where>
<if test="ids != null">
<!--对ids进行遍历取出来,拼凑成一个sql
select * from user where id in (conditions)-->
<foreach collection="ids" open="and id in (" close=")" item="id" separator=",">
#{id}
</foreach>
</if>
</where>
</select>
5 延迟加载
5.1 延迟加载与立即加载
比如多对一与一对多中,一个用户可能有100个账户,那是不是100个账户要同时查询出来
延迟加载:就是不用时,那些级联的表多余的数据不加载出来
立即加载:不管如何,都加载出来
5.2 在一对多,多对一的模型里面进行延迟加载
比如acount与user是多对一,
对acount进行select * from acount
,同时对user进行延迟加载
主要对association标签进行修改,增加一个select标签
,select指向Iuser接口所指向的查询方法,这个查询方法一定是通过外键进行查询。和多对一的column
标签相对应
原理:个人认为就是在执行查询时候,调用了association里面的select方法
6 缓存
6.1 什么是缓存
缓存是存在于内存中的临时数据;通过缓存可以减少与数据库的交互次数,提高查询效率。
6.2 什么样的数据适合缓存
经常查询并且value不经常改变的数据,
数据的正确与否对最终影响不大。因为缓存中的数据与数据库中的数据可能存在偏差,对于金融等应用不一定合适。
6.3 一级缓存
存在sqlSession
中,当sqlsession.close时,缓存也消失
当执行一个update或者delete时,缓存也会消失
6.4 二级缓存
存在SqlSessionFactiory
中