mybatis学习常见问题
一、Mybatis创建代码示例
/*
* 创建mybatis代码的过程
*/
@Test
public void testGetUserByid() throws IOException {
// 创建SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder sfb = new SqlSessionFactoryBuilder();
// 查找配置文件创建输入流
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
// 加载配置文件,创建SqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = sfb.build(inputStream);
// 创建SqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
// 执行查询,参数一:要查询的statementId ,参数二:sql语句入参
User user = sqlSession.selectOne("user.getUserById", 1);
// 输出查询结果
System.out.println(user);
// 释放资源
sqlSession.close();
}
<!-- useGeneratedKeys:标识插入使用自增id
keyProperty:与useGeneratedKeys配套使用,用于绑定主键接收的pojo属性
-->
<insert id="insertUserKey" parameterType="com.itheima.mybatis.pojo.User" useGeneratedKeys="true" keyProperty="id">
<!-- selectKey:用于配置主键返回
keyProperty:要绑定的pojo属性
resultType:属性数据类型
order:指定什么时候执行,AFTER之后
-->
<!-- <selectKey keyProperty="id" resultType="int" order="AFTER">
SELECT LAST_INSERT_ID()
</selectKey> -->
INSERT INTO USER
(`username`,
`birthday`,
`sex`,
`address`,
`uuid2`)
VALUES (#{username},
#{birthday},
#{sex},
#{address},
#{uuid2});
</insert>
1.数据库的操作一定要小心,很容易出现问题,注意时候有逗号。一般除了最后一个不需要逗号,前面的都要使用逗号隔开。要学会使用排除错误的方法和技巧。
2.数据库表的标识只有一个,一般是主键。
3.dtd约束要严格按照标签的出现顺序来出现。如果不按照那么就会出现错误。
3.1 #{}:点占位符,相当于jdbc里面的?--------------
:
字
符
串
拼
接
指
令
,
当
入
参
为
普
通
类
型
i
n
t
S
t
r
i
n
g
等
的
时
候
,
‘
{}:字符串拼接指令,当入参为普通类型int String 等的时候,‘
:字符串拼接指令,当入参为普通类型intString等的时候,‘{value}’,里面只能写value。不能写其他的。
3.11字符串拼接指令:username like %${value}%
。
3.2 如果设置了数据库表的id为自动增长,那么可以不用给id赋值,它也会自动增加一个。
3.3 mybatis中需要自己输入的参数,以前是?号,现在是#{name},#{age}这种形式的样子。
3.4 mybatis中需要插入、修改、删除数据的时候需要提交,commit,也可以在创建的SqlSessionFactory.oppenSesston(true)时候设置为true。
3.5 mybatis中一般有一个核心配置文件SqlMapperConfig.xml和多个映射文件Mapper.xml,一般都多少张表就有多个映射文件。
3.6 Integer采用包装类,而不采用int,是因为如果为空,包装类可以看到它的默认值。
3.7 传统dao和动态代理开发,动态代理是sqlsession.getMapper(UserMapper); 传统dao是selectOne(),selectList()等。动态代理namespace必须是接口的全路径,不用写具体的实现类。
3.8
<!-- 动态代理开发规则:
1、namespace必需是接口的全路径名
2、接口的方法名必需与sql id 一致
3、接口的入参与parameterType类型一致
4、接口的返回值必须与resultType类型一致
-->
3.9 <!-- 如果数据库和实体类的映射名称不同可以通过起别名的方式来解决这个问题 -->
3.10 <!-- 映射文件包扫描,推荐方式:
1、接口文件必须与映射文件同一目录下
2、接口文件名称必须与映射文件的名称一致
-->
3.11 传统dao开发只能使用的这种方式,不能使用类扫描或者是包扫描。
3.12 pojo的字段名要和数据库的字段名保持一致,才能完成映射。不一致的话可以通过起别名的方式。
3.13 resultMap的用法。配置pojo和数据库的字段一致。多表查询的时候会用到。
3.14 不管返回的是单个对象还是list集合对象,返回值都用包装类的名称就行。
3.15 动态sql可以设置一个永远成立的条件,where 1 = 1 and username = ‘${value}’ and sex = ‘1’
3.16 注意包装的pojo的思想,实体类里面包装实体类。还有集合等。
3.17 Arrays.asList()这个方法可以直接输入集合内容,不用我们先创建集合然后再往里面设置值。
3.18 查询返回结果的时候必须有一张和数据库一模一样的对应关系的pojo,可以用一个类去继承另一个类,然后添加上自己特有的方法即可。
3.19 注意spring开发的时候,编写测试类的时候是getBean(),mybatis开发的时候是getMapper(),如果是使用动态代理的话。
3.20 sprignmvc解决乱码问题,post乱码需要在web.xml中配置一个spring提供好的一个过滤器即可。
3.21 springmvc解决乱码问题,get乱码可以在tomcat的配置文件server.xml中再端口号那个位置,写一个URIEncoding="utf-8"即可解救get乱码问题。
3.22 学会使用自定义异常,继承Exception即可,输出时然后判断异常的类型,打印不同的异常。
3.23 进行图片上传的时候,必须要设置enctype="multipart/form-data,并且是post请求。
3.24 进行图片上传的时候,jsp页面的图片上传的名字必须和方法当中的接收的图片的名称保持一致,否则就会错误。(千万记住*)
4.面向接口编程的好处:可以方便的切换实现类。比如List = new Arraylist();这样前面写接口后面可以写任意的实现类。还可以写linkArraylist;
这样写的话,要实现的方法和属性是接口中的方法,如果要实现实现类中自己定义的方法时, 写完完整的实现类的名称。
比如:UserDaoImpl userDao = new UserDaoImpl();
userDao.setName(“张三”);
userDao.save();
要这样写才可以。
如果下面这样写的话:是不可以实现子类中特有的功能的。
UserDao userDao = new UserDaoImpl();
userDao.setName(“张三”);
userDao.save();
5.一个xml只能被一个dtd约束,但是可以被多个schema约束。
6.如果是包的的全路径那么就用.分隔。----如果是文件的全路径就用/来分隔。
7.value:设置普通类型的值,ref:引用其他类的id或者name的值
8.导包的时候一定要保证导入的包是正确的,否则出错。
9.spring配置文件当中applicationContext.xml这个文件注释里面不允许出现–,不能嵌套使用。比如<!– –>
10.IOC使用注解的开发:@Conponent,修饰一个类,将这个类交给spring管理。
这个注解有三个衍生注解(功能类似),修饰类。
1.@Controller :web层
2.@Service: service层
3.@Repository :dao层
**属性注入的注解:
*:@value :普通属性
*:@Resouse:按照名称完成属性的注入
11.xml和属性注解方式整合的时候,如果使用属性注入的方式,那么xml当中bean的属性设置properties不能存在。二者无法同时存在,会产生冲突。
12.spring开发熟练注解的使用,以前相关的注解的用法和使用。标签不要缺少和漏掉。
13.spring当中注意数据库连接池的配置,dbcp c3p0等,这两个的名字叫法是不一样的,一定要会c3p0.
14.一定要注意属性的配置文件,properties里面的key=value的形式,后面的value值一定不要用""括起来,否则会出错,直接等号后面写值就可以啦。
15.事务都要写在业务层,比如转账的事务。
16.Spring当中进行属性注入的时候,直接注入接口,不用到具体的实现类。可以利用向上转型。但是在spring配置文件当中要到具体的实现类。还有就是提供set方法一定要正确。否则无法注入属性。
17.springmvc里面的问题,requestParam(),这个是请求参数当中?后面的映射。PathVarie()这里是路径里面?前边的映射。可以用来处理前端和后台参数名称不一致映射的问题。
18.springmvc如果使用httpservletrequest来转发到页面,必须是具体文件的路径。不能是RequestMapping里面的值。
19.git 如果是新建的文件,第一步必须先执行git add 将文件提交的暂存区,然后执行git commit 提交到本地库。提交到暂存区的文件还可以执行撤回操作,提交到本地库的文件不能执行撤回的操作。