mybatis的执行流程 #{}和${} Mysql自增主键返回

匿名 (未验证) 提交于 2019-12-02 22:06:11

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}idSqlorder 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

 

效果如下图所示:

 

 

 

 

id22id

 

 

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

 

 

原文:https://www.cnblogs.com/shan1393/p/9278919.html

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!