通过自动回复机器人学Mybatis---基础版 笔记 2018-

2018-01-29  本文已影响0人  pluss

慕课网视频 通过自动回复机器人学Mybatis---基础版 的笔记


1.页面放在webinf下便于管理和控制,直接放在根目录会直接访问到,除非设置拦截器(??)。放在webinf后,必须得从后台走才能访问这些页面(为什么)
2.sql语句直接写 select 列名不要用select ,因为用数据库引擎还得再解析一遍*解析成列名影响效率。
3.jsp标签库定义的uri可以从jstl的jar包中的c.tld中找
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
4.web容器只实例化servlet一次
5.servlet中request.setCharacterEncoding("UTF-8");或者过滤器设置
6.request.getParameter();获取的是String类型,根据情况需要转为其他类型
7.servlet不应有其他多余的业务逻辑处理(转换类型,判断是否为空等),要交给service处理

先不用mybatis过程:
web.xml设置servlet映射

<servlet>
  <servlet-name></servlet-name>
  <servlet-class></servlet-class>
</servlet>
<servlet-mapping>
  <servlet-name></servlet-name>
  <url-pattern></url-pattern>
</servlet-mapping>

servlet中连接数据库,获得数据(list<javabean>),给页面传递数据,跳转页面。(jdbc+用request的attribute给页面传数据)(servlet生命周期?)
页面用标签库core
<c:forEach items="" var="" varStatus="" >
<c:if>
判断字段不为null和不为空,再确定是否拼进sql里


image.png

代码重构:
servlet设置编码、接受值、向页面传值、页面跳转
dao层,表的数据库操作,执行sql语句、获取数据、返回结果
service层,调用dao进行业务处理(servlet调用service)
db层,真正和数据库交互,DBAccess, getSqlSession()

mybatis搭建

大部分工作都在配置文件里
核心配置文件,下载源码后在路径\mybatis-3-mybatis-3.3.1\src\test\java\org\apache\ibatis\submitted\complex_property下可找到模版
同目录下的user.xml是sql配置演示
mybatis如何想dao层提供与数据库交互的对象?SqlSession

SqlSession的作用

向sql传入参数
执行sql语句
获取执行sql语句的结果
事务的控制

如何得到SqlSession

//通过配置文件获取数据库连接相关信息
Reader reader = Resources.getResourceAsReader("配置文件路径,src是根目录,如config/Configuration.xml");
//通过配置信息构建SqlSessionFactory
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(reader);
//通过SqlSessionFactory打开数据库会话(SqlSession)
SqlSession sqlSession = sqlSessionFactory.openSession();

jdbc 的conn.prepareStatement("sql语句").execute()是自动提交的
如果将自动提交设为false,conn.setAutoCommit(false);之后的每条sql语句都视为同一个事务,需要手动提交事务或者回滚,conn.commit(),conn.rollback()
mybatis把connnection封装后将自动提交设为了false所以sqlsession需要手动提交,sqlsession.commit()
要记得关闭sqlsession,关前先判断是否为null

sql基本配置和执行

配置文件配置sql语句让SqlSession能读到并执行

sql配置文件

<mapper namespace="">
  <resultMap type="" id="">
    <id column="" jdbcType="" property=""/> 
    <result ... />
    <collection property="" resultMap=""/>
  </resultMap>
  <select id="" resultMap="">sql语句</select>
  <insert...>
  <update...>
  <delete...>
  </mapper>

crud标签属性

resultMap标签属性

必须有namespace,没有的话加载配置文件会出错

核心配置文件中导入sql配置文件

<mappers>
  <mapper resource="sql配置文件路径">
</mappers>

动态sql拼接

传参:
sqlSession.selectList()只能传递一个对象给sql语句(用bean封装)
<select id="" resultMap="" parameterType="类全名">(lang包可以直接写类名)
sql查询语句
<if test="ognl表达式取属性进行判断(ognl支持调用java方法)">and xxx=? </if>
</select>


image.png
image.png
拼接sql语句

应用log4j调试动态sql

导入包


配置文件
Logger log;
//级别由低到高
log.debug("adf");
log.info(message);
log.warn(message);
log.error(message);
#大于等于该输出级别的会被输出,看mybatis源码,输出级别是debug。Console名称随意,主要在后面设置输出到哪
log4j.rootLogger=DEBUG,Console
#Console名称跟上面一致,类是控制台输出,想输出到文件就换成其他的类
log4j.appender.Console=org.apache.log4j.ConsoleAppender
#布局,自定义
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
#自定义的输出格式。
#%d时间,%t线程名称,%-5p输出日志的级别,至少5位,补齐空格在左边,%c类全名,%m附加信息,%n换行
log4j.appender.Console.layout.ConversionPattern=%d[%t]%-5p[%c] - %m%n
#个性化,特殊对待,这个包下的INFO以上级别才输出
log4j.logger.org.apache=INFO
image.png

list.jsp页面
只有一个form,action是自己
删除,增加是servlet链接,servlet处理完后请求转发到list.jsp
批量删除按钮用js将form的action改为servlet。提交

ajax

left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录
right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录
inner join(等值连接) 只返回两个表中联结字段相等的行
on 条件

标签

标签

容易混淆的概念

resultMap和resultType

都是为了表示结果集与java对象的映射
resultType:不需要配置resultMap
,只能靠结果集的列名和java属性名对应,而且是大小写不敏感的。
可以将它指向java.util.Map,这样结果集会放在map中,key就是结果集的列名,这样写是大小写敏感的。

用resultMap可用typeHandler进行类型转化(数据库类型与java类型是不一样的,日期类,布尔型,01truefalse)

parameterMap和parameterType

parameterMap 为了保持与老版本一致,官方不推荐使用。

#{}和${}

都是写在sql语句中成为语句中的一部分

#{c} --> ?
${c} --> c的值
${}没有预编译的效果,直接拼接,用于order by 等不能用?的情况
#{} 能预编译,反复执行相同的语句,参数不同,有性能上的优势,防止sql注入

#{}和ognl

image.png

常见问题解析

  1. 获取自增主键值:
    userGeneratedKey="true" ,将自增主键设为true
    keyProperty="",将自增的主键与java属性对应,以便获取自增的主键值
  2. 没配置主配置文件出的异常


    image.png
  3. sql语法错误排查,复制进mysql中执行
  4. 不要过度使用${} ,有可能习惯用在java写sql语句,然后将它传进xml中直接用${}调用,这样会维护困难,因为一部分sql在java中,一部分在xml中。(注解sql)
  5. 乱码

如果还有乱码

上一篇 下一篇

猜你喜欢

热点阅读