1.1Mybatis核心配置以及映射配置文件
org.mybatis mybatis3.5.4
1.2定义mapper接口
//定义mapper接口(相当于之间xxxDao:数据访问接口)
List findAllUser() ;
1.3配置映射文件
select * from user
1.3测试类
public class MyBatisTest {
InputStream inputStream ;
SqlSession sqlSession ;
StudentMapper studentMapper ;//接口对象声明
@Before
public void init() throws Exception {
//1)驱动mybatis核心配置文件
inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
//创建SqlSessionFactoryBuilder构造者设计模式
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder() ;
//通过加载资源文件输入流,获取SqlSessionFactory接口工厂
SqlSessionFactory sqlSessionFactory = builder.build(inputStream);
//创建执行对象
sqlSession = sqlSessionFactory.openSession();//开启手动提交
//获取接口代理对象
studentMapper = sqlSession.getMapper(StudentMapper.class) ;
}
//测试查询所有的学生
@Test
public void testFindAll(){
List list = studentMapper.findAll();
if(list!=null){
for(Student student:list){
System.out.println(student);
}
}
}
}
2.mybatis插入数据,获取自增长主键id的值
mybatis插入数据的时候,获取表中自增长主键id的值
insert标签中有子标签seletkey,属性如下:
keyProperty:实体类中的属性值 (通过id字段要和表中id字段映射)
keyColumn:表中的主键字段 id字段
order:什么时候执行 sekectKey标签中的语句
AFTER 在执行插入之后,执行selectkey的语句,获取最后一次自增长主键的id值
SELECT LAST_INSERT_ID()
BEFORE: 插入数据之前执行
resultType:获取到的自增长主键的类型 int
SELECT LAST_INSERT_ID() insert into student(name,age,address,birthday) values(#{name},#{age},#{address},#{birthday})
3.1封装vo实体类
//包装的实体类--里面包含的一个学生类
public class QueryVo {
private Student student ;
public Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
}
3.2mybatis基本模糊查询
3.3封装的vo实体来模糊查询学生列表
4.传统dao的弊端
1)开发过程还需要核心配置文件,也需要映射文件,代码大量加大,还需要提供接口实现类 2)从内存角度考虑:以后需要在业务层需要频繁的数据访问接口,不断的开辟堆内存空间; 3)开发中遵循"低耦合,高内聚",而传统dao的程序之间出现耦合性,而降低耦合性经常使用的技术"反射技术"; mapper代理的方式:使用到了jdk动态代理,就比这种传统方式优秀!
5.mybatis注解开发流程
//StudentMapper
@Select("select * from student")
//@Select注解:查询的---替代了xx.xml映射文件中的select标签
List findAll() ;
@Delete("delete from student where id = #{id}") //代替映射文件中的delete标签
void deleteStudent(int id) ;
@Update("update student set name = #{name},age = #{age},address = #{address},birthday = #{birthday} where id = #{id}) //代替update标签
void updateStudentById(Student student) ;
@Insert("insert into student(name,age,address,birthday) values(#{name},#{age},#{address},#{birthday})) //代替了insert标签
void addStudent(Student student) ;
6.读取外部配置文件,获取jdbc连接信息以及加入实体类包扫描
7.mybatis的原理
架构体现:
1)准备核心配置文件 mybatis-Config.xml---->mybatis的Resources就来读取配置文件的内容
2)将配置文件内容---->每一个标签--->封装到一个类中,作为它的属性:Configuration类(配置类)
3)加载映射器 Mappers -->里面配置的mapper的sql映射文件---->MapperRegister:Mapper注册器
Configuration类(配置类):
//创建SqlSessionFactoryBuilder--->构建者,就是将资源输入流的内容,封装Configuration类
//创建SqlSessionFactory接口工厂------>通过子实现类 DefaultSqlSessionFactory进行创建
4)创建SqlSesison:执行对象---->底层有接口Executor执行器 ----->最终就是创建一个PreparedStatement:预编译对象
5)T getMapper(Class class):---->mapper代理底层就是一个jdk动态代理,针对XXXMapper接口 产生代理对象(jdk动态代理前提基于接口实现)--->MapperProxy implements InvocationHandler
8.mybatis的参数绑定
//@Param("将指定的参数绑定到这个注解中,起一个名称")
//按照学生姓名和地址查询学生信息
Student findStudentByNameAndAddress(@Param("name") String name,@Param("addr") String address) ;
//参数绑定的使用
9.参数为复杂类型的Map集合
10.连接池的特点
连接池的特点: 创建一些固定的可重用的连接对象,重复利用它,当某个连接对象被某个持有的线程使用完毕之后,然后归还连接池中.
11.mybatis启用德鲁伊的连接池
1)导包2)配置文件:使用自己的连接池:自定义一个工厂类 继承了 mybatis里面的PooledDataSourceFactory com.alibaba druid1.1.13 3)自定义这个类继承自mybatis的连接池数据源工厂类 public class MyDruidDataSourceFactory extends PooledDataSourceFactory { //构造方法 public MyDruidDataSourceFactory(){ //创建德鲁伊的数据源对象 this.dataSource = new DruidDataSource() ; } }
12.mybatis的高级映射resultMap
使用场景: 1)当实体类属性和字段一样 2)mybatis多表查询的时候可以用 使用步骤: 首先在映射文件中定义resultMap,然后在具体的增删改,查询语句中将reusltMap引入,resultMap里面就是可以将每一个字段和实体类的属性一一映射
12.1 定义resultMaop
13.动态sql语句---where
14.动态sql片段
动态的sql片段将重复性的sql抽取出来,在其他sql中引入这个sql片段即可select * from student
15.动态aql--for each遍历数据



