Mybatis小结
-
Mybais优秀的== 持久层== 框架技术,是一个orm体系的技术内容。
-
持久层:数据的持久化操作
-
框架:软件的半成品(毛坯房)–冗余、扩展 、维护。
ORM: 对象关系映射Class Person{
Private Dog dog;
}
Class Dog{
}
Mysql 关系型数据
通过二维表进行描述,实现一一对应的效果。
Mybatis使用:
(1)可以灵活的切换不同的关系型的数据库
(2)自动的事务管理,sql执行单元(包含了多条sql语句),在主配置文件中添加了事务,不需要在每个操作的方法中重复添加事务,减少代码冗余。事务管理器—>链接对象中途不能够更换。
(3)Mybaits配置的sql是在单独的一个配置文件中,不是在我们代码里面。
Java sql 不能够耦合在一起的,可读性较差。
(4)Namespace sql配置文件中的属性必须出现, 区分多个配置文件中的statement对象
(5)Mapper中映射语句的执行过程
A: select uid,name,uphone from user
结果:
这些数据被封装成 ResultSet(只能获取我们的结果数据)
ResultSet—> ResultSetMetadata(获取我们每一行的列数,获取列的名称就是java类中的属性名)
在配置文件中描述了结果对应的java类型
resultType="com.offcn.pojo.User"
Class clazz = Class.ForName(“com.offcn.pojo.User”);
Object obj = Clazz.newInstance();
String FieldName = ResultSetMetadata.getColumnName(int);
Field field = Clazz.getField(FieldName );
field.setAccessible(true);
Field.set(obj,value);
(6)Statement的封装
<select id="selectBlog" resultType="com.offcn.pojo.User">
select uid,uname,uphone from user
</select>
Mybatis底层是一个集合map<标记,Statement>
基于接口代理方式
public interface UserMapper {
//声明内容 基于业务的操作
public List<User> getAllInfo();
}
<select id="getAllInfo" resultType="com.offcn.pojo.User">
select uid,uname,uphone from user
</select>
//基于接口代理的操作(动态代理的设计模式 接口代理对象)
UserMapper mapper = openSession.getMapper(UserMapper.class);
//代理对象调用方法不是接口自身对象调用方法
List<User> list = mapper.getAllInfo();
多参数处理
注意:
我们在sql中去使用我们的方法的参数索引的时候 3.4.1及以下版本使用 0 1
以上版本我们使用 arg0 arg1
我们经常使用的就是:
@Param
Object
#{} ${}区别
#{}: 解析成为占位符 PreparedStatement 预编译
${}: 解析程拼接字符串 Statement 静态sql
Like 模糊查询:
select uid,uname,uphone from user where uname like "%"#{uname}"%"
select uid,uname,uphone from user where uname like ‘%${uname}%’
select uid,uname,uphone from user where uname like
CONCAT('%',concat(#{uname},'%'))
SELECT * FROM USER WHERE uname LIKE ‘%/%%’ ESCAPE ‘/’
声明一个转义字符: ESCAPE ‘一个字符 我们习惯使用 /’,这个字符后面的近邻这的那个字符内容不被转义。
多表联合查询(业务的考察和模型关系的建立)
<resultMap type="com.offcn.pojo.User" id="newUser">
<id column="uid" property="uid"></id>
<result column="uname" property="uname"/>
<result column="uphone" property="uphone"/>
<association
property="car" column="uid"
javaType="com.offcn.pojo.Car"
select="com.offcn.dao.CarMapper.getCarByCid"
></association>
<collection
property="list" column="uid"
ofType="com.offcn.pojo.Orders"
select="com.offcn.dao.OrdersMapper.getOrdersByUid"
></collection>
</resultMap>
延迟加载:
<!--按需加载:根据用户的需要去数据库中查询数据。
fetchType="lazy"
-->
<association
property="car" column="uid" javaType="com.offcn.pojo.Car"
select="com.offcn.dao.CarMapper.getCarByCid"
fetchType="lazy" ></association>
<collection
property="list" column="uid" ofType="com.offcn.pojo.Orders"
select="com.offcn.dao.OrdersMapper.getOrdersByUid"
fetchType="lazy"></collection>
动态sql语句
动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL,可以彻底摆脱这种痛苦。
if
trim (where, set)
foreach
choose (when, otherwise)
前提提条件:使用的变量名称必须有声明
<if test=”变量名称必须有声明”>
Sql操作
</if>
<select id="getLikeInfo" resultType="com.offcn.pojo.User" parameterType="string">
select uid,uname,uphone from user
<!--
如果标新范围内有成立的条件 那么就会解析程where关键字,忽略第一个成立条件前面 and or
如果标新范围内没有成立的条件 where标签自动忽略
-->
<!--
<where>
<if test="uname!=null and uname.length()>0 or uname.equals('admin')">
uname = #{uname}
</if>
<if test="uphone!=null and uphone.length()>0 or uphone.equals('110')">
and uphone = #{uphone}
</if>
</where>
-->
<trim prefix="where" prefixOverrides="and|or">
<if test="uname!=null and uname.length()>0 or uname.equals('admin')">
uname = #{uname}
</if>
<if test="uphone!=null and uphone.length()>0 or uphone.equals('110')">
and uphone = #{uphone}
</if>
</trim>
</select>
<delete id="batchDelete" parameterType="java.util.List">
delete from user
<where>
<if test="array != null">
<foreach collection="array" item="id" open="uid in(" close=")" separator=",">
</foreach>
</if>
</where>
</delete>
逆向工程的内容使用
/*
* public UserExample() {
oredCriteria = new ArrayList<Criteria>(); 条件对象集合初始化
}
*
* */
UserExample userExample = new UserExample();
Criteria cc = userExample.createCriteria();
cc.andUidEqualTo(2);
cc.andUnameEqualTo("admin");
cc.andUphoneEqualTo("10");
Criteria ccc = userExample.createCriteria();
ccc.andUidBetween(45, 1660);
userExample.or(ccc);
userExample.setOrderByClause("uname");
userExample.setDistinct(true);
mapper.selectByExample(userExample);