建立数据库时的编码和建表时候的编码
安装数据库时的编码
与数据库交互的URL加编码
1、文件的编码
2、jsp上设置的编码
3、servlet接收参数时用来转换的编码
4、tomcat接收get中文的编码
常见的几个问题
父表与子表统一插入时,且父表的主见是自增组件,如何拿到返回的自增组件?
1、useGeneratedKevs为true时,表示采用自增组件
2、keyProperty表示的是返回的组件,存到java对象的哪个属性里面。在sqlsession执行前id是没有值的,执行后就编程有值了
Mybatis 常见问题
Mybatis总结——常见问题解析
【1】获取自增主键值
案例描述:一对多新增功能,整个页面一次性提交,后端分别保存主表数据与子表数据,设计表的主键还是自动递增的,否则就不在讨论范围内了,问题的根源是保存主表数据后,需要知道插入这条数据的自增主键值,然后再保存子表数据,因为这个主键值作为子表的外键。
Mybatis执行insert语句后,获取自增主键值:
以command表为例,因为command表是一对多关系中的主表,首先插入主表的数据,正常情况下如图1,但是想要获取插入的自增主键值需要使用<insert>标签的useGeneratedKeys属性,把它设置为true,作用是主键采用自动生成,而不是自己指定的主键值。通过<insert>的keyProperty属性Mybatis会获取自动生成的主键,该属性值为填充到映射关系中的哪个属性中,所以为属性名(这样在Command对象传入XML中id是没有值的,当SqlSession调用方法执行完sql以后,这个id属性就有值了并且这个值为新增的主键值)。
【2】找不到namespace.id的异常效果
如果不在Mybatis核心配置文件中引入sql的XML文件,或者namespace.id写错都会报该异常,如下图
【3】排查SQL语法错误
这里可以通过log4j输出的sql语句排查错误(可以把sql语句复制到Navicat中进行验证)。
【4】不要过度使用${}
比如做表头排序时会在order by后拼接${},它就像java中用变量拼接字符串一样,有些会习惯写jdbc的代码,直接在java代码里写select...,把它写好后传值给XML,然后XML中直接使用${传进来sql语句字符串},这样的编写风格会出现维护困难,因为这样一部分sql语句在java代码中,一部分语句在XML中。Mybatis提供了把sql语句写在java代码中,这种编写方式称作注解sql,但是这种编写方式很麻烦。
【5】乱码问题
关注文件本身的编码。
JSP页面设置的编码。
Servlet接受页面传值时,转换的编码。
GET请求提交中文参数时,Tomcat里也要进行配置编码。
除此之外,与数据库进行交互时 ,出现乱码时,应注意以下几处:
Mybatis核心配置文件里导入数据库的url中指定编码方式。
Mysql安装时,字符集设置应统一。
建立数据库时的编码和建表时的编码。
插入数据后返回一个id
不过度使用${}
乱码
写的配置文件没有引入总的配置文件中报错信息或者写错了也是同一个效果(sql语法错误排查):
插入数据后返回一个id
写的配置文件没有引入总的配置文件中报错信息:
SSM学习---Mybatis之常见问题解析
一、获取自增主键值:
<insert id="insert" useGeneratedKeys="true" keyProperty="id" parameterType="com.imooc.bean.Command"> insert into command(name,description) values(#{name},#{description}) </insert>
解析:添加数据(在主外键的关系中)可以使用 useGeneratedKeys="true",可获取自增长的id,并配合keyProperty="id"(java中实体类的属性名)指定该对象的主键值。
二、找不到namespace.id的异常效果:
1、在Configuration.xml没有配置<mappers><mapper resource="*.xml"></mapper></mappers>;
2、在1的配置中或selectList("Message.queryMessageList",message);中,名字写错。
三、排查SQL语法错误:
如果控制台出现SQL语句问题,复制到SQL软件上执行,若有参数,手动写上并执行。
四、不要过度使用${}。
五、乱码问题:
1. servlet传参时的编码:request.setCharacterEncoding("utf-8");或直接使用过滤器;
2. Java文件本身的编码;
3. 连接数据库的参数中,设定编码方式:jdbc:mysql://192.168.1.1:3306/cms?characterEncoding=utf-8
4. 数据库、表的编码;
5. 展示页面的编码:<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
6. 浏览器编码问题等。
mybatis常见问题解析:
1、获取自增主键值
使用<insert>标签的useGenerateKey属性设置为true,keyProperty属性设置为类中的对应主键的属性名
2、找不到namespace.id的异常效果(总的配置文件没有引入写sql的xml文件)
3、排查SQL语法错误
可以将日志中出错的SQL语句复制到Navicat中进行排查
4、不要过度使用${}
5、乱码
需要注意设置编码的地方:
(1)数据库建库和建表
(2)mybatis中连接数据库设置编码
(3)jsp页面设置编码
(4)servlet接收参数设置编码
(5)工程编码
一、获取自增主键值: <insert id="insert" useGeneratedKeys="true" keyProperty="id" parameterType="com.imooc.bean.Command"> insert into command(name,description) values(#{name},#{description}) </insert> //解析:添加数据(在主外键的关系中)可以使用 useGeneratedKeys="true",可获取自增长的id,并配合keyProperty="id"(java中实体类的属性名)指定该对象的主键值。 二、找不到namespace.id的异常效果: 1、在Configuration.xml没有配置<mappers><mapper resource="*.xml"></mapper></mappers>; 2、在1的配置中或selectList("Message.queryMessageList",message);中,名字写错。 三、排查SQL语法错误:如果控制台出现SQL语句问题,复制到SQL软件上执行,若有参数,手动写上并执行。 四、不要过度使用${}。 五、乱码问题: 1. servlet传参时的编码:request.setCharacterEncoding("utf-8");或直接使用过滤器; 2. Java文件本身的编码; 3. 连接数据库的参数中,设定编码方式:jdbc:mysql://192.168.1.1:3306/cms?characterEncoding=utf-8 4. 数据库、表的编码; 5. 展示页面的编码:<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 6. 浏览器编码问题等。
乱码:
文件本身编码,properties中设置
jsp上设置的编码,<meta ; charset=""/>
servlet接收页面传值时用来转换的编码
req.setCharacterEncoding("UTF-8");
GET方式提交中文Tomcat也要设置编码
与数据库交互时出现乱码:
1)configuration.xml中的url
2)mysql的编码,数据库与表的编码都要统一。
没有在主配置文件中引入相应的mapper.xml文件,将会报的错误信息:找不到namespace.id的异常效果。
新增数据时,获取自增主键值
url设置编码
mybatis常见问题解析