zoukankan      html  css  js  c++  java
  • mybatis一(常用配置信息和获取插入后id)

    <!--配置文件-->
    <?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> <!-- 1.properties:可以使用properties来导入外部的properties文件,例如把连接数据库的配置信息单独放在一个properties中 resource:引入类路径下的资源 url:引入网络路径或者本地磁盘的资源 --> <properties resource="db.properties"></properties> <!-- 2.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> <!-- 3.typeAliases:起别名的标签 typeAlias:为某个java类型起别名 type:指定要起别名的全类名,默认别名就是类小写,(但是其实他是不区分大小写的,也就是说你全部大写也没问题) alias:新的别名 package:为某个包下的类批量起别名(这个会存在的一个问题就是可能会重复,重复的情况下还可以用@Alias来解决) name:指定包名(这个就相当于是为这个包下的所有的类都创建了一个默认的别名) 当然还有一个起别名的方式就是在实体上使用@Alias来起别名 注:起别名看自己的情况,推荐还是在mapper文件中使用全类名 --> <typeAliases> <typeAlias type="model.User" alias="user"></typeAlias> <package name="model"></package> </typeAliases> <!-- 4.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> <!-- 5.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)中 --> <!-- 6.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 有两种方式 1.有sql映射文件时,这个文件xml文件要和接口同名且放在一起(在idea开发环境会遇到问题,就是加载不到MapperEmployee.xml 解决方案是在pom中加入build标签的内容) 2.没有映射文件而使用注解的方式(@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:返回结果集类型
        #{}:占位符,如果传入的类型是基本类型(stringlongdoubleint,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"
        ${}:拼接符,如果传入的类型是基本类型(stringlongdoubleint,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("1232342221");
                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", 1);
            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("1232341");
            user.setGender("北京昌平");
            System.out.println(user.getId());
            session.insert("test.insertUser", user);
            // mybatis中事务默认是开启的,所以在mybatis中不需要显式开启事务,只需要显式提交事务
            // 提交事务
            session.commit();
            System.out.println(user.getId());
        }
    }

    代码

  • 相关阅读:
    如何使用SAP Intelligent Robotic Process Automation自动操作Excel
    OpenSAML 使用引导 IV: 安全特性
    Spring Cloud Zuul 网关使用与 OAuth2.0 认证授权服务
    微服务架构集大成者—Spring Cloud (转载)
    Spring Cloud Eureka 服务注册列表显示 IP 配置问题
    使用 Notification API 开启浏览器桌面提醒
    SignalR 中使用 MessagePack 序列化提高 WebSocket 通信性能
    配置 Nginx 的目录浏览功能
    关于 Nginx 配置 WebSocket 400 问题
    Migrate from ASP.NET Core 2.0 to 2.1
  • 原文地址:https://www.cnblogs.com/flgb/p/10279250.html
Copyright © 2011-2022 走看看