-
mybatis的拦截器实现分页(动态代理) 拦截sql语句来实现分页 1.拦截什么样的对象(以page作为参数传入;page对象) 2.拦截对象什么行为 3.什么时候拦截 (在prepareStatement的时候拦截) 1.RoutingStatementHandler 2.通过RoutingStatementHandler对象的属性delegate找到statement实现类BaseStatementHandler 3.通过BaseStatementHandler类的反射得到对象的MappedStatement对象 4.通过MappedStatement的属性getID得到配置文件sql语句的ID 5.通过BaseStatementHandler属性得到原始sql语句 6.拼接分页sql 6.1.需要查询总数的sql 6.2.通过拦截Connection对象得到PrepareStatement对象 6.3.得到对应的参数 6.4.把参数设到prepareStatement对象里的?(该?号在配置文件以#{}形式存在,mybatis会把它转为?号) 6.5.执行sql语句 6.6.得到总数 7.把属性值为新的sql查看全部
-
mybaits的面向接口编程查看全部
-
面向接口编程---源码详细步骤 加载配置信息... 通过配置信息加载一个代理工厂Map: 这个Map存放的是接口Class与对应的代理工厂 通过接口的Class从代理工厂取出对应的代理工厂 通过代理工厂实例化一个代理类 用这个代理类将代理实例返回出去 通过接口与method获取对应的配置文件信息: 接口名.方法名==namspace.id 通过配置文件中的信息获取SQL语句类型 根据SQL语句类型调用sqlSession对应的增删改查方法 当SQL语句类型是查询时: 根据返回值类型是List,Map,Object 分别调用selectList,selectMap,selectObject方法 3查看全部
-
查看一个接口的所有实现类:选中接口名,Ctrl+T 或者选中该接口名,按F4,即 Open Type Hierarchy IMessage imessage=sqlSession.getMapper(IMessage.class);//获取到的就是代理实例 messageList =imessage.queryMessageList(parameter);//代理实例执行接口方法时,就会触发调用处理程序,也就是第三个参数对象的invoke()方法,MapperProxy是实现了InvocationHandler接口的 MapperProxyFactory.newInstance(MapperProxy<T> mapperProxy){ --return (T) Proxy.newProxyInstance(mapperInterface.getClassLoader()//通过接口获取类加载器,new Class[]{mapperInterface}//代理类实现的接口数组,mapperProxy//调用代理实例的处理程序) --} 解决了三个问题: 1、为什么只定义了一个接口,没有实现类的情况下,接口方法可以被调用,因为动态代理。 2、为什么sqlSession.getMapper(.class)可以根据传入的参数,返回一个对应的类型,因为泛型。 3、Mybatis加载文件时,利用namespace加载了一个class,然后把这个class与代码中传入接口的class进行匹配,方法执行所需要的信息就是来自于已经匹配成功的配置文件中,当结果与配置文件对应上后,调用接口的方法执行sql语句。查看全部
-
Mybatis加载的过程查看全部
-
动态代理,接口没有实现类,Mybatis为接口提供实现类,即用Proxy.newProxyInstance()创建代理实例,返回类型为Object,利用泛型强制转换:IMessage imessage = sqlSession.getMapper(IMessage.class); 1、代理实例调用接口方法时,并不会执行,而是触发 MapperProxy.invoke()方法,其中包含 sqlSession.selectList(namespace.id,parameter); 2、至于为什么会包含,因为接口方法与(加载Mybatis的)配置信息对应得上,即 接口名.方法 = namespace.id 最终得到结论:imessage.queryMessageList(parameter)==sqlSession.selectList(namespace.id,parameter);查看全部
-
Mybatis中的接口试编程--mybatis找到一个接口作为该表操作的代言:1、namespace 2、与sql关联的id 3、传入的参数4、返回值 作用: 1、规范mybatis中访问配置文件 2、遇到spring时{1、总配置文件中的数据源配置托管给spring管理2、db层(getsqlsession)会消失3、组织对象代码移交给service层(即传入的参数)4、sql执行代码由spring实现5、dao层就剩接口文件(小三上位)与配置文件}查看全部
-
相关代码——(上): @CommandContent.xml <insert id="insertOne" parameterType="com.imooc.bean.CommandContent"> insert into COMMAND_CONTENT(CONTENT,COMMAND_ID) values(#{content},#{commandId}) </insert> <insert id="insertBatch" parameterType="java.util.List"> insert into commandcontent(content,commandId) values <foreach collection="list" item="item" separator=","> (#{item.content},#{item.commandId}) </foreach> </insert> @ICommandContent.java public interface ICommandContent { /** * 单条新增 */ public void insertOne(CommandContent content); /** * 批量新增 */ void insertBatch(List<CommandContent> contentList); } Ps1:注意:批量新增不同的SQL有不同的语法。(这里针对MySQL) Ps2:separator=",":会加在中间,不会加在头尾。查看全部
-
相关代码——(中): @CommandContentDao.java /** * 和command_content表相关的数据库操作 */ public class CommandContentDao { /** * 通过JDBC方式批量新增 */ public void insertBatchByJDBC(List<CommandContent> contentList) { try { Class.forName("com.mysql.jdbc.Driver"); Connection conn = DriverManager.getConnection( "jdbc:mysql://127.0.0.1:3306/micro_message", "root", "."); String inserSql = "insert into commandcontent(content,commandId) values(?,?)"; PreparedStatement pstmt = conn.prepareStatement(inserSql); for (CommandContent content : contentList) { pstmt.setString(1, content.getContent()); pstmt.setInt(2, Integer.valueOf(content.getCommandId())); // pstmt.executeUpdate();//方法1(不推荐) pstmt.addBatch();// 方法2 } pstmt.executeBatch();// 方法2(推荐) } catch (Exception e) { e.printStackTrace(); } }查看全部
-
相关代码——(下): /** * 通过MyBatis方式批量新增 */ public void insertBatchByMyBatis(List<CommandContent> contentList) { DBAccess dbAccess = new DBAccess(); SqlSession sqlSession = null; try { sqlSession=dbAccess.getSqlSession(); //通过sqlSession执行SQL语句 ICommandContent commandContent = sqlSession.getMapper(ICommandContent.class); commandContent.insertBatch(contentList); sqlSession.commit(); } catch (Exception e) { e.printStackTrace(); } finally { if(sqlSession!=null){ sqlSession.close(); } } } }查看全部
-
mybatis的拦截器实现分页(动态代理) 拦截sql语句来实现分页 1.拦截什么样的对象(1.RoutingStatementHandler;2.以page作为参数传入;page对象) 2.拦截对象什么行为 3.什么时候拦截 (在prepareStatement的时候拦截) (源码) 1.RoutingStatementHandler 2.通过RoutingStatementHandler对象的属性delegate找到statement实现类BaseStatementHandler 3.通过BaseStatementHandler类的反射得到里面的属性对象(proptect)的MappedStatement对象 4.通过MappedStatement的属性getID得到配置文件sql语句的ID 5.通过BaseStatementHandler属性的到原始sql语句 6.拼接分页sql( 1.需要查询总数的sql 2.通过拦截Connection对象得到PrepareStatement对象 3.得到对应的参数 4.把参数设到prepareStatement对象里的?(该?号在配置文件以#{}形式存在,mybatis会把它转为?号) 5.执行该sql语句 6.得到总数 ) 7.把属性值为新的sql查看全部
-
mybatis的拦截器实现分页(动态代理) 拦截sql语句来实现分页 1.拦截什么样的对象(以page作为参数传入;page对象) 2.拦截对象什么行为 3.什么时候拦截 (在prepareStatement的时候拦截) (源码) 1.RoutingStatementHandler 2.通过RoutingStatementHandler对象的属性delegate找到statement实现类BaseStatementHandler 3.通过BaseStatementHandler类的反射得到对象的MappedStatement对象 4.通过MappedStatement的属性getID得到配置文件sql语句的ID 5.通过BaseStatementHandler属性的到原始sql语句 6.拼接分页sql( 1.需要查询总数的sql 2.通过拦截Connection对象得到PrepareStatement对象 3.得到对应的参数 4.把参数设到prepareStatement对象里的?(该?号在配置文件以#{}形式存在,mybatis会把它转为?号) 5.执行噶sql语句 6.得到总数 ) 7.把属性值为新的sql查看全部
-
1、表单的校验有前段js和后端java2、数据的组织都放在service层中3、数据库中没有的表要放在entity中有的放在bean中4、用hashMap封装分页查询条件有Page和message两个对象。5、count(*)查询后返回查询条数可以用rusultType=“int”不用配置rusultMap来把数据转成java对象。6、page类包括总记录数、总页数、当前页、查询起时,每页显示条数。查看全部
-
mybatis特点查看全部
-
mybatis特点查看全部
举报
0/150
提交
取消