<!--配置文件-->
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--
.properties:可以使用properties来导入外部的properties文件,例如把连接数据库的配置信息单独放在一个properties中
resource:引入类路径下的资源
url:引入网络路径或者本地磁盘的资源
-->
<properties resource="db.properties"></properties>
<!--
.settings:包含很多的重要设置
setting:用来设置每一个设置项
name:设置项名
value:设置项值
例如:mapUnderscoreToCamelCase 默认为false 这个的作用是驼峰命名转换,l_name -> lName
-->
<settings>
<!--开启驼峰命名-->
<setting name="mapUnderscoreToCamelCase" value="true"/>
<setting name="jdbcTypeForNull" value="NULL"></setting>
<setting name="lazyLoadingEnabled" value="true"></setting>
<setting name="aggressiveLazyLoading" value="false"></setting>
<!--开启二级缓存-->
<setting name="cacheEnabled" value="false"></setting>
</settings>
<!--
.typeAliases:起别名的标签
typeAlias:为某个java类型起别名
type:指定要起别名的全类名,默认别名就是类小写,(但是其实他是不区分大小写的,也就是说你全部大写也没问题)
alias:新的别名
package:为某个包下的类批量起别名(这个会存在的一个问题就是可能会重复,重复的情况下还可以用@Alias来解决)
name:指定包名(这个就相当于是为这个包下的所有的类都创建了一个默认的别名)
当然还有一个起别名的方式就是在实体上使用@Alias来起别名
注:起别名看自己的情况,推荐还是在mapper文件中使用全类名
-->
<typeAliases>
<typeAlias type="model.User" alias="user"></typeAlias>
<package name="model"></package>
</typeAliases>
<!--
.environments:配置mybatis的多种环境,default指定使用某种环境。可以达到快速切换的目的
environment:配置一个具体的环境信息,他必须要配置transactionManager和dataSource这两个子标签,id代表当前环境的唯一标识
transactionManager:事务管理器 type是具体事物的别名 有两个值:JDBC(JdbcTransactionFactory)|MANAGED(ManagedTransactionFactory)
当然我们还可以自定义事物:需要我们实现TransactionFactory接口 type指定为全类名
dataSource:数据源 type:数据源类型 有三个值:UNPOOLED(UnpooledDataSourceFactory)
|POOLED(PooledDataSourceFactory)
|JNDI(JndiDataSourceFactory)
当然我们还可以自定义数据源 使用之前接触过的c3p0,dbcp什么的,这需要我们实现DataSourceFactory type指向全类名
但是这部分的内容一般来说并不会使用mybatis的配置,一般都是在spring中配置
-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</dataSource>
</environment> <environment id="test">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${oracle.driver}" />
<property name="url" value="${oracle.url}" />
<property name="username" value="${oracle.username}" />
<property name="password" value="${oracle.password}" />
</dataSource>
</environment>
</environments>
<!--
.databaseIdProvider:用来支持多数据库厂商
type="DB_VENDOR":VendorDatabaseIdProvider
作用就是得到数据库厂商的标识 getDatabaseProductName()
name是数据库厂商的标识,value使我们给他取的值
-->
<databaseIdProvider type="DB_VENDOR">
<property name="MySQL" value="mysql"></property>
<property name="Oracle" value="oracle"></property>
</databaseIdProvider>
<!-- 将我们写好的sql映MapperEmployee.xml)一定要注册到全局配置文件(mybatis-config.xml)中 -->
<!--
.mappers:注册一个sql映射
mapper
有三种注册方式:resource url class
其中resource url是以配置文件的方式来注册 class是以接口的方式
resource:引用类路径下的sql映射文件
<mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
url:引用网络路径或者本地磁盘路径下的映射文件
<mapper url="file:///var/mappers/PostMapper.xml"/>
class 有两种方式
.有sql映射文件时,这个文件xml文件要和接口同名且放在一起(在idea开发环境会遇到问题,就是加载不到MapperEmployee.xml
解决方案是在pom中加入build标签的内容)
.没有映射文件而使用注解的方式(@Select @Delete @Insert @Update),这个和spring data jpa类似。只不过要多加一步,将他的全限定名配置在class中
注:在这里就有个问题,如果sql语句都用注解的方式,我们会不好管理,所以推荐的用法是不重要的用注解,比较重要的
还是配置到映射文件中来统一管理。
以上这三类都是一个一个注册,还有一种批量注册的方式
package name是包名 但是批量注册要注意一个问题就是,在这个包下使用了注解方式的没有问题,没使用注解方式的我们就是
用到class方式第一种的方式,将sql的映射文件和接口放在一起
-->
<mappers>
<!--使用注解的方式-->
<!-- <mapper class="com.wj.mybatis.dao.MapperEmployeeAnnotation"/>
<package name="com.wj.mybatis.dao"></package> -->
<!--<mapper class="com.wj.mybatis.dao.MapperEmployee"></mapper>-->
<mapper resource="UserMapper.xml"/>
</mappers>
</configuration>

二、mapper配置

<?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 namespace="mapper.UserMapper">
<!--
id:sql语句唯一标识
parameterType:指定传入参数类型(pojo类中对应的类型,不是数据库中的类型)
resultType:返回结果集类型
#{}:占位符,如果传入的类型是基本类型(string,long,double,int,boolean,float等),那么#{}中变量名称可以任意
-->
<select id="findUserById" parameterType="java.lang.Integer" resultType="model.User" databaseId="mysql">
SELECT * FROM user WHERE id=#{id}
</select> <!--
如果返回的结果为集合,resultType中也是配置为集合中泛型的类型,即resultType="model.User"
${}:拼接符,如果传入的类型是基本类型(string,long,double,int,boolean,float等),那么${}中变量名称必须是value
-->
<select id="findUserByUserName" parameterType="java.lang.String" resultType="model.User">
SELECT * FROM user WHERE username LIKE '%${value}%'
</select> <!--
如果传入的是pojo类型,则#{}中变量名称必须是pojo中对应的属性.属性.属性......
如果要返回数据库自增主键,可以使用SELECT LAST_INSERT_ID()
-->
<insert id="insertUser" parameterType="model.User" useGeneratedKeys="true" keyProperty="id">
<!-- 执行SELECT LAST_INSERT_ID()数据库函数,返回自增的主键
keyProperty:将返回的主键放入传入的参数的Id中保存(保存到user对象中的id属性)
order:当前函数相对于insert语句的执行顺序,在insert前执行用BEFORE,在insert后执行用AFTER
resultType:id的类型,也就是keyProperty中属性类型
-->
<!-- <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
SELECT LAST_INSERT_ID()
</selectKey> -->
  
<!-- oracle获取主键再插入-->
<!--  <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.Integer">
SELECT SEQ.nextval() from user
</selectKey> -->
        INSERT INTO user (id,last_name,email,gender) VALUES (#{id},#{lastName},#{email},#{gender})
</insert> <delete id="deleteUserById" parameterType="java.lang.Integer">
DELETE FROM user WHERE id=#{id}
</delete> <update id="updateUserById" parameterType="model.User">
UPDATE user SET username=#{username} WHERE id=#{id}
</update>
</mapper>

三、测试代码

package test;

import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import mapper.UserMapper;
import model.User; public class MybatisTest { @Test
public void test() {
String resource = "mybatis-config.xml";
InputStream inputStream;
try {
inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = new User();
user.setLastName("赵四222");
user.setEmail("");
user.setGender("北京昌平222");
mapper.insertUser(user);
System.out.println(user.toString());
sqlSession.commit();
// 释放资源
sqlSession.close();
} catch (Exception e) {
e.printStackTrace();
}
} @Test
public void testFindUserById() throws Exception {
String resource = "mybatis-config.xml";
// 通过流将核心配置文件读取进来
InputStream inputStream = Resources.getResourceAsStream(resource);
// 通过核心配置文件创建会话工厂
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream); // 通过会话工厂创建会话
SqlSession session = factory.openSession(); User user = session.selectOne("mapper.UserMapper.findUserById", );
System.out.println(user.toString());
} @Test
public void testInsertUser() throws Exception {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream); SqlSession session = factory.openSession();
User user = new User();
user.setLastName("赵四");
user.setEmail("");
user.setGender("北京昌平");
System.out.println(user.getId());
session.insert("test.insertUser", user);
// mybatis中事务默认是开启的,所以在mybatis中不需要显式开启事务,只需要显式提交事务
// 提交事务
session.commit();
System.out.println(user.getId());
}
}

代码

mybatis一(常用配置信息和获取插入后id)的更多相关文章

  1. MngoDb MongoClientOptions 配置信息及常用配置信息

    MongoClientOptions.Builder addClusterListener(ClusterListener clusterListener)Adds the given cluster ...

  2. 71.mybatis 如何获取插入的id【从零开始学Spring Boot】

    [从零开始学习Spirng Boot-常见异常汇总] 在之前的文章已经讲过spring boot集成mybatis了,但是忘记说一个很重要的知识点了,那就是获取获取主键id,这篇文章补充下,sprin ...

  3. C# ASP.NET(配置数据库 sql server 地址的两种形式以及配置信息的获取)

    ( 1 ) 数据库装在本机,并且采用windows认证模式 <connectionStrings>    <add name="SQLConnectionString&qu ...

  4. yii框架学习(获取插入后的id)

    插入单条数据, 获取插入数据的id. $model->attributes['id']; new  model 添加数据的时候, 需要注意, 如果是想要循环添加多条数据的情况, new mode ...

  5. MyBatis XML常用配置

    1.属性(properties) 可外部配置且可动态替换的,既可以在典型的 Java 属性文件中配置,亦可通过 properties 元素的子元素来传递. 可以外部定义好properties文件通过 ...

  6. linux 下 etc常用配置信息

    这些都是比较有实用性的系统配置,收藏下,以备不时之需!以下是etc下重要配置文件解释: 1./etc/hosts  #文件格式: IPaddress hostname aliases #文件功能: 提 ...

  7. 服务网关ZuulFilter过滤器--pre/post/error的用法(校验请求信息,获取路由后的请求/响应信息,处理服务网关异常)

    微服务中Zuul服务网关一共定义了四种类型的过滤器: pre:在请求被路由(转发)之前调用 route:在路由(请求)转发时被调用 error:服务网关发生异常时被调用 post:在路由(转发)请求后 ...

  8. mysql获取插入的id主键

    long _retId = -1; Connection con = null; try { con = queryRunner.getDataSource().getConnection(); qu ...

  9. .NetCore获取Json和Xml格式的配置信息

    本篇将和大家分享的是:如何获取Json和Xml格式的配置信息,主要介绍的是Configuration扩展方法的使用,因为netcore的web应用在Startup中已经默认嵌入appsettings. ...

随机推荐

  1. pytest.7.常见套路

    From: http://www.testclass.net/pytest/common_useage/ 在使用pytest的时候,下面这些问题我们可能会经常遇到,这里给出官方的解决方案,按照套路来执 ...

  2. html文件在head标签中引入js地址和直接写js代码,所用时间是不同的,因为引入js地址,文件加载的时候需要通过通讯协议去解析地址,读取外部文件

    html文件在head标签中引入js地址和直接写js代码,所用时间是不同的,因为引入js地址,文件加载的时候需要通过通讯协议去解析地址,读取外部文件

  3. 以太网安全技术ACL原理+配置

    一.以太网访问控制列表 主要作用:在整个网络中分布实施接入安全性 访问控制列表ACL(Access Control List)为网络设备提供了基本的服务安全性.对某个服务而言,安全管理员首先应该考虑的 ...

  4. QoS 服务质量

    一.QoS QoS: Quality of Service(服务质量) 是指网络通信过程中,允许用户业务在丢包率.延迟.抖动和带宽等方面获得可预期的服务水平.更简单地说:QoS就是针对各种不同需求,提 ...

  5. [UE4]自定义结构体、类、数据表

    自定义数据表: #pragma once #include "CoreMinimal.h" #include "Engine/UserDefinedStruct.h&qu ...

  6. [UE4]扔枪

    1.把枪Detach掉:DetachFromActor 3个都选择“Keep World” 2.模拟物理 3.给一个向前的速度 4.切枪,到上一个武器,或者捡起脚底下的武器 注意Get Compone ...

  7. DevExpress GridView删除行

    int[] rows = gridView1.GetSelectedRows(); ) { if (DialogHelper.YesNo(this, "确认删除该记录?", &qu ...

  8. SCCM2012 R2实战系列之五:发现方法

    打开SCCM2012的控制台 点击左侧栏的“管理”选项,然后展开“层次结构配置”,点击“发现方法”来配置客户端发现. 勾选“启用Active Directory林发现”.“发现Active Direc ...

  9. c# 未能加载文件或程序集

    最近做项目时碰到这个问题了,goole.百度了半天,整理了以下几种可能: DLL文件名与加载时的DLL文件名不一致, DLL文件根本不存在,即出现丢失情况, 加载DLL路径错误,即DLL文件存在,但加 ...

  10. 利用WordPress REST API 开发微信小程序从入门到放弃

    自从我发布并开源WordPress版微信小程序以来,很多WordPress网站的站长问有关程序开发的问题,其实在文章:<用微信小程序连接WordPress网站>讲述过一些基本的要点,不过仍 ...