-
其他相关代码: @Message.xml <select id="queryMessageListByPage" parameterType="java.util.Map" resultMap="MessageResult"> select <include refid="columns"></include> from MESSAGE <where> <if test="message.command != null and !"".equals(message.command.trim())"> and COMMAND=#{message.command} </if> <if test="message.description != null and !"".equals(message.description.trim())"> and DESCRIPTION like '%' #{message.description} '%' </if> </where> order by ID </select> @Configuration.xml <plugins> <!-- <plugin interceptor="com.imooc.interceptor.PageInterceptor" ></plugin> 如果不需要初始化参数(setProperties()),则直接这条语句即可 --> <plugin interceptor="com.imooc.interceptor.PageInterceptor"> <property name="test" value="abc"></property> </plugin> </plugins> Ps:一个拦截器对应一个<plugin>。 【温馨提示:JavaSE/EE、SSH/SSM、Hybrid APP、JQ/JS/CSS3/H5等编程爱好者关注我,加我慕课好友,互相学习,共同进步!】查看全部
-
@PageInterceptor.java相关代码——(下): @Override public Object plugin(Object target) { System.out.println(test); return Plugin.wrap(target, this); } @Override public void setProperties(Properties properties) { this.test=properties.getProperty("test"); } } Ps1:执行顺序:setProperties-->plugin-->[intercept] Ps2:若因为某些原因获取不到想要调用的方法等,可以利用反射思想获取。 Ps3: 两个特殊的符号'^'和'$'。他们的作用是分别指出一个字符串的开始和结束。例子如下: "^The":表示所有以"The"开始的字符串("There","The cat"等); "of despair$":表示所以以"of despair"结尾的字符串; "^abc$":表示开始和结尾都是"abc"的字符串——呵呵,只有"abc"自己了; "notice":表示任何包含"notice"的字符串。 附:"ab+":表示一个字符串有一个a后面跟着至少一个b或者更多。 【温馨提示:JavaSE/EE、SSH/SSM、Hybrid APP、JQ/JS/CSS3/H5等编程爱好者关注我,加我慕课好友,互相学习,共同进步!】查看全部
-
@PageInterceptor.java相关代码——(中): if(id.matches(".+ByPage$")){ BoundSql boundSql=statementHandler.getBoundSql(); //原始的SQL语句,但是当中的#{}改为? String sql=boundSql.getSql(); //查询总条数的SQL语句 String countSql="select count(*) from ("+sql+")a"; Connection conn=(Connection) invocation.getArgs()[0]; PreparedStatement countStatement= conn.prepareStatement(countSql); /** * 解决当中的#{}改为?后的参数传递问题 */ ParameterHandler parameterHandler=(ParameterHandler) metaObject.getValue("delegate.parameterHandler"); parameterHandler.setParameters(countStatement); ResultSet rs=countStatement.executeQuery(); //获取的是Dao层中的“parameter”参数 Map<?, ?> parameter=(Map<?, ?>) boundSql.getParameterObject(); Page page=(Page) parameter.get("page"); if(rs.next()){//因为只有一条数据,所以不需要while循环 page.setTotalNumber(rs.getInt(1)); } //改造后带分页查询的SQL语句 String pageSql=sql+" limit "+page.getDbIndex()+","+page.getDbNumber(); metaObject.setValue("delegate.boundSql.sql", pageSql); } return invocation.proceed(); }查看全部
-
@PageInterceptor.java相关代码——(上): @Intercepts({ @Signature(args = { Connection.class }, method = "prepare", type = StatementHandler.class) }) public class PageInterceptor<V, K> implements Interceptor { private String test; @Override public Object intercept(Invocation invocation) throws Throwable { /** * 注解里写的参数封装成invocation,通过invocation获取,最后记得invocation.proceed()返回以上操作的代理对象并继续执行。 */ //getTarget():return Plugin.wrap(target, this); StatementHandler statementHandler=(StatementHandler) invocation.getTarget(); //通过反射获取对象 MetaObject metaObject=MetaObject.forObject(statementHandler, SystemMetaObject.DEFAULT_OBJECT_FACTORY, SystemMetaObject.DEFAULT_OBJECT_WRAPPER_FACTORY, new DefaultReflectorFactory()); //通过RoutingStatementHandler中的delegate匹配对应的BaseStatementHandler MappedStatement mappedStatement=(MappedStatement) metaObject.getValue("delegate.mappedStatement"); //配置文件中SQL语句的ID String id=mappedStatement.getId();查看全部
-
关键代码: -->Intercepts.class @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) public @interface Intercepts { Signature[] value(); } -->Signature.class @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) public @interface Signature { Class<?> type();//拦截主文件(接口).class String method();//拦截主文件中的方法 Class<?>[] args();//拦截主文件中该方法的参数类型.class } Ps1: Java泛型中的标记符含义: E - Element (在集合中使用,因为集合中存放的是元素) T - Type(Java 类) K - Key(键) V - Value(值) N - Number(数值类型) ? - 表示不确定的java类型 S、U、V - 2nd、3rd、4th types Object跟这些标记符代表的java类型有啥区别呢? Object是所有类的根类,任何类的对象都可以设置给该Object引用变量,使用的时候可能需要类型强制转换,但是用使用了泛型T、E等这些标识符后,在实际用之前类型就已经确定了,不需要再进行类型强制转换。 Ps2:若通过执行plugin()方法,返回本身(不需要代理的对象),则不会执行intercept()方法(因为没有获取代理权);若返回代理对象,则会执行intercept()方法。 Ps3:如果不清楚导入哪个包,可以查看返回类型并点击该类型就可知道是哪个包。 【温馨提示:JavaSE/EE、SSH/SSM、Hybrid APP、JQ/JS/CSS3/H5等编程爱好者关注我,加我慕课好友,互相学习,共同进步!】查看全部
-
接口式编程1查看全部
-
接口式编程1查看全部
-
/*动态代理,接口没有实现类.Mybatis为接口提供实现类,即用Proxy.newProxyInstance()创建代理实例,返回类型为Object,利用泛型强制转换*/ IMessage imessage = sqlSession.getMapper(IMessage.class); /*代理实例调用接口方法时,并不会执行,而是触发 MapperProxy.invoke(),其中包含sqlSession.selectList(namespace.id,parameter)*/ /*至于为什么会包含,因为接口方法与(加载Mybatis的)配置信息对应得上,即 接口名.方法=namespace.id*/ messageList = imessage.queryMessageList(message);查看全部
-
接口式编程mybatis 配置文件的namespace对应接口的包的名称+接口名称 配置文件中对应的sql的id对应接口的方法名 调用:通过sqlSession.getMapper(接口.class)调用查看全部
-
<select id="queryMessageList" parameterType="com.imooc.bean.Message" resultMap="MessageResult"> select <include refid="columns"></include> from message <where> <if test="command!=null and !"".equals(command.trim())"> and COMMAND=#{command} </if> </where> </select> //对比上下代码 <select id="queryMessageList" parameterType="java.util.Map" resultMap="MessageResult"> select <include refid="columns"></include> from message <where> <if test="message.command!=null and !"".equals(message.command.trim())"> and COMMAND=#{message.command} </if> </where> order by ID limit #{page.dbIndex},#{page.dbNumber} </select> Q1:为何选择java.util.Map?不用实体类? 因为里面代码涉及到两个实体类,所以选择一个它们通用的类型。 Q2:为何选择java.util.Map?不用Lits等之类的? 从parameterType来看字面意思是:参数类型,所以如下代码: parameter.put("message", message); parameter.put("page", page); 传过来的参数parameter来使用。所以接下来的属性前加上message.xxx;page.xxx;(key值对应)。 【温馨提示:JavaSE/EE、SSH/SSM、Hybrid APP、JQ/JS/CSS3/H5等编程爱好者关注我,加我慕课好友,互相学习,共同进步!】查看全部
-
@拦截器理解——(下) 注意:过早过迟的拦截都不合适。所以在PreparedStatement pstmt=conn.prepareStatement(sql.toString());之前拦截即可(把SQL语句处理再放进去提交)。 【温馨提示:JavaSE/EE、SSH/SSM、Hybrid APP、JQ/JS/CSS3/H5等编程爱好者关注我,加我慕课好友,互相学习,共同进步!】查看全部
-
@拦截器理解——(上) 【温馨提示:JavaSE/EE、SSH/SSM、Hybrid APP、JQ/JS/CSS3/H5等编程爱好者关注我,加我慕课好友,互相学习,共同进步!】查看全部
-
@SQL语句里的limit使用方法 SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset 在我们使用查询语句的时候,经常要返回前几条或者中间某几行数据,这个时候怎么办呢?不用担心,mysql已经为我们提供了上面这样一个功能。 LIMIT 子句可以被用于强制 SELECT 语句返回指定的记录数。LIMIT 接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。初始记录行的偏移量是 0(而不是 1): 为了与 PostgreSQL 兼容,MySQL 也支持句法: LIMIT # OFFSET #。 mysql> SELECT * FROM table LIMIT 5,10; //检索记录行6-15 //为了检索从某一个偏移量到记录集的结束所有的记录行,可以指定第二个参数为 -1: mysql> SELECT * FROM table LIMIT 95,-1; // 检索记录行 96-last. //如果只给定一个参数,它表示返回最大的记录行数目: mysql> SELECT * FROM table LIMIT 5; //检索前 5 个记录行 //换句话说,LIMIT n 等价于 LIMIT 0,n。 案例: SELECT * FROM table LIMIT 0,5;//0、1、2、3、4 SELECT * FROM table LIMIT 5,5;//5、6、7、8、9 SELECT * FROM table LIMIT 10,5;//10、11、12、13、14 【温馨提示:JavaSE/EE、SSH/SSM、Hybrid APP、JQ/JS/CSS3/H5等编程爱好者关注我,加我慕课好友,互相学习,共同进步!】查看全部
-
关键代码: @MessageDao.java IMessage imessage = sqlSession.getMapper(IMessage.class); messageList=imessage.queryMessageList(message); //messageList=sqlSession.selectList("Message.queryMessageList",message); @IMessage.java /** * 与Message配置文件相对应的接口 */ public interface IMessage { public List<Message> queryMessageList(Message message); } @Message.xml <mapper namespace="com.imooc.dao.IMessage"> <select id="queryMessageList" ... 【温馨提示:JavaSE/EE、SSH/SSM、Hybrid APP、JQ/JS/CSS3/H5等编程爱好者关注我,加我慕课好友,互相学习,共同进步!】查看全部
-
接口式编程虽然代码量增多一部分,但是大大减少了代码的出错率。 【温馨提示:JavaSE/EE、SSH/SSM、Hybrid APP、JQ/JS/CSS3/H5等编程爱好者关注我,加我慕课好友,互相学习,共同进步!】查看全部
举报
0/150
提交
取消