一、框架概述
1.1软件开发常用结构
1.1.1三层架构
三层架构:界面层、业务逻辑层、数据访问层(持久层)
界面层:和用户打交道,接受用户的请求参数,显示数据结果
业务逻辑层:接受了界面层传递的数据,计算逻辑,调用逻辑,获取数据
数据访问层:访问数据库,执行对数据的增删改查
三层对应的包;
界面层:controller包(servlet)
业务逻辑层:service包(XXXService类)
持久层:dao包(XXXDao类)
三层对应的处理框架:
界面层—servlet—springmvc(框架)
业务逻辑层—service类—spring(框架)
持久层—dao类—mybatis(框架)
框架是一个模板
1.1.2框架
- 框架可以定义好一些功能,这些功能是公用的
- 可以加入项目中自己的功能,可以利用框架中写好的功能
框架是一个半成品的软件,其特点:
- 框架不是全能的
- 框架是针对某一个领域,例mybatis做数据库强
- 框架是一个软件
1.2mybatis框架
mybatis是MyBatis SQL Framework for java(sql映射框架)
1)sql mapper:sql映射
可以把数据库表中的一行数据映射为 一个java对象
一行数据可以看作一个java对象,操作对象即操作数据库中的数据
2)Data Access Objects(DAOs):数据访问,对数据库执行增删改查
mybatis提供的功能: - 提供Connection,Statement,ResultSet的能力
- 提供执行sql语言的能力
- 提供循环sql,把sql结果转换为java对象List集合能力
- 提供关闭资源的能力
开发人员的责任:提供sql语句
总结:
mybatis是一个sql映射框架,提供的数据库的操作功能,增强的JDBC使用mybatis让开发人员集中精神写sql语言
二、
1 主要类的介绍
1)Resources:mybatis中的一个类,负责读取主配置文件
InputStream in = Resources.getResourceAsStream("mybatis.xml");
2)SqlSessionFactoryBuilder:创建SqlSessionFactory对象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//4.创建SqlSessionFactory对象
SqlSessionFactory factory = builder.build(resourceAsStream);
3)SqlSessionFcatory:重量级对象,程序创建对象耗时长,使用资源多
在整个项目中,有一个就够了
SqlSessionFcatory:接口 接口的实现类:DeFaultSqlsessionFactory
作用:获取SqlSession对象
SqlSession sqlSession = factory.openSession();
openSession()方法说明 :
- openSession():无参数的,获取的是非自动提交事务的SqlSession对象
- openSession(boolean):openSession(true) 获取自动提交事务的SqlSession
4)SqlSession:
SqlSession接口:定义了操作数据的方法
例如:selectOne(),selectList(),insert(),update(),delete(),commit(),rollback()
SqlSession接口的实现类:DeFaultSqlSession
使用要求:SqlSession对象不是线程安全的,需在方法内部使用,在执行sql语句之前,使用openSqlSession()获取SqlSession对象,在执行sql语句之后需要关闭它,执行SqlSession.close(),即线程安全
三、
1.动态代理:使用SqlSession.getClass(dao接口.class) 获取这个dao接口的对象
2.传入参数:从java代码中把数据传入到mapper文件中的sql语句中
1)parameterType:写在mapper文件的一个属性,表示dao接口中方法的参数的数据类型
例:StudentDao接口:
public Student selectStudentById(Integer id)
mapper:
select * from Student where id = #{id}
2)一个简单类型的参数:
简单类型:mybatis把java的基本数据类型和String都叫简单类型
在mapper文件中获取简单类型第一个参数的值,使用#{任意字符}
3)多个参数,使用@Param命名参数
接口:
public List<Student> selectMulitParam(@Param("myname")String name,@Param("myage")Integer age)
使用 @Param(“参数名”) String name
mapper文件:
<select>
select * from student where name = #{myname} or age= #{myage}
</selcet>
4)多个参数,使用java对象
语法:#{属性名}
vo:value object,放一些存储数据的类。比如说:提交请求参数,name,age,现在想把name,age传给一个service
pojo:普通的有set,get方法的java类,普通的java对象
Servlet — StudentService(addStudent(MyParam param))
entity(domain域):实体类,和数据库中的表对应一致
3.两个占位符(#,$)
#:告诉mybatis使用实际的参数值传递,并使用PrepareStatement对象执行sql语句,#{…}代替sql语句中的?,更安全,更迅速
$:字符串替换,告诉mybatis使用 $包含的"字符串"替换所在的位置
例:
select id,name,email,age from Student where id = #{studentId}
//#的结果
select id,name,email,age from Student where id=?
select id,name,email,age from Student where id =${studentId}
//$的结果
select id,name,email,age from Student where id=1001
#和$的区别:
1.#使用 ?zaisql语句中作占位的,使用PrepareStatement对象执行sql效率高
2.#能避免sql注入,更安全
3.$不适用占位符,是字符串连接的方式,内部使用Statement对象执行效率低
4.$有sql注入风险,缺乏安全性
5.$可以替换表名和列名
4.封装mybatis输出结果
mybatis执行了sql语句,得到的java对象
1)resultType结果类型 指sql语句执行完毕以后,数据转为java对象,java类型是任意的
resultType结果类型的值:1.类型的全限定名称 2.类型的别名
处理方式:
1.mybatis执行的sql语句,然后mybatis调用类的无参数构造方法,创建对象
2.mybatis把resultSet指定为列值付给同名的属性
2)定义自定义类型的别名
2.1在mybatis主配置文件中定义,使用定义别名
2.2可以在resultType中使用自定义的别名
第一种方式:
可以指定一个类型一个自定义别名
type:自定义类型的全限定名称
alias:别名
例:<typeAlias type="com.bjpowernode.domin.Student" alias="stu"/>
第二种方式:
name是包名,这个包中的所有类,类名就是别名(类名不区分大小写)
例:<package name="com.bjpowernode.domin"/>
3)resultMap:结果映射,指定列名和java对象的属性对应关系的
3.1自定义列值赋值给哪个属性
3.2当列名和属性名不一致时,一定使用resultMap
resultMap和resultTyppe不一起使用,二选一
4)列名和属性名不同的两种处理方式
方式一:使用resultMap
例:
<resultMap id="myStudentMap" type="com.bjpowernode.domin.MyStudent">
<!--定义列名和java属性的关系-->
<!--主键列,使用id标签
column:列名
property:java类型的属性名
-->
<id column="id" property="stuid"/>
<!--非主键列,使用result-->
<result column="name" property="stuname"/>
<result column="email" property="stuemail"/>
<result column="age" property="stuage"/>
</resultMap>
<!--列名和属性名不一样:方式一-->
<select id="selectMyStudent" resultMap="myStudentMap">
select * from Student
</select>
方式二: resultType的默认原则:同名的列值赋值给同名的属性,使用列别名(java对象对应的属性名)
例:
<select id="selectDiffColProperty" resultType="com.bjpowernode.domin.MyStudent">
select id as stuid,name as stuname,email as stuemail,age as stuage from Student
</select>
5)模糊like
第一种like,java代码中指定like的内容
例:
//mapper文件中:
<select id="selectLikeOne" resultType="com.bjpowernode.domin.Student">
select * from Student where name like #{name}
</select>
//测试类:
@Test
public void testselectLikeOne(){
SqlSession sqlSession = MyBatisUtils.getSqlSession();
StudentDao mapper = sqlSession.getMapper(StudentDao.class);
String name = "%李%";
List<Student> students = mapper.selectLikeOne(name);
for(Student st : students){
System.out.println(st);
}
sqlSession.close();
}
第二种like,在mapper文件中拼接like的内容
例:
//mapper文件中:
<select id="selectLikeTwo" resultType="com.bjpowernode.domin.Student">
select * from Student where name like "%" #{name} "%"
</select>
//测试类:
@Test
public void testselectLikeTwo(){
SqlSession sqlSession = MyBatisUtils.getSqlSession();
StudentDao mapper = sqlSession.getMapper(StudentDao.class);
String name = "李";
List<Student> students = mapper.selectLikeTwo(name);
for(Student st : students){
System.out.println(st);
}
sqlSession.close();
}
四、动态sql
动态sql:sql内容是变化的,可以根据条件获取到不同的sql语句主要是where部分发生变化
动态sql的实现,使用的是mybatis提供的标签,<if>,<where>,<foreach>
1)<if>
是判断条件的
//语法:
<if test = "判断java对象的属性值">
//部分sql语句
</if>
2)<where>
用来包含多个<if>
的,当多个if有一个成立,<where>
会自动增加一个where关键字,并去掉if中多余的and,or等
3)<foreach>
循环java中的数组,list集合的,主要是sql的in语句中
例:
//学生id是1001,1001,1003的三个学生
select * from Student where id in (1001,1002,1003)
public List<Student> selectFor(List<Integer> idlist);
List<Integer> list = new ...
list.add(1001);
list.add(1002);
list.add(1003);
dao.selectFor(list);
//mapper文件:
<!--foreach使用1,List<Integer>-->
<select id="selectForeachOne" resultType="com.bjpowernode.domin.Student">
select * from Student where id in
/**
*collection:表示接口中的方法参数的类型,如果是数组使用array,如果是list集合使用list
item:自定义的,表示数组和集合的成员的变量
open:循环开始的字符
close:循环结束时的字符
sepatator:集合成员之间的分隔符
*/
<foreach collection="" item="" open="" close="">
#{xxx}
</foreach>
</select>
4)sql代码片段用来复用一些语法
步骤:
- 先定义
<sql id="自定义名称唯一 "> sql语句,表名,字段等 </sql>
- 在使用
<include refid = "id的值">
五、
1.数据库的属性配置文件:把数据库连接信息放到一个单独的文件中,和mybatis主配置文件分开,目的便于修改,保存,处理多个数据库信息
1)在resources目录中定义一个属性配置文件,xxx.properties 例如:jdbc.properties,在属性配置文件中,定义数据,格式是key=value
key一般使用.做多级目录,例如:jdbc.mysql.driver
2)在mybatis的主配置文件,使用<properties>
指定文件的位置,在需要使用值得地方${key}
2.mapper文件,使用package指定路径
<mappers>
<!--第一种方式:指定多个mapper文件-->
<mapper resource="com/bjpowernode/dao/StudentDao.xml"/>
<!--第二种方式:使用包名
name:xml文件(mapper文件)所在的包名,包中所有xml文件一次都能加载给mybatis
使用package要求:
1.mapper文件名称需和接口名称一样,区分大小写
2.mapper文件和dao接口需在统一目录
-->
<package name="com.bjpowernode.dao"/>
</mappers>
六、PageHelper
PageHelper做数据分页
//1.加入maven依赖
<!--PageHelper依赖-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.10</version>
<scope>test</scope>
</dependency>
//2.在mybatis主配置文件中加入plugin
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
</plugins>
//3.查询方法之前,加入PageHelper方法调用
PageHelper.startPage(1,2);
List<Student> students = mapper.selectAll();