MyBatis框架相当于一个增强的JDBC
1.三层架构
界面层:view,与用户交互
业务逻辑层:接收传递的数据,检查数据,计算业务逻辑,调用数据访问层获取数据
数据访问层:与数据库打交道,也叫持久层。
三层对应的包:
界面层:controller包(servlet)
业务逻辑层:service包(xxxservice类)
数据访问层:dao包(xxxDao类)
三层中类的交互
用户使用界面层---->业务逻辑层---->数据访问层---->数据库
三层对应的处理框架:
界面层 springmvc
业务逻辑层 spring
数据访问层 MyBatis
2.mybatis框架
MyBatis是MyBatis SQL Mapping Framework for Java (sql映射框架)
1)sql mapping:sql映射
可以把表中的一行数据映射为一个java对象,操作这个对象就相当于操作表中数据
2)Data Access Objects(DAOs):数据访问,对数据进行增删改查
mybatis提供的功能:
1.提供了创建Connection,PrepareStatement,ResultSet的能力,不用开发人员创建
2.提供了执行sql语句的能力
3.提供了循环sql,把sql结果转为java对象,List集合的能力
4.提供了关闭资源的能力
开发人员提供sql语句---mybatis处理sql---开发人员得到list集合或java对象
3.mybatis实现
1. InputStream in = Resources.getResourcesAsStream("namespace的名称.方法名");
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
SqlSession sqlSession = factory.openSession();
List<Student> stu = sqlSession.selectStudent();
sqlSession.close();
2. 动态代理:使用SqlSession.getMapper(接口名称.class)获取dao接口的对象;
3. 传入参数:从java代码中把数据传入到mapper文件中的sql语句中
1)parameterType:写在mapper文件中的一个属性。表示dao接口中方法的参数的数据类型。
例如StudentDao接口中的查询方法:
public Student selectStudentById(Integer id); //此时传入parameterType就是必须是Integer
4. mybatis其实就是jdbc的封装
5.多个参数,使用@param命名参数
接口 public List<Student> selectMultiParam(@Param("myName") String name,@Param("myAge") Integer age)
mapper文件中:
<select id="" resultType="">
select * from student where name = #{myN ame} or age = #{myAge}
</select>
6. 两个占位符的比较
#{}: 告诉mybatis使用实际的参数值代替,并使用Preparestatement对象执行sql语句
${}: 告诉mybatis使用$包含的"字符串"替换所在位置。
使用Statement把sql语句和${}的呢日哦那个连接起来。主要用在替换表明,列名,不同列排序等操作。
能用#的地方都能用$,不同在于:
select * from student where id = #{id};
#的查询语句:select * from student where id = ; //之后再将id值传给?
select * from student where id = ${id};
$的查询语句:select * from student where id = 1001; //此处是直接将值传了进去,相当于字符串的拼接了
$使用的是statement对象执行sql,效率比Preparestatement低,且有sql注入的风险,安全性低。
4.定义别名
在mybatis配置文件中设置mybatis.xml
5.resultMap结果映射,指定列名和java对象的属性对应关系
1.自定义列值赋值给哪个属性
2.当列名和属性名不同时,就要使用resultMap
<select id="方法名" resultMap="上面定义的id名称">
sql语句
</select>
或者
<select id="方法名" resultType="全限定名称">
select id as sid,name as sname from student;
</select>
6.模糊查询like
<select id="方法名" resultType="全限定名称">
select * from student where name like #{name};
</select>
之后传入一个String类型的字符串即可
第二种方式:
在mapper中拼接 like "%" #{name} "%"
<select id="方法名" resultType="全限定名称">
select * from student where name like "%" #{name} "%"; //空格必须有
</select>
7.动态sql
动态SQL:sql的内容是变化的,可以根据条件获取到不同的sql语句
主要是where部分发生变化
动态sql的实现:使用的是mybatis提供的标签, 和
1) <if>语法
<if test="判断java对象的属性值">
部分sql语句
</if>
2) <where>用来包含多个<if> ,当多个if有一个成立,<where>会自动增加一个where关键字
并自动去掉if中多余的and,or等
3) <foreach>循环java中的数组,list集合的。主要用在sql的in语句中
例如:
select * from student where id in (1,2,3);
如果想传入1,2,3,则需要java对象传入一个list或者其他容器,用<foreach>来处理这个容器
<foreach collection="list" item="" open="" close="" separator="" >
</foreach>
其中:
collection:表示接口中的方法参数的类型,array就使用list
item:自定义的,表示数组和集合成员的变量
open:循环开始时的字符
close:循环结束时的字符
separator:集合成员之间的分隔符
List<Student> studentList = dao.selectStudentForeach(list);
<foreach collection="list" item="id" open="(" close=")" separator="," >
#{id}
</foreach>
4)定义代码片段
<sql id="studentSql">
select id,name,age,email from student
</sql>
<select id="selectStudentIf" resultType="com.bjpowernode.domain.Student">
<include refid="studentSql" />
</select>
8.主配置文件
type属性的取值:
POOLED
采用传统的javax.sql.DataSource规范中的连接池,mybatis中有针对规范的实现
连接池就是用于存储连接的一个容器
容器其实就是一个集合对象, 该集合必须是线程安全的, 通能两个线程拿到同一连接
该集合还必须实现队列的特性:先进先出
UNPOOLED
采用传统的获取连接的方式,虽然也实现Javax.sql.DataSource接口,但是并没有使用池的思想.
JNDI
采用服务器提供的JNDI技术实现,来获取DataSource对象,不同的服务器所能拿到DataSource是不一样。
注意:如果不是web或者maven的war工程,是不能使用的。
若使用tomcat服务器,采用的连接池是dbcp连接池
9.数据库属性配置文件
1)把数据库的配置信息单独放到一个文件中,和mybatis主配置文件分开
目的是便于修改,保存,处理多个数据库的信息。
在resources目录中定义一个属性配置文件,xxx.properties
在属性配置文件中用key=value来定义数据
key:一般使用.来做多级目录
例如,jdbc.mysql.driver=com.mysql.jdbc.Driver
jdbc.mysql.url=jdbc:mysql://localhost:3306/ssm
jdbc.username=root
jdbc.password=Syp960722..
2) 在mybatis的主配置文件中使用<property>标签指定文件的位置。
在需要使用值的地方,使用${key}
3)配置多个mapper文件
第一种方式
<mappers>
<mapper resource="com/bjpowernode/dao/StudentDao.xml"/>
<mapper resource="com/bjpowernode/dao/OrderDao.xml"/>
</mappers>
第二种方式
<mappers>
<package name="com.bjpowernode.dao" />
</mappers>
6.PageHelper用来做数据分页的
相当于贴吧分页显示楼层一样
1)将Page Helper加入依赖
2)