-
<select id="queryMessageList" parameterType="com.imooc.bean.Message" resultMap="MessageResult"> select <include refid="columns"/> 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"/> 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值对应)。 注意:过早过迟的拦截都不合适。所以在PreparedStatement pstmt=conn.prepareStatement(sql.toString());之前拦截即可(把SQL语句处理再放进去提交)。查看全部
-
@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查看全部
-
利用动态代理来实现在 代理类 中调用 sql 语句的过程查看全部
-
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//调用代理实例的处理程序) --} 解决了三个问题: ①为什么只定义了一个接口,没有具体实现的情况下,接口方法可以被调用,因为动态代理。 ②为什么sqlSession.getMapper(.class)可以根据传入的参数,返回一个对应的类型,因为泛型。 ③Mybatis加载文件时,利用namespace加载了一个class,然后把这个class与代码中传入接口的class进行匹配,方法执行所需要的信息就是来自于已经匹配成功的配置文件中,当结果与配置文件对应上后,调用接口的方法执行sql语句。查看全部
-
使用原始的方法开发dao时,在具体的实现类中,调用sqlSession.selectList()时需要传递两个参数,根据第一个参数在配置文件中找具体的sql语句,这里需要注意两个风险,①编码中的namespace 与配置文件中的namespace 一致,②编码中引用的id与配置文件中的id也要一致,手写就会有很大的风险,㈢就是第二个参数的问题,selectList方法中传入的参数是object,而配置文件中是一个pojo对象,那么在编写代码的时候,传递的参数是其他的类型,编译器也不会提示错误,只有程序运行起来的时候,才会出错,④还有返回值,编码中是通过泛型来约束list的,至于list中是什么泛型,编译器都是可以通过的,在配置文件中的返回类型使用resultMap来约束的。 规避以上四个风险的手段,mybatis称之为接口是编程,需要遵循以下规范: 1、 类的映射:使用接口类的全限定名作为配置文件的namespace,完成类与配置文件的对应关系。 2、 方法名:接口方法名与配置文件中将要执行的sql语句的id一样,这样就完成了方法调用的映射。 3、 参数类型:接口方法的输入参数类型和配置文件中sql的parameterType的类型相同 4、 返回值类型:接口方法的返回值类型和配置文件的resultMap的类型相同 具体实现方法:①将调用的接口类传给sqlSession.getMapper(IMessage.class)方法,返回类型就是这个传入参数的类型IMessage,但是这个时候就不在是接口,而是一个具体的实现,调用接口的方法,就可以得到与映射文件一一对应的参数类型。查看全部
-
用什么类型作参数,就应该用什么类型来接值查看全部
-
测试一下笔记的使用查看全部
-
jdbc批量新增查看全部
-
javaee查看全部
-
1、mybais不利于数据库移植; 2、批量插入与DB方言相关; 3、分页是共通代码,可以加分页拦截器简化SQL查看全部
-
注释很全面的DBAccess JDBC数据库连接方法查看全部
-
动态代理老师自己编写简单小实例理解查看全部
-
IMessage.queryMessageList()' MapperPROxy.invoke() == sqlSession.selectList() IMessage imessage = proxy.newProxyInstance()查看全部
-
动态代理查看全部
-
Mapper 动态代理查看全部
举报
0/150
提交
取消