传统JDBC的问题
1. 数据库连接,使用时就创建,不使用立即释放,对数据库进行频繁连接开启和关闭,造成数据库资源浪费,影响数据库性能。
2. 硬编码
1) SQL语句硬编码
2) preparedStatement中设置参数硬编码
3) resutSet中遍历结果集数据时硬编码
Mybatis介绍
1. Mybatis:是一个持久层框架,主要使程序员将精力放到SQL上,通过Mybatis提供的映射关系完成数据库的操作。
2. 框架:
3. Mybatis项目搭建
1) Log4j.properties
SqlMapConfig.xml
Mybatis的环境配置文件,包括数据源、事务等
Map映射文件
Sql语句的配置
1. 映射文件是用于操作实体类的配置文件,如:User.java对应UserMapper.xml对应,其中xxxMapper.xml包含对相应User.java实体类对象的SQL操作。
2. 在xxxMapper.xml映射文件中配置sql语句:以Selecte语句为例
1) namespace:命名空间
2) id:标识映射文件中的sql语句
3) parameterType:指定输入参数的类型
4) resultType:指定sql输出结果所映射的java对象类型,无论结果返回的是单挑记录还是多条记录。
5) #{}和${}
a) 在sql语句中占位符#{id}:其中id表示接受输入的参数,参数名为id。
#{}接收输入参数,类型可以是简单类型,pojo、hashmap。
简单类型:#{}中可以写成value或其它名称。
#{}接收pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性.属性...的方式获取对象属性值。
b) ${}表示一个拼接符号,会引用sql注入,所以不建议使用${}。
${}接收输入参数,类型可以是简单类型,pojo、hashmap。
简单类型,${}中只能写成value。
${}接收pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性.属性...的方式获取对象属性值。
主键的细节
1. 自增长
1) Mysql主键为自增长时:执行insert提交前需要先自动生成一个主键。
2) 使用LAST_INSERT_ID()
a) 使用selectKey标签
b) keyProperty:将主键id设置到parameterType所指定对象的相应属性中
c) order:指定select LAST_INSERT_ID()相较于insert语句的执行顺序
d) resultType:指定select LAST_INSERT_ID()的结果类型
2. 非自增长
1) 数据库id的数据类型:使用mysql的uuid()函数生成主键,需要修改表中id字段类型为string,长度设置成35位。
2) 相较于insert语句的执行顺序:先通过uuid()查询到主键,将主键输入 到sql语句中,执行uuid()语句顺序相对于insert语句之前执行。即:
commit()事务提交
除了查询以外,其他的都需要commit()