mybatis 内容回顾
// 回顾一下mybatis 的学习内容 加深一些内容的印象
一、Mybatis的简介
什么是mybatis : mybatis的前身是ibatis, 是一款有apache开源组织开发的一款Java持久层框架产品。未来会替换JDBC的操作数据库,简化JDBC操作数据库的复杂性。
二 Mybatis的特点:
2.1 简单: 大大的简化了JDBC操作数据库的复杂性,使用Mybatis开发操作数据库的代码,基本上看不到任何JDBC的原生复杂的代码。 学习上手简单, 正因文学习成本低,所以很多人都在使用Mybatis。
2.2 灵活: Mybatis开发操作数据库,将sql语句书写在配置文件中, 便于对sql语句的调优和项目的维护。
三 相关文件的配置
单独整理 详见其他文章 dao层实现 由mybatis 配置文件完成
mybatis的核心API:
API名称 | 作用 |
---|---|
Resources | 用于读取和解析mybatis-config.xml全局配置文件。 |
SqlSessionFactory | 主要作用就是用于创建SqlSession的 |
SqlSession | 1. SqlSession类似于JDBC开发中Connection对象的作用,一个SqlSession中封装了一个Connection对象,所以mybtais开发的时候使用SqlSession对象控制事务。2由于mybatis是采用mapper文件作为代理DAO接口的实现,所以我们需要使用SqlSession去获取最终的DAO实现类对象,然后调用DAO的方法。 |
四 增删查改
PS: Mybatis框架的事务是自动回滚处理 ,所以在执行完写(增 删 改)操作后,必须手动提交事务。
mybatis中接口参数绑定机制
查询的内容比较多 有关知识点略多也比较重要
1. 接口方法一个参数 : mapper文件中#{}取值语法里面,写什么都可以。
<select id="selectByBookId" resultMap="bookMap">
select *
from D_BOOK
where BOOK_ID=#{bid}
</select>
//与之对应的dao接口 方法名和 配置文件中对应标签的id 对应保持一致
DBook selectByBookId(@Param(value="bid") Integer bid);
2.接口方法多个参数:
2.1 注解方式绑定: 专门用于条件查询。可读性高
PS: @Param注解的value属性可以省略。
//查询
<update id="updateState" >
update D_USER set STATE=1
where EMAIL=#{email}
</update>
//删除
<delete id="deleteOne">
delete d_user
where id=#{id}
</delete>
//插入 如果不需要提前获取对应的id值
<insert id="insertUser">
insert into d_user
values (duser_seq.nextval,#{nickname},#{password},#{email},#{state})
</insert>
//如果需要提前获取对应的id值 就不能用序列自增 可以使用<selectKey>标签
//在执行添加语句之前先生成一个序列号 并赋值到参数对象中对应主键属性上
//keyProperty 指定当前查询返回值的主键值封装到实体类对应的哪个属性上
//其他的 望文生义大概也能猜的到
<insert id="addOrder" >
<selectKey resultType="int" keyProperty="id" order="BEFORE">
select ORDER_SEQ.nextval from dual
</selectKey>
insert into D_ORDER
values (#{id},#{goodPrice},sysdate,0,#{addrId},#{userId})
</insert>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2b1jzrWQ-1599122431840)(file:///C:/Users/86150/AppData/Local/Temp/msohtmlclip1/01/clip_image002.jpg)]
封装的 Mybatis工具类
public class MybatisUtil{
static SqlSessionFactory factory=null;
//静态代码块 在类加载时执行一次
static {
InputStream in =null;
try {
//读取核心配置文件
in = Resources.getResourceAsStream("mybatis-config.xml");
factory =new SqlSessionFactoryBuilder().build(in);
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException("初始化失败");
}finally{
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
private static ThreadLocal<SqlSession>tol=new ThreadLocal<SqlSession>();
//获取 sqlsession
public static SqlSession openSession(){
SqlSession sqlSession = tol.get();
if (sqlSession==null) {
sqlSession = factory.openSession();
tol.set(sqlSession);
}
return sqlSession;
}
//提交事务
public static void commit(){
SqlSession sqlSession=tol.get();
if (sqlSession!=null) {
sqlSession.commit();
}
}
//事务回滚
public static void rollback(){
SqlSession sqlSession=tol.get();
if (sqlSession!=null) {
sqlSession.rollback();
}
}
//关闭资源
public static void close(){
SqlSession sqlSession=tol.get();
if (sqlSession!=null) {
sqlSession.close();
tol.remove();
}
}
}
mapper文件中的另一种取值语法
-
${}取值方式的使用 相当于 之前jdbc 学习中的字符串拼接 存在sql 注入的风险
-
#{} 相当于 原来的占位符赋值
mybatis其他常用的全局配置
1.给实体类起别名 (避免每次都写很长的结构)
① 第一种方式 给指定类起别名
<typeAliases>
<typeAlias type="包名.类名" alias="别名"/>
</typeAliases>
2 第二种方式 给指定包下的所有实体类其别名 别名 默认 为类名
<typeAliases>
<package name="包名"/>
</typeAliases>
关于mybatis的结果集映射
-
mybatis默认结果集封装规则: mybatis默认会将数据库查询返回结果集中的字段名, 对应封装到实体类属性名一致的属性上。
-
当查询返回结果集中的字段名与实体属性名不一致的解决
2.1 第一种方案: 给查询结果的字段起个别名,与对应实体类属性名一致。
2.2 第二种方案: 使用mybatis的resultMap自定义结果集映射关系。
<resultMap id="addressMap" type="Address"> //column 与sql语句查询结果的字段名一致 property 与类的属性对应 <id column="id" property="id"/>//主键 <result column="name" property="name"/>//普通字段 <result column="address" property="address"/> <result column="lxfs" property="lxfs"/> <result column="status" property="status"/> <result column="destatu" property="destatu"/> </resultMap> //对应类 部分代码 public class Address implements Serializable{ private Integer id; private Integer userId; private String name; private String address; private String lxfs; private Integer status; 。。。。。。。。 } // mapper文件中 <select id="selectAll" resultMap="addressMap"> select * from address where destatu=0 and USERID=#{userId} </select>
\2. 使用mybatis开发关联关系的查询
多对一 实体类中定义关联属性 mapper文件中 通过标签进行关系映射 注意标签属性的对应关系
一对多 使用 对应的 ofType 是泛型中的类
Mybatis中的动态SQL机制 【重点】
1.SQL片段 : 我们可以将多个SQL语句涉及到重复使用的信息,定义为一个SQL片段,提高代码的复用性。
假设表有多个字段 id nickname score sex
<sql id="student_column">
id, nickname name ,score sex
</sql>
<select id ="方法名" reslutMap="">
select
<include refid="student_column"/>
from 表名
</select>
\2. where动态SQL子句 使用
3 foreach 实现批量删除
简单的做了一个内容上的回顾 不足之处多多包涵 方便自己回头看看
相关内容一些写的也没有很详细 可以百度一下
注:案例中 数据库 使用的Oracle