前言
什么是框架?
框架就是对技术的封装,将基础的技术进行封装,便于程序员使用,提高开发效率
ssm框架是什么?
ssm包括spring、springMvc、Mybatis,是后端企业级开发时会使用到的框架组合,在开发时经常会搭配在一起使用,共同构建企业级web应用程序
ssm框架用在哪些方面?
1.业务逻辑层:使用spring管理业务逻辑层的Bean,比如复杂的验证,逻辑代码
2.控制层:使用 Spring MVC 作为控制层,处理 HTTP 请求和响应,将请求转发给相应的业务逻辑层处理,并将处理结果返回给客户端。
3.数据访问层:使用Mybatis作为数据访问层对数据进行操作,与数据库进行交互
Mybatis
mybatis原来是Apache下的一个开源项目,2010年开发团队转移到谷歌旗下,改名为mybatis
什么是Mybatis框架?
Mybatis是一款优秀的数据持久层框架,避免了jdbc几乎所有的手动设置参数,手动映射结果等,它将JDBC进行封装,与数据库进行交互,通常作为数据访问层。
Mybatis框架的作用?
Mybatis将基本的jdbc常用接口封装,对外提供操作即可,可以使用xml配置或注解的方法.将数据库中记录自动映射到java对象中,是一种orm实现(对象关系映射),将可以自动将数据库记录映射到对象中的这种框架也称为orm框架。
Mybatis支持动态sql(sql语句中可以加入if判断等)和数据缓存
如何使用Mybatis框架?
1.创建Maven项目
2.导入Mybatis的jar包,使用maven刷新
3.在resources下创建mybatis.xml全局配置文件,配置数据库连接参数
4.创建测试所用的数据库和表
5.创建接口,写事物的行为方法
6.在resources下新建一个directory目录记为mappers,在mappers下写接口对应的映射文件,实现方法sql
7.创建测试类进行测试
测试
public static void main(String[] args) throws IOException {
//测试mybatis
//1.mybatis读取配置文件
Reader reader = Resources.getResourceAsReader("mybatis.xml");
//2.创建SqlSessionFactory--负责创建SqlSession对象(连接数据库的回话对象,类似connection)
//SqlSessionFactory对象也只需要创建一个,创建后不需要销毁
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
//3.创建SqlSession对象
SqlSession sqlSession = sessionFactory.openSession();
//4.获得接口代理对象
//创建接口的代理对象(接口是不能new对象的)
AdminDao adminDao = sqlSession.getMapper(AdminDao.class);
//5.调用
Admin admin = adminDao.findAdminById(1);//让代理对象帮我们调用映射文件中与此接口中相同名称的方法
System.out.println(admin);
//6.关闭会话对象
sqlSession .close();//关闭与数据库的链接对象
}
为了方便程序员测试代码,安装一个叫mybatisX的插件方便测试
成功安装插件后,使用如下图左边边框的绿色按钮进行测试方法
事务的概念很重要(ACID特性),
注意!除去查询操作,其余操作都需要调用commit方法才能对数据库进行操作(保证事务的一致性和原子性)
数据库连接池
每对数据库进行一次访问就需要创建数据库连接对象,访问完毕close。在实际企业级开发中这样会大大的增加系统开销,所以就提出了数据库连接池的概念。使用数据库连接池,在池(集合)中事先创建一些连接对象,用户访问时,就直接从池中获取一个连接对象,用完不销毁。还回到池中,这样就减少了频繁创建销毁连接对象。
Mybatis全局配置文件示例
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTDConfig3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--mybatis核心全局配置文件-->
<!--日志信息-->
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
<!--如果表中的类名与类中的属性名完全相同,mybatis会自动将查询结果封装到POJO对象中.
如果java中使用标准驼峰命名,数据库中使用下划线连接命名,可以开始全局设置实现自动转换
单表查询时,mybatis可以自定义的将一条记录响应到model对象
数据库为下划线链接,java为驼峰命名,就可以给model对象赋值-->
<setting name="mapUnderscoreToCamelCase" value="true"/>
<!---->
<setting name="cacheEnabled" value="true"/>
</settings>
<!--为类配置别名-->
<typeAliases>
<package name="com.ffyc.mybatis.model"/>
</typeAliases>
<!--配置数据库连接相关信息-->
<environments default="development">
<environment id="development">
<!---->
<transactionManager type="JDBC"/>
<!--type="POOLED" 使用数据库连接池功能,默认创建是个连接对象-->
<dataSource type="POOLED">
<!--数据库连接配置-->
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/ssmdb?serverTimezone=Asia/Shanghai"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!--注册映射文件-->
<mappers>
<mapper resource="mappers/AdminMapper.xml"></mapper>
<mapper resource="mappers/StudentMapper.xml"></mapper>
<mapper resource="mappers/MajorMapper.xml"></mapper>
<mapper resource="mappers/TeacherMapper.xml"></mapper>
</mappers>
</configuration>
mappers目录下映射文件示例
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTDMapper3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--sql映射文件 主要写sql实现-->
<!--名字必须和接口处名字一至-->
<mapper namespace="com.ffyc.mybatis.dao.TeacherDao">
<cache flushInterval="6000">
</cache>
<!--update之trim标签-->
<!--<update id="updateTeacher" parameterType="Teacher">
update teacher
<trim prefix="set" suffixOverrides=",">
<if test="num!=null">
num = #{num},
</if>
<if test="name!=null">
name=#{name},
</if>
<if test="gender!=null">
gender=#{gender}
</if>
</trim>
where id = #{id}
</update>-->
<!--update之set标签-->
<update id="updateTeacher" parameterType="Teacher">
update teacher
<set>
<if test="num!=null">
num = #{num},
</if>
<if test="name!=null">
name=#{name},
</if>
<if test="gender!=null">
gender=#{gender}
</if>
</set>
where id = #{id}
</update>
<!--批量删除 之 foreach-->
<delete id="deleteTeacher">
delete from teacher where id in
<foreach item="id" collection="array" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
<!--useGeneratedKeys 返回自增主键
keyProperty 定义接收属性
keyColumn 定义主键列-->
<!--
动态sql :
可以在sql中添加逻辑判断
if test(属性条件成立? 执行: 不执行
where标签 当where标签 if语句有条件成立时,就会动态添加where关键字,还可以啥拿出where后面紧跟着的
关键字 例如 安and or -->
<!-- <select id="TEACHERS" resultType="com.ffyc.mybatis.model.Teacher">
select * from teacher
<where>
<if test="num!=null">
num=#{num}
</if>
<if test="name!=null">
and name=#{name}
</if>
<if test="gender!=null">
and gender=#{gender}
</if>
</where>
</select>-->
<!--
trim 当判断条件成立时,可以自定义前缀和后缀关键字
prefix="where"
prefixOverrides="and|or"
-->
<!--<select id="TEACHERS" resultType="com.ffyc.mybatis.model.Teacher">
select * from teacher
<trim prefix="where" prefixOverrides="and|or">
<if test="num!=null">
num=#{num}
</if>
<if test="name!=null">
or name=#{name}
</if>
<if test="gender!=null">
and gender=#{gender}
</if>
</trim>
</select>-->
<select id="TEACHERS" resultType="com.ffyc.mybatis.model.Teacher">
select * from teacher
<trim prefix="where" prefixOverrides="and|or">
<choose>
<when test="name!=null">
name = #{name}
</when>
<!--可以只有when而没有otherwise,但是不能只有otherwise-->
<otherwise>
name = '李老师'
</otherwise>
</choose>
</trim>
</select>
<select id="findTeacher" resultType="com.ffyc.mybatis.model.Teacher">
select
<foreach item="col" collection="list" separator=",">
${col}
</foreach>
from teacher
</select>
</mapper>