中间步骤自行设置
MySQL驱动版本根据自己安装的MySQL选择
我把AppTest改成了MybatisTest,不该也无妨;
其中Student类暂时只设置四个字段:
mapper接口暂时为空
在resources目录下新建File命名为db.peoperties,配置如下内容:
提示:以上配置适用于MySQL8.X版本,5.X版本按照如下配置:
1、transactionManager:事务管理器;
type 事务管理类型:
JDBC(JdbcTransactionFactory);
MANAGED(ManagedTransactionFactory)
自定义事务管理器:实现TransactionFactory接口.type指定为全类名
2、dataSource:数据源
type :数据源类型
UNPOOLED(UnpooledDataSourceFactory);POOLED(PooledDataSourceFactory);
JNDI(JndiDataSourceFactory)
自定义数据源:实现DataSourceFactory接口,type是全类名
<mapper>:注册一个sql映射文件
1、注册映射文件
resource:引用类路径下的sql映射文件
mybatis/StudentMapperpper.xml
url:引用网路路径或者磁盘路径下的sql映射文件
file:///var/mappers/AuthorMapper.xml
2、注册接口
class:引用(注册)接口,
① 有sql映射文件,映射文件名必须和接口同名,并且放在与接口同一目录下;
② 没有sql映射文件,所有的sql都是利用注解写在接口上
推荐:
比较重要的,复杂的Dao接口我们来写sql映射文件
不重要,简单的Dao接口为了开发快速可以使用注解;
批量注册
需要在资源路径下(resources)建立和dao一样的文件目录来存放想xml映射文件,如:com.example.StudentMapperpper.xml
StudentMapper
在resources的mybatis目录下新建文件夹mapper,新建xml文件StudentMapper.xml
namespace :名称空间指定为接口的全类名
id :唯一标识
resultType :返回值类型
#{id} :从传递过来的参数中取出id值
resources目录(MajorMapper.xml暂时不用创建)如下:
jdbc.driverClassName=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc: mysql://127.0.0.1:3306/mybatis_tz?useSSL=false&serverTimezone=UTC
jdbc.username=root
jdbc.password=root
mybatis自增主键配置:
mybatis进行插入 *** 作时,如果表的主键是自增的,针对不同的数据库相应的 *** 作也不同。基本上经常会遇到的就是 Oracle Sequece 和 Mysql 自增主键。主要说明下在mybatis中对于自增主键的配置。
1、不返回自增主键值:
如果考虑到插入数据的主键不作为其他表插入数据的外键使用,可以考虑这种方式。
Oracle Sequence 配置
<sql id='TABLE_NAME'>TEST_USER</sql><sql id='TABLE_SEQUENCE'>SEQ_TEST_USER_ID.nextval</sql>
<!-- 注意这里直接调用sequence的nextval函数 -->
<insert id="insert" parameterType="User">
insert into <include refid="TABLE_NAME" /> (ID,NAME,AGE)
values ( <include refid="TABLE_SEQUENCE" /> ,#{name}, #{age} )
</insert>
当插入语句如上配置时,那么针对如下语句
User user = new User()user.setName("test")
user.setAge(24)
userMapper.insert(user)
System.out.println(user.id) // user.id 为空
user.id为空,也就是说如上的配置并不能在完成插入 *** 作后将插入时的主键值存放到保存的对象中。
2、Mysql自增主键配置
由于mysql数据库中,可以设置表的主键为自增,所以对于Mysql数据库在mybatis配置插入语句时,不指定插入ID字段即可。主键的自增交由Mysql来管理。
<sql id='TABLE_NAME'>TEST_USER</sql><!-- 注意这里的插入SQL中是没有指明ID字段的! -->
<insert id="insert" parameterType="User">
insert into <include refid="TABLE_NAME" /> (NAME,AGE)
values (#{name}, #{age} )
</insert>
同样,针对Mysql如此配置mybaits,插入完成后user.id为空。
插入后获取自增主键值:
上述的情况能满足大部分情况,但有时候我们会遇到类似一对多的那种表结构,在插入多端数据时,需要获取刚刚保存了的一段的主键。那么这个时候,上述的配置就无法满足需要了。为此我们需要使用mybatis提供的<selectKey />来单独配置针对自增逐渐的处理。
1、Oracle Sequence 配置:
<sql id='TABLE_NAME'>TEST_USER</sql><sql id='TABLE_SEQUENCE'>SEQ_TEST_USER_ID.nextval</sql>
<!-- 注意这里需要先查询自增主键值 -->
<insert id="insert" parameterType="User">
<selectKey keyProperty="id" resultType="int" order="BEFORE">
select <include refid="TABLE_SEQUENCE" /> from dual
</selectKey>
insert into <include refid="TABLE_NAME" /> (ID,NAME,AGE)
values ( #{id}, #{name}, #{age} )
</insert>
当使用了<selectKey />后,在实际的插入 *** 作时,mybatis会执行以下两句SQL:
select SEQ_TEST_USER_ID.nextval from dual // 语句1insert into (ID,NAME,AGE) values ( ?, ?, ? ) // 语句2
在执行插入 语句2 之前,会先执行 语句1 以获取当前的ID值,然后mybatis使用反射调用User对象的setId方法,将 语句1 查询出的值保存在User对象中,然后才执行 语句2 这样就保证了执行完插入后
User user = new User()user.setName("test")
user.setAge(24)
userMapper.insert(user)
System.out.println(user.id) // user.id 不为空
user.id是有值的。
2、Mysql自增主键配置
针对于Mysql这种自己维护主键的数据库,可以直接使用以下配置在插入后获取插入主键,
<sql id='TABLE_NAME'>TEST_USER</sql><insert id="insert" useGeneratedKeys="true" keyProperty="id" parameterType="User">
insert into <include refid="TABLE_NAME" /> ( NAME, AGE )
values ( #{name}, #{age} )
</insert>
当然,由于Mysql的自增主键可以通过SQL语句
select LAST_INSERT_ID()来获取的。因此针对Mysql,Mybatis也可配置如下:
<sql id='TABLE_NAME'>TEST_USER</sql><!-- 注意这里需要先查询自增主键值 -->
<insert id="insert" parameterType="User">
<selectKey keyProperty="id" resultType="int" order="BEFORE">
SELECT LAST_INSERT_ID()
</selectKey>
insert into <include refid="TABLE_NAME" /> (ID,NAME,AGE)
values ( #{id}, #{name}, #{age} )
</insert>
只不过该中配置需要额外的一条查询SQL
小结
当数据插入 *** 作不关心插入后数据的主键(唯一标识),那么建议使用 不返回自增主键值 的方式来配置插入语句,这样可以避免额外的SQL开销.
当执行插入 *** 作后需要立即获取插入的自增主键值,比如一次 *** 作中保存一对多这种关系的数据,那么就要使用 插入后获取自增主键值 的方式配置.
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)