注:该文章只是针对自己在其他地方加强复习,没有参考意义。
一、jdbc的缺点
1.preparedstatement防止sql的注入
2.对sql是预编译的,数据库对第二回发的同样的预编译时直接从缓存中取就不用编译。
3.sql语句是硬编码,改动需要改动java文件,不利于维护。
4.preparedstatement设置的参数也存在硬编码问题.
二、mybatis执行
1.sqlMapConfig.xml(配置文件)->(创建会话工厂)sqlSessionFactory->(创建会话)sqlSession(操作数据库)
2.底层的内部是Executor在干活,也是一个接口,有两个实现,(默认执行器,缓存执行器)
3.Executor(封装参数)->MappedStatement(封装,sql,占位符)
4.map的xml以statement为单位管理sql
sqlMapConfig.xml
三、xml的部分结构
xxxmapper.xml
命名规则:表面+mapper.xml
开发调试阶段用debug,别用info
log4j.rootLogger=DEBUG, stdout
map.xml结构(部分)
id为映射结果集唯一标识
column数据库中的表字段
在同一个文件可以直接引语,否则就是命名空间.resultMap的Id
也可以是全类名
·····
#是占位符 可以防止sql的注入
表示sql的拼接,不加任何修饰
{}%
insert最好用#,可以不用考虑java和数据库类型
<insert id="" parameterMap="">
获取刚刚插入的自增主键值
<selectKey keyProperty="" order="before和after两个值" resultMap="int">
select last_insert_id()
</selectKey>
insert ....into...value...
keyProperty就是将主键设置到哪个属性
order相对于insert语句执行顺序,before和after
也可以通过uuid机制生成主键,可以防止数据库移植和其他表主键重复的问题
<selectKey keyProperty="" order="before和after两个值" resultMap="String">
select uuid()
</selectKey>
oracle没有自增主键,要通过序列实现自增主键
实现思路:先查询序列得到主键,将主键设置到user对象中,将user对象插入数据库
<selectKey keyProperty="id" order="before" resulrMap="">
select 序列.nextval() from dual
</selectKey>
insert ....into...value...
</insert>
如果引resultMap的为位置和resultMap的定义在同一个resultMap。xml中,直接使用ID,否则就是 命名空间.id
@Before注解,每次致谢@Test注解时先执行@before中的代码
sqlMapConfig
<package name=""/>
<typAliases>
<typeAliase type="" aliase="">
<package name=""/>
</<typAliases>>
like %${userCustom.userName}%
使用resultType时sql查询的列名(字段取得别名)要和指定的pojo属性名相同,指定相同属性方可映射成功