n Mybatis
SqlMapConfig.xmlMybatis
Mapper.xmlSqlSqlSqlMapConfig.xml
n MybatisSqlSessionFactory
n SqlSessionSqlSession
n MybatisExecutorExecutorMappedStatement
n MappedStatementMybatisMybatisSqlMapper.xmlSqlMapped StatementSqlidMapped statementid
n ExecutorMappedStatementSqljavaSqlJdbcPreparedStatementExecutorMappedStatementSql
JavaJdbc
1.1.1.1. #{}${}
n #{}
1#{}PreparedStatement?对字符串对单Sql。
select * from user where username = #{username} ,username为小张
select * from user where username = ‘小张’
2#{}Pojo parameterType#{}
n ${}:
1${}Sql,只是简单的拼接order by ${id}idSql为order by id
${}select * from user where username = 小张
2${}PojoparameterType${}value
n 总结:
1$order by
2#$.
1.1.1.1. Mysql
MysqlidSql
SELECT LAST_INSERT_ID()
UserMapper.xmlMysql
如下添加selectKey
<!-- 保存用户 -->
<insert id="saveUser" parameterType="com.itheima.mybatis.pojo.User">
<!-- selectKey 标签实现主键返回 -->
<!-- keyProperty:主键对应的pojo中的哪一个属性 -->
<!-- order:设置在执行insert语句前执行查询id的sql,孩纸在执行insert语句之后执行查询id的sql -->
<!-- resultType:设置返回的id的类型 -->
<selectKey keyProperty="id" order="AFTER"
resultType="Integer">
SELECT LAST_INSERT_ID()
</selectKey>
INSERT INTO USER
(username,birthday,sex,address) VALUES
(#{username},#{birthday},#{sex},#{address})
</insert>
LAST_INSERT_ID():Mysql的函数,返回auto_incrementid
效果如下图所示:
id为22id
1.1.1. 修改用户
id
Sql
UPDATE USER SET USERNAME = ‘‘ WHERE ID= 1
1.1.1.1. 映射文件
UserMapper.xml
<!-- 更新用户 -->
<update id="updateUserById" parameterType="com.itheima.mybatis.pojo.User">
UPDATE USER SET
USERNAME = #{username} WHERE ID = #{id}
</update>
1.1. Mybatisjdbc
1、 频繁创建、释放数据库连接造成系统资源浪费,影响系统性能。使用数据库连接池技术可以解决此问题。
SqlMapConfig.xml
2、 SqlSqlSqljava
SqlXXXXmapper.xmlJava
3、 SqlSqlwhere
MybatisJavaSqlstatementparameterType
4、 SqlPojo
MybatisSqlJavastatementresultType
1.1. Mapper
1.1.1. 开发规范
Mapper动态代理开发方式只需要程序员开发Mapper接口(相当于Dao接口),MybatisDao
Mapper4
n Mappernamespacemapper
n MapperMapperSqlid
n MapperMapperSqlParameterType
n MapperMapperSqlresultType
1. MybatisHibernate
1HibernateORMMybatisORM
HibernateORSql语句,怎么执行由框架底层控制。
MybatisSqlJavaSql。
2HibernateMybatis
HibernateO/R和Hibernate调优都很强。 一对多 多对多配置麻烦
MybatisSql
3HibernateMybatis
HibernateSql的执行,但数据库无关性好,切换不同数据库时只需要切换数据库类型即可。
MybatisSql的执行性能,灵活度高,适合于软件的需求变化快而且多的软件,但灵活的前提是牺牲了数据库的无关性,如果要实现支持多种数据库的软件则需要自定义多套Sql映射文件,工作量大。
选型原则
总之,满足需求的前提下,只要做出维护性、扩展性好的软件架构都是好架构,框架只有合适的才是最好的。
选型建议
Hibernate
Mybatis
1.1.1. resultMap
mapper.xmlsql(user_id)Order(userId)pojo
resultMaporderResultMapsql(user_id)Order(userId)
OrderMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace:命名空间,用于隔离sql,还有一个很重要的作用,Mapper动态代理开发的时候使用,需要指定Mapper的类路径 -->
<mapper namespace="cn.itcast.mybatis.mapper.OrderMapper">
<!-- resultMap最终还是要将结果映射到pojo上,type就是指定映射到哪一个pojo -->
<!-- id:设置ResultMap的id -->
<resultMap type="order" id="orderResultMap">
<!-- 定义主键 ,非常重要。如果是多个字段,则定义多个id -->
<!-- property:主键在pojo中的属性名 -->
<!-- column:主键在数据库中的列名 -->
<id property="id" column="id" />
<!-- 定义普通属性 -->
<result property="userId" column="user_id" />
<result property="number" column="number" />
<result property="createtime" column="createtime" />
<result property="note" column="note" />
</resultMap>
<!-- 查询所有的订单数据 -->
<select id="queryOrderAll" resultMap="orderResultMap">
SELECT id, user_id,
number,
createtime, note FROM `order`
</select>
</mapper>
mybatis中的一对多 多对一关联
1.1.1. resultMap
resultMapresultMap
1.1.1.1. pojo
OrderUseruserUser
Order
1.1.1.2. Mapper.xml
resultMaporderUserResultMap
<resultMap type="order" id="orderUserResultMap">
<id property="id" column="id" />
<result property="userId" column="user_id" />
<result property="number" column="number" />
<result property="createtime" column="createtime" />
<result property="note" column="note" />
<!-- association :配置一对一属性 -->
<!-- property:order里面的User属性名 --> user
<!-- javaType:属性类型 --> User类的全路径
<association property="user" javaType="user">
<!-- id:声明主键,表示user_id是关联查询对象的唯一标识-->
<id property="id" column="user_id" />
<result property="username" column="username" />
<result property="address" column="address" />
</association>
</resultMap>
<!-- 一对一关联,查询订单,订单内部包含用户属性 -->
<select id="queryOrderUserResultMap" resultMap="orderUserResultMap">
SELECT
o.id,
o.user_id,
o.number,
o.createtime,
o.note,
u.username,
u.address
FROM
`order` o
LEFT JOIN `user` u ON o.user_id = u.id
</select>
1.1.1.3. Mapper
UserMapper
1.1. 一对多查询
案例:查询所有用户信息及用户关联的订单信息。
用户信息和订单信息为一对多关系。
sql
SELECT
u.id,
u.username,
u.birthday,
u.sex,
u.address,
o.id oid,
o.number,
o.createtime
FROM
`user` u
LEFT JOIN `order` o ON u.id = o.user_id
1.1.1. pojo
UserList<Order> orders,
1.1.2. Mapper.xml
UserMapper.xmlsql
<resultMap type="user" id="userOrderResultMap">
<id property="id" column="id" />
<result property="username" column="username" />
<result property="birthday" column="birthday" />
<result property="sex" column="sex" />
<result property="address" column="address" />
javaType属性类型
ofType里面的泛型
<!-- 配置一对多的关系 -->
<collection property="orders" javaType="list" ofType="order">
<!-- 配置主键,是关联Order的唯一标识 -->
<id property="id" column="oid" />
<result property="number" column="number" />
<result property="createtime" column="createtime" />
<result property="note" column="note" />
</collection>
</resultMap>
<!-- 一对多关联,查询订单同时查询该用户下的订单 -->
<select id="queryUserOrder" resultMap="userOrderResultMap">
SELECT
u.id,
u.username,
u.birthday,
u.sex,
u.address,
o.id oid,
o.number,
o.createtime,
o.note
FROM
`user` u
LEFT JOIN `order` o ON u.id = o.user_id
</select>
1.1.3. Mapper
UserMapper