mybatis随笔(4)

回顾
回顾mybatis开发过程,首先先创建配置文件,配置其中的数据库源和数据库信息,创建接口和xml文件,接口书写接口方法,这个接口方法就是xml文件(SQL语句实现文件)中对应SQL标签的id;不同的SQL语句有不同的标签; 完成接口和xml文件的映射——xml文件中mapper标签中的namespace属性填写接口的全限定类名;书写SQL语句;
什么是全限定类名,公式:全限定类名 = 包名+类型名;
编写测试类:获取sqlSession,使用sqlSession中的getMapper(interface.class)方法获取对象,注册Mapper,使用对像调用接口方法即可完成一个简单的mybatis操作。
属性优化:可以将配置数据库的语句和mybatis配置文件隔离开来,使用properties标签获取到外部配置文件的内容,然后再配置数据库中使用${}来获取value。值得注意的是mybatis中到的标签不能够随意增加,要按照指定的顺序才行,否则就会报错——properties,settings,typeAliases,typeHandlers,objectFactory,objectWrapperFactory,reflectorFactory,plugins,environments,databaseIdProvider,mappers
setting:使用setting可以在mybatis中增加插件或者增加一些额外的功能,比如说增加日志,值得注意的是setting中的name和value不能瞎填,要填写指定的代码,多一个空格都不行,具体的代码可以在mybatis官方文档中找到
生命周期:SqlSessionFactoryBuild的生命周期很短,基本上是通过其获取到sqlSessionFactory就可以进行销毁了; sqlSessionFactory的生命周期贯穿整个项目,一旦创建就应该一直存在,因为需要通过它获取到sqlSession; sqlSessionFactory之所以要一直存在,是因为sqlSession的作用域是请求/方法作用域,即一个方法/一个请求创建一个sqlSession,用完即销毁。
结果集映射:结果集映射用来解决实体类和数据库查询出来的列名不一致的问题;id属性,SQL标签要使用该结果集映射时要填写和id一样的代码,完成该SQL标签和结果集映射标签的映射;type属性表示是对那个实体类的映射。resuleMap标签下使用result标签完成属性和数据库列的映射,其中column写数据库列,property写属性列
分页:分页有三种方式,原生的limit、Rowbouns、PageHelper,三者不同之处:PageHelper是插件分页,limit是取符合条件的前几项,Rowbounds是将所有数据查询出来之后再进行分页(不推荐)
到此回顾完毕

使用注解开发
mybatis使用注解开发可以不创建xml查询文件,但是弊端也很明显,对于较为复杂的SQL语句会显得接口变得十分臃肿,且无法完成复杂的SQL语句
userMapper.java

import com.mybatis.pojo.User;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
public interface userMapper {
@Select(“select * from user where id = #{id}”)
public User userListByIdTwo(@Param(“id”) int id);
}
测试

@Test
public void userListById(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    userMapper mapper = sqlSession.getMapper(userMapper.class);
    User user = mapper.userListByIdTwo(1);
    System.out.println(user.toString());
}

事务
mybatis的增删改都需要在最后提交事务,否则就会自动回滚,这是mybatis对于SQL数据的一种保护措施,淡然也可以自动提交事务,就是在获取SqlSession时改成这样sqlSessionFactory.openSession(true);
在非自动提交事务中,使用sqlsession.commit()方法提交事务,废话不多说,上代码:
userMapper.xml

<insert id="insert" parameterType="user">
    insert into user (id, name, pwd) value (#{id}, #{name}, #{pwd});
</insert>

userMapper.java

public int insert(User user);

测试类

@Test
public void insert(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    userMapper mapper = sqlSession.getMapper(userMapper.class);
    User user = new User();
    user.setId(5);
    user.setName("暴风");
    user.setPwd("1222");
    int insert = mapper.insert(user);
    System.out.println(insert);
    sqlSession.commit();
    sqlSession.close();
}

#{} 和 KaTeX parse error: Expected ‘EOF’, got ‘#’ at position 7: {}的区别 #{}是预编译处理,传进来的数据…{}则是字符替换的方式,直接占据占位符的位置;这也是为什么KaTeX parse error: Expected ‘EOF’, got ‘#’ at position 87: …p table user;使用#{}的方法所得出来的SQL语句…{}则是这样的:
select * from user where name = 001; drop table user;,这样的结果就是把表给删除了。
但是 也 并 非 毫 无 可 取 之 处 , 在 原 生 J D B C 中 不 支 持 占 位 符 的 地 方 但 是 需 要 动 态 获 取 的 要 使 用 {}也并非毫无可取之处,在原生JDBC中不支持占位符的地方但是需要动态获取的要使用 也并非毫无可取之处,在原生JDBC中不支持占位符的地方但是需要动态获取的要使用{},例如动态取列名,动态按列排序等等。

总结
1、可以直接使用注解来完成SQL语句的开发,但是局限性较大,不建议使用
2、可以使用sqlSessionFactory.openSession(true)来完成自动提交事务
3、Mybatis中对事务的增删改都必须提交事务
4、#{}和KaTeX parse error: Expected ‘EOF’, got ‘#’ at position 9: {}的区别在于,#{}采用的是预编译的方式处理,…{}则是直接占据了原本占位符的位置
5、通过#{}传进来的数据会被自动转换为字符串,即加上了"",所以SQL语句在查询的时候,会根据传进来的参数去查询;KaTeX parse error: Expected ‘EOF’, got ‘#’ at position 26: …所以不能够防止SQL注入 6、#{}和{}中,涉及占位符的尽量使用#{},如果原生JDBC不支持占位符但要动态参数的,则需要使用${}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值