Mybatis

mybaits

第一章

1.三层架构

界面层:和用户打交道的,接收用户的请求参数,显示处理结果的(jsp,html,servlet)
业务逻辑层:接收了界面层传递的数据,计算逻辑,调用数据库,获取数据
数据访问层:就是访问数据库,执行对数据的查询,修改,删除等等的

三层对应的包
界面层:controller包(servlet)
业务逻辑层:service包(xxxService类)
数据访问层:dao包(xxxDao类)

三层中的类的交互
用户使用界面层---》业务逻辑层--》数据访问层(持久层)---数据库(mysql)

三层对应的处理框架
界面层---servlet----springmvc(框架)
业务逻辑层---service类----spring(框架)
数据访问层----dao类----mybaits(框架)


2.框架


框架就是一个舞台,一个模板

模板:

 

1.规定好了一些条款,内容
2.加入自己的东西

框架是一个模板
1.框架中定义好了一些功能,这些功能是可用的
2.可用加入项目中自己的功能,这些功能可用利用框架中写好的功能

框架是一个软件,半成品的软件,定义好了一些基础功能,需要加入你的功能就是
完整的了。基础功能时可以重复利用的,可以升级的

框架特点

1.框架一般不是全能的,不能做所有的事情
2.框架是针对某个领域有效的,特长在某个方面,比如mybaits做数据库操作强,但是它不能做其他的
3.框架是一个软件

 

mybaits框架

一个框架,早期叫做ibaits,代码在github
mybaits是Mybaits SQL Mapper Framework for Java(sql映射框架)

1)sql mapper :SQL映射

可以把数据库表中的一行数据,映射成一个java对象
一行数据可以看做是一个java对象,操作这个对象,就相当于操作表中的数据

2)Data Access Objects(DAOs):数据访问,对数据库这行增删改查。

mybaits提供了那些功能
    1.提供了创建Connection,Statement,ResultSet的能力,不用开发人员创建这些对象了
    2.提供了,执行sql语句的能力,不用你执行SQL
   3.提供了循环SQL,把SQL的执行结果转换成java对象,List集合的能力
while(rs.next()){
Student stu=new Student();
stu.setId(rs.getInt("id"));
stu.setName(rs.getString("name"));
stu.getAge(rs.getInt("age"));
//从数据库中取出数据转换为Student对象,封装到list集合
stuList.add(stu);
}

  4.提供了关闭资源的能力,不用你关闭Connection,Statement,ResultSet

开发人员做的是:提供sql语句
最后是:开发人员提供sql语句---mybatis处理SQL--开发人员等到list集合或者java对象(表中的数据)

总结:
mybatis是一个SQL映射框架,提供的数据库的操作能力,增强的JDBC
使用mybaits让开发人员集中精神写SQL语句就可以了,不必关心Connection,Statement,ResultSet
的创建和销毁,SQL的执行

第二章

1.主要类的介绍

1)Resources:mybatis中的一个类,负责读取主配置文件

InputStream in=Resources.getResourceAsStream("mybatis.xml");

2)SqlSessionFactoryBuilder:创建SqlSessionFactory对象

SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
//创建SqlSessionFactory对象
SqlSessionFactory factory=builder.build(in);

3)SqlSessionFactory :重量级对象,程序创建了一个对象耗时比较长,使用资源比较多
整个项目中,有一个就够用了

SqlSessionFactory:接口,接口实现类:DefaultSqlSessionFactory
SqlSessionFactory作用:获取SqlSession sqlSession=factory.openSession();

openSession()方法说明:
1.openSession():无参数的,获取的是非自动提交事务的SqlSession对象
2.openSession(boolean):openSession(true):获取的是自动提交事务的SqlSession
openSession(false):获取的是非自动提交事务的SqlSession
4)SqlSession:
SqlSession接口:定义了操作数据的方法,例如selectOne();selectList();insert();update();
commit();rollback();
SqlSession接口的实现类DefaultSqlSession。

使用要求:SqlSession对象不是线程安全的,需要在方法内部使用,在执行SQL语句之前,使用
openSession(),在执行完SQL语句之后,要关闭它,执行SqlSession.close();,这样
就能保证它是线程安全的了

 

第三章:

 

1.动态代理:使用SqlSession.getMapper(dao接口.class) 获取这个到接口的对象


2.传入参数:从java代码中把数据传入到mapper文件的SQL语句中

1)parameterType:写在mapper文件中的一个属性,表示dao接口中方法的参数的数据类型

例如StudentDao接口
public Student selectStudentById(Integer id)

2)一个简单类型的参数:

简单类型:mabatis把java中的基本数据类型和String都叫做简单类型
在mapper文件中获取简单类型的一个参数的值,使用#{任意字符}

接口:public Student selectStudentById(Integer id)
mapper:select id,name,email,age from student where id=#{任意字符}

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}
</select>


4)多个参数,使用java 对象

语法格式 #{属性名}

vo:value object,放的是一些存储数据的类,比如说,提交请求参数,name,age
现在想把name,age传给一个service类

vo:view object,从servlet把数据返回个浏览器使用的类,表示显示结果的类

pojo:普通的有set,get方法的java类,普通的java对象

Servlet----StudentService(addStudent(MyParam param))

entity(domain域):实体类,和数据库中的表对应的类

5)#和$

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

String sql="select id,name,email,age from student where id="+"1001"
使用的Statement对象执行SQL语句,效率比PreparedStatement低

$:可以替换表名或者列名,你能确定数据是安全的,可以使用$

#和$区别
1.#使用?在SQL语句中做到占位的,使用PreparedStatement执行SQL,效率比较高
2.#能避免SQL注入,更安全
3.$不是用占位符,是字符串连接的方式,使用Statement对象执行SQL,效率低
4.$有SQL注入的风险,缺乏安全性
5.$:可以替换表名或者列名


3.mybatis的输出结果

mybatis执行了SQL语句,得到了java对象

1)resultType结果类型,指SQL语句执行完毕之后,将数据转为java对象,java类型是任意的
resultType结果类型的值,1.类型的全限定名称,2.类型的别名,例如java.lang.Integer别名是int

 

处理方式:
1.mybatis执行SQL语句,然后mybatis调用类的无参构造方法,创建对象
2.mybatis把ResultSet指定列值赋给同名的属性

 

<select id="selectMultiPosition" resultType="com.bjpowernode.domain.Student">
select id,name,email,age from student
</select>

对等的jdbc
ResultSet rs=ps.executeQuery("select id,name,email,age from student")
while(rs.next()){
Studnet student =new Student();
student.setId("id")
student.setName("name")
}

 

2)定义自定义类型的别名

1)在mybatis主配置文件中定义,使用<typeAlias>定义别名
2)可以在resultType中使用哪个自定义别名

3)resultMap:结果映射,指定列名和java对象的属性的对应关系
   1)你自定义列值赋值该那个属性
   2)当你的列名和属性名不一样的时候,一定要使用resultMap

resultMap和resultType不要一起使用,二选一

第四章动态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,1002,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);

<foreach collection="" item="" open="" close="" separator="">
#{xxx}
<foreach>

collection:表示接口中的方法参数的类型,如果是数组使用array,如果是list集合使用list
item:自定义的,表示数组和集合成员的变量
open:循环开始时的字符
close:循环结束时的字符
separator:集合成员之间的分隔符

4) sql代码片段,就是复用一些语法

步骤
1.先定义<sql id="自定义名称唯一">SQL语句,表名,字段等</sql>
2.在使用,<include refid="id的值"/>

第五章:

1.数据库的属性配置文件:把数据库连接信息放到一个单独的文件中,和mybatis主配置文件分开 目的是便于修改,保存,处理多个数据库的信息


1)在resources目录中定义一个属性配置文件,xxx.properties,例如jdbc.properties
在属性配置文件中,定义数据,格式是 key=value
key:一般使用.作为多级目录
例如:jdbc.mysql.driver, jdbc.driver,mydriver
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql//localhost:3306/...
jdbc.username=root
jdbc.password=1223456

 

2)在mybatis的主配置文件,使用<property>指定文件的位置
在需要使用值的地方,${key}


2.mapper文件,使用package指定路径

       <mappers>

<!-- 第一种方式:指定多个mapper文件-->
<!-- <mapper resource="com/bjpowernode/dao/StudentDao.xml"/>-->
<!-- <mapper resource="com/bjpowernode/dao/OrderDao.xml"/>-->
<!-- 第二种方式:使用包名
name:xml文件(mapper文件)所在的包名,这个包中所有的xml项目一次都加载
给mybatis
使用package的要求
1.mapper文件名称需要和接口名称一样,区分大小写
2.mapper文件和dao接口需要在同一个目录下
-->
<package name="com.bjpowernode.dao"/>
</mappers>

 

posted @ 2025-02-02 22:02  白头吟  阅读(66)  评论(0)    收藏  举报