1.mybatis概述
原是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation 迁移到了 Google Code,随着开发团队转投Google Code 旗下, iBatis3.x正式更名为MyBatis。
MyBatis 是一款优秀的持久层框架。
MyBatis 避免了几乎所有的JDBC代码手动设置参数以及手动获取结果集的操作。
Mybatis 将基本的JDBC常用接口封装,对外提供操作即可.
MyBatis 可以使用XML或注解来配置和映射,将数据库中的记录映射成 Java 的 POJO(Plain Old Java Objects,普通的 Java 对象),是一种 ORM(ORM Object Relational Mapping 对象关系映射)实现. 它支持动态SQL以及数据缓存.
2.mybatis搭建
-
创建一个maven项目
-
导入mybatis 依赖的jar
-
.创建一个全局的mybatis配置文件,配置数据库连接等配置
-
创建数据库 创建表 准备数据库
-
创建一个访问接口,定义方法
-
创建接口对应映射文件
-
测试mybatisgu
mybatis 依赖的jar
<!--mybatis框架-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.2</version>
</dependency>
创建一个全局的mybatis配置文件,
配置数据库连接等配置
创建sql映射文件
<?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC"-//mybatis.org//DTDMapper3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mappernamespace="接口的地址">
<selectid="findAdminById"parameterType="int" resultType="com.ffyc.mybatis.model.Admin">
select * fromadmin whereid=#{id}
</select>
</mapper>
测试mybatis
//1.mybatis读取配置文件
Reader reader = Resources.getResourceAsReader("mybatis.xml");
//2.创建 SqlSessionFactory,负责创建Session对象(连接数据库的会话对象)
//SqlSessionFactory对象也是只需要创建一次,创建后不需要销毁
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
//3.创建SqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//4.创建接口的代理对象
Admindao admindao = sqlSession.getMapper(Admindao.class);
//5.调用
Admin admin = admindao.findAdminById(1);//让代理对象帮我们调用映射文件中与此接口中相同名称的方法
System.out.println(admin);
//关闭会话
sqlSession.close();//关闭连接对象
3.Mybatis-Dao 层面向接口开发
面向接口开发方式只需要程序员编写接口,由Mybatis框架创建接口的动态代理 对象,使用sqlsession.getMapper(接口.class);获得代理对象.
面向接口开发需要遵循以下规范:
1、 Mapper.xml文件中的namespace与mapper接口的类路径相同.
2、 Mapper接口方法名和Mapper.xml中定义的每个statement的id相同.
3、 Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的 parameterType 的类型相同.
4、Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的 resultType 的类型相同.
4.Mybatis 日志
具体选择哪个日志实现由MyBatis的内置日志工厂确定。它会使用最先找到的。 Mybatis 内置的日志工厂提供日志功能,具体的日志实现有以下几种方式: SLF4J|LOG4J|JDK_LOGGINGCOMMONS_LOGGING|STDOUT_LOGGING 配置日志
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
5.参数传递
单个参数直接传递
/*
参数传递
*/
//单个参数传递
Admin findAdminById(int id);
多个参数传递
多个参数传递可以用@param("id")绑定
//多个参数的传递
Admin login(@Param("acc") String account, @Param("pwd") String password);
在映射文件中这样写
如果传递一个复杂的对象,就需要用parameterType参数进行类型定义
传入一个admin对象,admin中有许多属性,就比较复杂,如果用@param绑定就会非常的麻烦,
此时我们就得想其他的办法,用parameterType参数进行类型定义
Admin login1(Admin admin);
<select id="login1" parameterType="Admin" resultType="Admin">
select * from admin where account = #{account} and password = #{password}
</select>
6.增删改查
1.增
<insert id="唯一标识" useGeneratedKeys="把新增加的主键赋值到自己定义的 keyProperty " keyProperty=“ 接收主键的属性 parameterType="参数类型">
<insert id="insertAdmin" parameterType="Admin" useGeneratedKeys="true" keyProperty="id" keyColumn="id">
insert into admin(account,password,gender)values (#{account},#{password},#{gender})
</insert>
2.删
<delete id="唯一标识" parameterType="参数类型">
<delete id="deleteAdmin" parameterType="int">
delete from admin where id = #{id}
</delete>
3.改
<update id="唯一标识" parameterType="参数类型">
<delete id="deleteAdmin" parameterType="int">
delete from admin where id = #{id}
</delete>
4.查
<select id="唯一标识" resultType="返回结果集类型">
<select id="login" resultType="Admin">
select * from admin where account = #{acc} and password = #{pwd}
</select>
7.结果处理
------简单结果映射
返回简单基本类型 例如:
<select id="finAdminCount" resultType="int">
select count (*) from admin
</select>
-------对象映射
如果表中的类名与类中的属性名完全相同,mybatis会自动将查询结果封装 到POJO对象中.
如果java中使用标准驼峰命名,数据库中使用下划线连接命名,可以开始全局 设置实现自动转换
<setting name="mapUnderscoreToCamelCase" value="true"/>
----- #{}和${}的区别
#{} 是占位符,是采用预编译方式向sql传值,可以防止sql注入,如果我们在sql中传值,使用#{} #{}:delete from admin where id=#{id} 结果:delete from admin where id = ? ${} 她是将内容直接拼接到sql语句中,一般不用于向sql中传值,一般用于向sql中动态的传递列名 ${}: delete from admin where id=’${id}’ 结果:delete from admin where id=’1’ 区别: 底层实现不同 #{} 采用预编译方式 防止sql注入,更加安全 ${} 采用字符串拼接,直接将值拼接到sql中 使用场景不同 #{} 一般用于向sql中的列传值 ${} 一般用于向sql中动态传递列名 例如 排序时 order by 后面的列名是可以改变的 例如 select 后面的列名可以自由选择
8.特殊处理resultMap
----定义resultMap
使用resultMap标签,对查询结果进行自定义映射 type="Admin" 最终返回结果的类型(1). resutlMap 的 id 属性是resutlMap的唯一标识,本例中定义为 “adminResultMap”
(2). resutlMap 的 type 属性是映射的POJO类型
(3). id 标签映射主键,result标签映射非主键
(4). property 设置对象属性名称,column映射查询结果的列名称
<resultMap id="adminMap" type="Admin">
<id column="adminid" property="id"></id>
<result column="account" property="account"></result>
</resultMap>
<select id="findAdmin1" resultMap="adminMap">
select id adminid , account from admin
</select>
----使用resultMap
根据上面代码,
(1). 我们的输出映射使用的是resultMap,而非resultType
(2). resultMap 引用了 adminResultMap
9.查询处理结果集
-----嵌套查询
<resultMap id="StudentMap" type="Student">
<id column="id" property="id"></id>
<result column="num" property="num"></result>
<result column="name" property="name"></result>
<result column="gender" property="gender"></result>
<!-- 映射关联数据 专业名称 首先或创建一个专业对象,然后将专业名称封装到Major对象,最后将Major对象封装到Student对象中-->
<association property="major" javaType="Major">
<result column="mname" property="name"></result>
</association>
</resultMap>
<!-- 关联查询方式1:-->
<select id="findStudentById" resultMap="StudentMap">
select
s.id,
s.num,
s.name,
s.gender,
m.name mname
from student s inner join major m on s.majorid = m.id where s.id = #{id}
</select>
-----多表关联查询
<resultMap id="studentMap1" type="Student">
<id column="id" property="id"></id>
<result column="num" property="num"></result>
<result column="name" property="name"></result>
<result column="gender" property="gender"></result>
<association property="major" javaType="Major" select="findMajorById" column="majorid"></association>
</resultMap>
<select id="findStudentById2" resultMap="studentMap1">
select id,num,name,gender,majorid from student where id = #{id}
</select>
<select id="findMajorById" resultType="Major">
select name from major where id = #{majorid}
</select>