1. mybatis是一个半ORM框架,它内部封装了JDBC,开发时只须要关乎sql语句自己,不须要花费精力去处理驱动,建立链接,建立1statement等繁复过程。 2. mybatis可使用xml或注解来配置和映射原生信息。将pijo映射成数据库中的记录,避免了几乎全部的JDBC 代码和手动设置参数以及获取结果集。 3. 经过xm文件或注解的方式将要执行的各类statement配置起来,并通java对象和statement中sql的动态参数进行映射生成最终的sql语句,最后由mybatis框架执行sql并将结果映射java对象返回.java
1. 基于sql语句编程,至关灵活,不会对应用程序或者数据库的现有设计形成任何影响,sql写在xml里,解除了sql与程序代码的耦合, 2. 可以与spring很好的集成, 3. 消除了JDBC的大量冗余代码,不须要手动开关链接,很好的与各类数据库兼容spring
1. sql语句编写量偏多, 2. sql'语句依赖于数据库,倒追数据库移植性差,不能随意更换数据库.sql
专一于sql自己,是一个足够灵活的dao层解决方案.,对性能的要求很高,或者需求多变的项目,数据库
#{}是预编译处理,${}是字符串替换。编程
Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;缓存
Mybatis在处理${}时,就是把${}替换成变量的值。安全
使用#{}能够有效的防止SQL注入,提升系统安全性。session
有两种解决方案:能够在sql语句给字段名取别名,别名于实体类属性名同名,也能够用<resultMap>来映射字段名和实体类属性名一一对应.mybatis
第一种:在java代码添加sql通配符并发
<select id=”selectlike”> select * from foo where bar like #{value} </select>
第二种:在sql语句中拼接通配符,会引发sql注入
<select id=”selectlike”> select * from foo where bar like "%"#{value}"%" </select>
Dao接口即Mapper接口。接口的全限名,就是映射文件中的namespace的值;接口的方法名,就是映射文件中Mapper的Statement的id值;接口方法内的参数,就是传递给sql的参数。 mapper接口是没有实现类的,当调用接口方法时,接口全限名+方法名拼接字符串做为key值,可惟必定位一个MapperStatement。在Mybatis中,每个<select>、<insert>、<update>、<delete>标签,都会被解析为一个MapperStatement对象。
mapper接口里的方法是不能被重载的,由于是使用 全限名+方法名 的保存和寻找策略
第一种是使用<resultMap>标签,逐必定义数据库列名和对象属性名之间的映射关系。
第二种是使用sql列的别名功能,将列的别名书写为对象属性名。
有了列名与属性名的映射关系后,Mybatis经过反射建立对象,同时使用反射给对象的属性逐一赋值并返回,那些找不到映射关系的属性,是没法完成赋值的。
先建立一个简单的插入语句
<insert id=”insertname”> insert into names (name) values (#{value}) </insert>
而后在代码执行下面的
list<string> names = new arraylist(); names.add(“fred”); names.add(“barney”); names.add(“betty”); names.add(“wilma”); // 注意这里 executortype.batch sqlsession sqlsession = sqlsessionfactory.opensession(executortype.batch); try { namemapper mapper = sqlsession.getmapper(namemapper.class); for (string name : names) { mapper.insertname(name); } sqlsession.commit(); }catch(Exception e){ e.printStackTrace(); sqlSession.rollback(); throw e; } finally { sqlsession.close(); }
<insert id=”insertname” usegeneratedkeys=”true” keyproperty=”id”> insert into names (name) values (#{name}) </insert>
(1)第一种: //DAO层的函数 Public UserselectUser(String name,String area); //对应的xml,#{0}表明接收的是dao层中的第一个参数,#{1}表明dao层中第二参数,更多参数一致日后加便可。 <select id="selectUser"resultMap="BaseResultMap"> select * fromuser_user_t whereuser_name = #{0} anduser_area=#{1} </select> (2)第二种: 使用 @param 注解: public interface usermapper { user selectuser(@param(“username”) string username,@param(“hashedpassword”) string hashedpassword); } 而后,就能够在xml像下面这样使用(推荐封装为一个map,做为单个参数传递给mapper): <select id=”selectuser” resulttype=”user”> select id, username, hashedpassword from some_table where username = #{username} and hashedpassword = #{hashedpassword} </select> (3)第三种:多个参数封装成map try{ //映射文件的命名空间.SQL片断的ID,就能够调用对应的映射文件中的SQL //因为咱们的参数超过了两个,而方法中只有一个Object参数收集,所以咱们使用Map集合来装载咱们的参数 Map<String, Object> map = new HashMap(); map.put("start", start); map.put("end", end); return sqlSession.selectList("StudentID.pagination", map); }catch(Exception e){ e.printStackTrace(); sqlSession.rollback(); throw e; } finally{ MybatisUtil.closeSqlSession(); }
不一样的Xml映射文件,若是配置了namespace,那么id能够重复;若是没有配置namespace,那么id不能重复
一级缓存 事务范围:缓存只能被当前事务访问。缓存的生命周期 依赖于事务的生命周期当事务结束时,缓存也就结束生命周期。 在此范围下,缓存的介质是内存。 二级缓存 进程范围:缓存被进程内的全部事务共享。这些事务有 多是并发访问缓存,所以必须对缓存采起必要的事务隔离机制。 缓存的生命周期依赖于进程的生命周期,进程结束时, 缓存也就结束了生命周期。进程范围的缓存可能会存放大量的数据, 因此存放的介质能够是内存或硬盘。
接口绑定,就是在MyBatis中任意定义接口,而后把接口里面的方法和SQL语句绑定, 咱们直接调用接口方法就能够,这样比起原来了SqlSession提供的方法咱们能够有更加灵活的选择和设置。
接口绑定有两种实现方式,一种是经过注解绑定,就是在接口的方法上面加上 @Select、@Update等注解,里面包含Sql语句来绑定;另一种就是经过xml里面写SQL来绑定, 在这种状况下,要指定xml映射文件里面的namespace必须为接口的全路径名。当Sql语句比较简单时候,用注解绑定, 当SQL语句比较复杂时候,用xml绑定,通常用xml绑定的比较多。
① Mapper接口方法名和mapper.xml中定义的每一个sql的id相同; ② Mapper接口方法的输入参数类型和mapper.xml中定义的每一个sql 的parameterType的类型相同; ③ Mapper接口方法的输出参数类型和mapper.xml中定义的每一个sql的resultType的类型相同; ④ Mapper.xml文件中的namespace便是mapper接口的类路径。