为了账号安全,请及时绑定邮箱和手机立即绑定

通过自动回复机器人学Mybatis---加强版

难度中级
时长 2小时43分
学习人数
综合评分9.77
214人评价 查看评价
9.9 内容实用
9.7 简洁易懂
9.7 逻辑清晰
  • 【温馨提示:JavaSE/EE、SSH/SSM、Hybrid APP、JQ/JS/CSS3/H5等编程爱好者关注我,加我慕课好友,互相学习,共同进步!】
    查看全部
  • 相关代码——(下): /** * 通过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(); } } } } 【温馨提示:JavaSE/EE、SSH/SSM、Hybrid APP、JQ/JS/CSS3/H5等编程爱好者关注我,加我慕课好友,互相学习,共同进步!】
    查看全部
    0 采集 收起 来源:实现批量新增

    2018-03-22

  • 相关代码——(中): @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(); } } 【温馨提示:JavaSE/EE、SSH/SSM、Hybrid APP、JQ/JS/CSS3/H5等编程爱好者关注我,加我慕课好友,互相学习,共同进步!】
    查看全部
    0 采集 收起 来源:实现批量新增

    2018-03-22

  • 相关代码——(上): @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=",":会加在中间,不会加在头尾。 【温馨提示:JavaSE/EE、SSH/SSM、Hybrid APP、JQ/JS/CSS3/H5等编程爱好者关注我,加我慕课好友,互相学习,共同进步!】
    查看全部
    0 采集 收起 来源:实现批量新增

    2018-03-22

  • mybatis 模拟执行sql语句过程
    查看全部
  • @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等编程爱好者关注我,加我慕课好友,互相学习,共同进步!】
    查看全部
    0 采集 收起 来源:拦截器总结

    2018-03-22

  • @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(); }
    查看全部
    0 采集 收起 来源:拦截器总结

    2018-03-22

  • @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();
    查看全部
    0 采集 收起 来源:拦截器总结

    2018-03-22

  • 关键代码: -->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)调用
    查看全部
    0 采集 收起 来源:接口式编程

    2016-04-01

  • <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等编程爱好者关注我,加我慕课好友,互相学习,共同进步!】
    查看全部

举报

0/150
提交
取消
课程须知
本课程的前导课程为《通过自动回复机器人学 Mybatis ---基础版》, 课程中案例的关联性极强,所以学习本课程唯一的条件就是学习过《通过自动回复机器人学 Mybatis ---基础版》
老师告诉你能学到什么?
1、 Mybatis 的接口式编程 2、实现分页查询 3、通过拦截器实现分页共通来了解 Mybatis 的拦截器 4、通过如何用数组做参数来了解 Mybatis 对类型的处理 5、 Mybatis 如何实现 jdbc 的 addBatch ,即批量插入

微信扫码,参与3人拼团

意见反馈 帮助中心 APP下载
官方微信
友情提示:

您好,此课程属于迁移课程,您已购买该课程,无需重复购买,感谢您对慕课网的支持!