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

慕课网视频 通过自动回复机器人学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中连接数据库,获得数据(list),给页面传递数据,跳转页面。(jdbc+用request的attribute给页面传数据)(servlet生命周期?)
页面用标签库core


判断字段不为null和不为空,再确定是否拼进sql里


通过自动回复机器人学Mybatis---基础版 笔记 2018-01-19_第1张图片
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配置文件


  
     
    
    
  
  
  
  
  
  

crud标签属性

  • id:sqlSession通过id调用sql语句,sqlsession.selectList("namespace名.id名")
    因为id不可重复,所以可用区分相同id
  • resultMap:表列名与bean属性名的映射,让查询到的数据可以放进bean中

resultMap标签属性

  • type:bean类全名
  • id:与crud标签id没关系可重名
  • 主键用id
    -- column:结果集的列名(不带前缀,所以连接查询有时会重名,需要起别名),可用resultSet.getMetaData.getColumnName()查看列名
    -- jdbcType:sql.Types中定义的常量
    -- property:对应的bean类属性名
  • 非主键用result
  • 子表集合
    -- resultMap:子表的配置文件中的resultMap,如CommandContent.Content

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

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


  

动态sql拼接

传参:
sqlSession.selectList()只能传递一个对象给sql语句(用bean封装)


通过自动回复机器人学Mybatis---基础版 笔记 2018-01-19_第2张图片
image.png

通过自动回复机器人学Mybatis---基础版 笔记 2018-01-19_第3张图片
image.png

通过自动回复机器人学Mybatis---基础版 笔记 2018-01-19_第4张图片
拼接sql语句

应用log4j调试动态sql

导入包


通过自动回复机器人学Mybatis---基础版 笔记 2018-01-19_第5张图片
配置文件
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
通过自动回复机器人学Mybatis---基础版 笔记 2018-01-19_第6张图片
image.png

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

通过自动回复机器人学Mybatis---基础版 笔记 2018-01-19_第7张图片
ajax

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

标签

  • :where内条件都不满足不会有where,满足的话会自动去掉多余的and或or


    通过自动回复机器人学Mybatis---基础版 笔记 2018-01-19_第8张图片
    where

  • 引用中的内容
  • update中使用自动去掉逗号


    通过自动回复机器人学Mybatis---基础版 笔记 2018-01-19_第9张图片
    set

  • -- prefix,要加的前缀;
    -- suffix,后缀;
    -- prefixOverrides,切掉前面的字段;
    -- suffixOverrides,切掉后面的字段.
  • ... IFELSE
  • mapper中的标签,映射主表
通过自动回复机器人学Mybatis---基础版 笔记 2018-01-19_第10张图片
标签

容易混淆的概念

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

通过自动回复机器人学Mybatis---基础版 笔记 2018-01-19_第11张图片
image.png

常见问题解析

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


    image.png
  3. sql语法错误排查,复制进mysql中执行
  4. 不要过度使用${} ,有可能习惯用在java写sql语句,然后将它传进xml中直接用${}调用,这样会维护困难,因为一部分sql在java中,一部分在xml中。(注解sql)
  5. 乱码
  • 文件本身的编码
  • jsp设置的编码
  • servlet用来接受页面传值的编码
  • 用get提交中文的话tomcat也要设置编码

如果还有乱码

  • mybatis主配置文件,数据库url加上编码方式 ?useUnicode=true&characterEncoding=utf8

  • mysql安装后的配置的编码要统一

  • 建立数据库的编码,表的编码

你可能感兴趣的:(通过自动回复机器人学Mybatis---基础版 笔记 2018-01-19)