mybatis初探003

1.mybatis实现新增

1功能:从应用程序角度出发,软件具有哪些功能
2业务:完成功能时的逻辑对应Service中的一个方法
3事务:从数据库角度出发,完成业务时需要执行的SQL集合,统称一个事务。
2在mybatis中默认是关闭了JDBC的自动提交功能
2.1每一个 SqlSession默认都是不自动提交事务
2.2session.commit()提交事务
2.3openSession(true);自动提交.setAutoCommit(true);
3mybatis底层是对JDBC的封装
3.1JDBC中executeUpdate()执行新增,删除,修改的sql返回值int表示受影响的行数。
3.2mybatis中标签没有resultType属性,认为返回值都是int
4在openSession()时Mybatis会创建

2.mybatis接口绑定方案及多参数传递

1作用:实现创建一个接口后把mapper.xml由mybatis生成接口的实现类,通过调用接口对象就可以获取mapper.xml中编写的sql.
2后面mybatis和spring整合时都是用这个方案:
2.1这个方案是现步骤:
1.创建一个接口:接口的包名要和接口名与mybatis.xml中的namespace相同
2.在mybatis.xml中使用进行扫描接口和mapper.xml
3.接口中方法名和mapper.xml标签的id属性相同
2:在mybatis.xml中使用标签
在com.renhui.mapper包下创建接口
在这个包下创建一个与接口名相同的.xml文件
注意:namespace必须和接口的全限定路径(包名+类名)一致
Id必须和接口中的方法名相同
如果接口中方法为多个参数,可以省略parameterType
3多参数实现办法:
3.1在接口中声明方法
3.2在mapper.xml文件中添加#{0} #{1}….
3.3使用注解的方法(底层原理是利用map(key,value))

3.动态SQL

1.根据不同的条件,产生不同的SQL语句
2.mybatis中动态SQL在mapper.xml中添加逻辑判断等。
3.if使用:

<select id="selByID" resultType="peo" parameterType="peo">   
 select * from people  where 1=1
    <if test="id!=null and id!=''">
      and id=#{0}
    </if>
 </select>
</mapper>

4.
4.1当编写where标签时,如果内容中第一个是and去掉第一个and
4.2.如果中有内容会生成where关键字,如果没有内容不生成where关键字
4.3使用方式:
4.3.1比直接使用少些了where 1=1(从效率上讲也是提升了)

<select id="selByID" resultType="peo" parameterType="peo">   
 select * from people 
 <where>
    <if test="id!=null and id!=''">
      and id=#{0}
    </if>
     <if test="name!=null and name!=''">
      and name=#{1}
    </if>
 </where>
 </select>

5.标签
5.1循环参数内容,还具备在内容前后添加内容,还具备添加分隔符功能。
5.2适用场景:in查询中,批量新增中(mybatis中foreach效率比较低)
如果希望批量新增,SQL命令的写法
Insert into people value(default 1,2,3), (default 2,3,4),(default 3,4,5)
openSession()必须指定

SqlSession session=factory.openSession(ExecutorType.BATCH);

其底层其实就是jdbc的PreparedStatement.addBatch()
5.3使用方法:
其中:collection=“”要遍历的集合 item 迭代变量 open 循环后左侧要添加的内容 close 循环后右侧要添加的内容 separator 每次循环时,元素之间的分隔符

<select id="selByID" resultType="peo" parameterType="peo">   
 select * from people 
 <foreach collection="list" item="abc" open="(" close=")" separator=",">
  #{abc}
 </foreach>
 </select>

6和标签,将SQL语句定义出来从而随处引用,多表查询时复用

 <select id="">   
 select <include refid="mysql"></include>
   from people
 </select>
 
 <sql id="mysql">
  id,name
 </sql>

4.ThreadLocal

1.线程容器,给线程绑定一个Object内容,后只要线程不变,可以随时取出内容。
但是一旦改变线程,就无法取出内容。
2.语法示例:

 final ThreadLocal<String> threadLocal =new ThreadLocal<String>();
	 threadLocal.set("测试");
	 new Thread() {

		public void run() {
			String result=threadLocal.get();
			System.out.println("结果"+result);
		}
		 
	 }.start();
	 
}

5.缓存

1.应用程序和数据库交互的过程是一个相对比较耗时的过程
2.缓存存在的意义:让应用程序减少对数据库的访问,提升程序运行效率
3.MyBatis中默认SqlSession缓存开启
3.1同一个SqlSession对象调用同一个时,只有第一次访问数据库,第一次之后把查询的结果放在SqlSession缓存区中(内存中)
3.2缓存的是statement对象
3.2.1mybatis中一个对应一个statement对象。
3.3有效范围必须是同一个SqlSession对象
4.缓存流程
1:先向缓存中找是否存在statement
2:若缓存中有,则返回结果
3:如果没有缓存statement对象,去数据库获取数据
4:数据库返回查询结果
5:把查询结果放在对应的缓存区中
5. SqlSessionFactory缓存
5.1又叫二级缓存
5.2有效范围:同一个factory内哪个SqlSession都可以获取
5.3什么时候使用二级缓存:
5.3.1当数据被频繁使用,很少被修改
5.4在mapper.xml中添加,如果不写readOnly="true"也可以把实体类进行序列化(实现Serializeble接口)
5.5当SqlSession对象close()时或者commit时会把SqlSession数据刷到factory缓存中。

笔记插入:
乱码问题:原因:浏览器和服务器的编码不一样导致出现乱码问题
在控制器中解決
Get请求的乱码用:
String sname=req.getParameter(“sname”);
sname=new String(sname.getBytes(“iso-8859-1”),“utf-8”);
方式解决

Post的乱码用:
req.setCharacterEncoding(“utf-8”);方式解决

6mybatis的注解

  1. 注解:为了简化配置文件
  2. Mybatis的注解简化mapper.xml文件
    2.1如果涉及动态SQL依然使用mapper.xml
  3. mapper.xml和注解可以共存
    4.使用注解的时候其中mybatis.xml中使用
    4.1
    4.2

7mybatis运行原理

  1. 运行过程涉及到的类
    1.1Resources: Mybatis 中的IO流的工具类
    加载配置文件
    1.2 SqlSessionFactoryBuilder()构建器
    作用:创建SqlSessionFactory接口的实现类
    1.3XMLConfigBuilder: MyBatis全局配置文件内容构建器
    作用:负责读取流内容并转换为java代码
    1.4Configuration封装了全局配置文件的所有配置信息
    全局配置文件的内容存放在Configuration中
    1.5 DefaultSqlSessionFactory是SqlSessionFactory接口的实现类
    1.6 Transation 事务类
    作用:每一个SqlSession会带一个Transation对象
    1.7 TransationFactory事务工厂
    作用:负责生产Transation
    1.8Executor Mybatis 执行器
    作用:负责执行SQL命令
    相当于JDBC 中的statement对象(或者PreparedStatement或者
    CallableStatement)
    默认执行器SimpleExcutor
    批量操作 BatchExcutor
    通过openSession(参数控制)
    1.9DefaultSqlSession是SqlSession接口实现类
    1.10ExceptionFactory MyBatis中的异常工厂
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值