SqlMapConfig.xml中配置的内容和顺序:
- properties(属性)
- settings(全局配置参数)
- typeAliases(类型别名)
- objectFactory(对象工厂)
- plugins(插件)
- environments(环境集合属性对象)
- environment(环境属性对象)
- transactionManager(事务管理)
- dataSource(数据源)
- environment(环境属性对象)
- mappers(映射器)
沉心、静气、学习、总结、进步
SqlMapConfig.xml中配置的内容和顺序:
SqlSessionFactoryBuilder
通过SqlSessionFactoryBuilder创建会话工厂SqlSessionFactory。将SqlSessionFactoryBuilder当成一个工具类使用即可,不需要使用单例管理SqlSessionFactoryBuilder。在创建SqlSessionFactory时候,只需要new一次SqlSessionFactoryBuilder即可。
SqlSessionFactory
通过SqlSessionFactory创建SqlSession;由于SqlSessionFactory是线程安全的,应该在应用执行期间都存在,所以在应用运行期间不要重复创建多次,建议使用单例模式。
SqlSession
SqlSession是应用程序和持久层之间执行交互操作的一个单线程对象。SqlSession中提供了许多操作数据库的方法。
SqlSession是线程不安全的。
使用完SqlSession要确保在finally块中关闭它。
在User.xml文件中增加增删改三个功能1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40<!--
parameterType 为实体对象
#{} 会使用OGNL来获得同名的值
insert update delete 默认返回的都是影响的条数
-->
<insert id="insertUser" parameterType="Pojo.User">
<!--
如果要求返回刚插入的id值则需要增加<selectKey>
SELECT LAST_INSERT_ID():得到刚insert进去记录的主键值,只适用与自增主键
keyProperty:将查询到主键值设置到parameterType指定的对象的哪个属性
order:SELECT LAST_INSERT_ID()执行顺序,相对于insert语句来说它的执行顺序
resultType:指定SELECT LAST_INSERT_ID()的结果类型
//也可以使用以下这种方法
useGeneratedKeys="true" keyProperty="id"
以上两种方法可以自动将id赋值给传入的那个实体相应的属性中去
-->
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
SELECT LAST_INSERT_ID()
</selectKey>
INSERT INTO user(name,password)
VALUES (#{name},#{password})
</insert>
<!--更新用户信息,id必须存在-->
<update id="updateUser" parameterType="Pojo.User">
UPDATE user
SET password = #{password}
WHERE id = #{id}
</update>
<!--根据id删除用户-->
<delete id="deleteUser" parameterType="int">
DELETE FROM
user
WHERE id = #{id}
</delete>
mybatis是一个持久层的框架,是apache下的顶级项目。
mybatis托管到goolecode下,再后来托管到github下(https://github.com/mybatis/mybatis-3/releases)。
Mybatis让程序将主要精力放在sql上,通过Mybatis提供的映射方式,只有灵活生成(半自动化,大部分需要程序员编写sql)满足需要SQL语句。
Mybatis可以将向preparedStatement中的输入参数自动进行输入映射,将查询结果灵活映射成java对象。(输出映射)
数据库:在多的一方添加外键来描述关联关系。
实体对象:在一的一方,增加一个集合用来存放多的一方。在多的一方添加一个一的一方的属性。
映射文件配置:
User.hbm.xml1
2
3
4
5
6
7
8
9
10
11<!--
set代表用的什么集合
name代表多的一方的集合的属性名
-->
<set name="carSet">
<!--
key:多的一方的外键名称
-->
<key column="user_id"></key>
<one-to-many class="pojo.Car"></one-to-many>
</set>
Car.hbm.xml1
2
3
4
5
6<!--
name:一的一方的属性名
class:一的一方的类全路径
colum:表中的外键外键名称
-->
<many-to-one name="user" class="pojo.User" column="user_id"></many-to-one>
Hibernate的一级缓存就是Session缓存,Session缓存是一块内存空间,用来存放相互管理的java对象,在Hibernate查询对象的时候,首先会使用对象属性的OID值在Hibernate的一级缓存中进行查找,如果找到匹配OID值的对象,就直接将该对象从一级缓存中取出使用,不会再查询数据库;如果没有找到相同OID值对象,则会去数据库中查找相应数据。当从数据库中查询到所需数据时,该数据信息也会放置到一级缓存中。Hibernate的一级缓存的作用就是减少对数据库的访问次数。
increment
用于long、short、int类型,由Hibernate自动以递增的方式生成唯一标识符,每次增量为1。只有当没有其他进程向同一张表中插入数据时才可以使用,不能在集群环境下使用。适用于代理主键。
identity
采用底层数据库本身提供的主键生成标识符,条件是数据库支持自动增长数据类型。在DB2、MySQL、MS SQL Server、Sybase和HypersonicSQL数据库中可以使用该生成器,该生成器要求在数据库中把主键定义成为自增长类型。适用于代理主键。
sequence
Hibernate根据底层数据库序列生成标识符。条件是数据库支持序列。适用于代理主键。
native
根据底层数据库对自动生成表示符的能力来选择identity、sequence、hilo三种生成器中的一种,适合跨数据库平台开发。适用于代理主键。
uuid
Hibernate采用128位的UUID算法来生成标识符。该算法能够在网络环境中生成唯一的字符串标识符,其UUID被编码为一个长度为32位的十六进制字符串。这种策略并不流行,因为字符串类型的主键比整数类型的主键占用更多的数据库空间。适用于代理主键。
assigned
由Java程序负责生成标识符,如果不指定ID元素的generator属性,则默认使用该主键生成策略。适用于自然主键。