美文网首页
09-操作MyBatis

09-操作MyBatis

作者: wshsdm | 来源:发表于2019-08-16 15:45 被阅读0次

    1.创建SpringBoot项目,并引入Druid库

    修改pom.xml文件

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.1.7.RELEASE</version>
            <relativePath /> <!-- lookup parent from repository -->
        </parent>
        <groupId>com.demo</groupId>
        <artifactId>demospringbootMybatis-02</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>demospringbootMybatis-02</name>
        <description>Demo project for Spring Boot</description>
    
        <properties>
            <java.version>1.8</java.version>
                    <!--注意修改mysql驱动版本-->
            <mysql.version>5.1.38</mysql.version>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-jpa</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-jdbc</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>2.1.0</version>
            </dependency>
    
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <scope>runtime</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
            <!-- 添加druid数据连接池 -->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>1.1.16</version>
            </dependency>
        </dependencies>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
                <!--mybaits逆向工程插件-->
                <plugin>
                    <groupId>org.mybatis.generator</groupId>
                    <artifactId>mybatis-generator-maven-plugin</artifactId>
                    <version>1.3.2</version>
                    <configuration>
                        <verbose>true</verbose>
                        <overwrite>true</overwrite>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </project>
    

    2. 在mydb数据下创建表

    CREATE TABLE `tab_user` (
      `tid` int(11) NOT NULL AUTO_INCREMENT,
      `tname` varchar(20) COLLATE utf8_bin DEFAULT NULL,
      PRIMARY KEY (`tid`)
    ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
    

    3 创建数据库属性文件src/main/resources/datasources.properties

    db.driverLocation=D:/programs/.m2/repository/mysql/mysql-connector-java/5.1.38/mysql-connector-java-5.1.38.jar
    db.driverClassName=com.mysql.jdbc.Driver
    db.url=jdbc:mysql://localhost:3306/mydb?characterEncoding=utf-8
    db.username=root
    db.password=root 
     
    db.initialSize = 20
    db.maxActive = 50
    db.maxIdle = 20
    db.minIdle = 10
    db.maxWait = 10
    db.defaultAutoCommit = true
    db.minEvictableIdleTimeMillis = 3600000
    

    4 创建myBatis自动配置文件src/main/resources/generatorConfig.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE generatorConfiguration
            PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
            "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"> 
    <generatorConfiguration>
        <!--导入属性配置-->
        <properties resource="datasource.properties"></properties><!--导入链接数据库的参数和驱动--> 
        <!--指定特定数据库的jdbc驱动jar包的位置-->
        <classPathEntry location="${db.driverLocation}"/> 
        <context id="default" targetRuntime="MyBatis3">
     
            <!-- optional,旨在创建class时,对注释进行控制 -->
            <commentGenerator>
                <property name="suppressDate" value="true"/>
                <property name="suppressAllComments" value="true"/>
            </commentGenerator>
     
            <!--jdbc的数据库连接 -->
            <jdbcConnection
                    driverClass="${db.driverClassName}"
                    connectionURL="${db.url}"
                    userId="${db.username}"
                    password="${db.password}">
            </jdbcConnection> 
     
            <!-- 非必需,类型处理器,在数据库类型和java类型之间的转换控制--><!--一般保持默认-->
            <javaTypeResolver>
                <property name="forceBigDecimals" value="false"/>
            </javaTypeResolver> 
     
            <!-- Model模型生成器,用来生成含有主键key的类,记录类 以及查询Example类
                targetPackage     指定生成的model生成所在的包名
                targetProject     指定在该项目下所在的路径
            -->
            <!--<javaModelGenerator targetPackage="com.demo.pojo" targetProject=".\src\main\java">-->
            <javaModelGenerator targetPackage="com.demo.pojo" targetProject="./src/main/java">
                <!-- 是否允许子包,即targetPackage.schemaName.tableName -->
                <property name="enableSubPackages" value="false"/>
                <!-- 是否对model添加 构造函数 -->
                <property name="constructorBased" value="true"/>
                <!-- 是否对类CHAR类型的列的数据进行trim操作 -->
                <property name="trimStrings" value="true"/>
                <!-- 建立的Model对象是否 不可改变  即生成的Model对象不会有 setter方法,只有构造方法 -->
                <property name="immutable" value="false"/>
            </javaModelGenerator> 
            <!--mapper映射文件生成所在的目录 为每一个数据库的表生成对应的SqlMap文件 -->
            <!--<sqlMapGenerator targetPackage="mappers" targetProject=".\src\main\resources">-->
            <sqlMapGenerator targetPackage="mappers" targetProject="./src/main/resources">
                <property name="enableSubPackages" value="false"/>
            </sqlMapGenerator> 
            <!-- 客户端代码,生成易于使用的针对Model对象和XML配置文件 的代码
                    type="ANNOTATEDMAPPER",生成Java Model 和基于注解的Mapper对象
                    type="MIXEDMAPPER",生成基于注解的Java Model 和相应的Mapper对象
                    type="XMLMAPPER",生成SQLMap XML文件和独立的Mapper接口
            --> 
            <!-- targetPackage:mapper接口dao生成的位置 -->
            <!--<javaClientGenerator type="XMLMAPPER" targetPackage="com.demo.dao" targetProject=".\src\main\java">-->
            <javaClientGenerator type="XMLMAPPER" targetPackage="com.demo.dao" targetProject="./src/main/java">
                <!-- enableSubPackages:是否让schema作为包的后缀 -->
                <property name="enableSubPackages" value="false" />
            </javaClientGenerator> 
     <!--
           <table tableName="mmall_product" domainObjectName="Product" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false">
                <columnOverride column="detail" jdbcType="VARCHAR" />
                <columnOverride column="sub_images" jdbcType="VARCHAR" />存入数据库的是text,但是在数据库中为保持稳定使用string
            </table>
            -->
            <table tableName="tab_user" domainObjectName="Tuser" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"></table> 
            <!-- geelynote mybatis插件的搭建 -->
            <!--仅仅用来作为创建逆向工程-->
        </context>
    </generatorConfiguration>
    

    5 修改主配置文件 src/main/resources/application.yml

    #默认使用配置
    spring:
      profiles:
        active: dev
     
    #公共配置与profiles选择无关 mapperLocations指的路径是src/main/resources
    #公共配置与profiles选择无关
    mybatis:
      typeAliasesPackage: com.demo.pojo
      mapperLocations: classpath:mappers/*.xml
     
     
    ---
     
    #开发配置
    spring:
      profiles: dev
     
      datasource:
        url: jdbc:mysql://localhost:3306/mydb
        username: root
        password: root
        driverClassName: com.mysql.jdbc.Driver
        # 使用druid数据源
        type: com.alibaba.druid.pool.DruidDataSource
        # 配置获取连接等待超时的时间
        # 下面为连接池的补充设置,应用到上面所有数据源中
        # 初始化大小,最小,最大
        initialSize: 1
        minIdle: 3
        maxActive: 20
        # 配置获取连接等待超时的时间
        maxWait: 60000
        # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
        timeBetweenEvictionRunsMillis: 60000
        # 配置一个连接在池中最小生存的时间,单位是毫秒
        minEvictableIdleTimeMillis: 30000
        validationQuery: select 'x'
        testWhileIdle: true
        testOnBorrow: false
        testOnReturn: false
        # 打开PSCache,并且指定每个连接上PSCache的大小
        poolPreparedStatements: true
        maxPoolPreparedStatementPerConnectionSize: 20
        # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
        filters: stat,wall,slf4j
        # 通过connectProperties属性来打开mergeSql功能;慢SQL记录
        connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
        # 合并多个DruidDataSource的监控数据
        useGlobalDataSourceStat: true
    

    6 创建数据源配置类DruidConfiguration

    package com.demo.dao;
    
    import com.alibaba.druid.pool.DruidDataSource;
    import com.alibaba.druid.support.http.StatViewServlet;
    import com.alibaba.druid.support.http.WebStatFilter;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.boot.web.servlet.FilterRegistrationBean;
    import org.springframework.boot.web.servlet.ServletRegistrationBean;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.Primary;
     
    import javax.sql.DataSource;
    import java.sql.SQLException;
    
    @Configuration
    public class DruidConfiguration {
     
        private static final Logger logger = LoggerFactory.getLogger(DruidConfiguration.class);
     
        private static final String DB_PREFIX = "spring.datasource";
     
        @Bean
        public ServletRegistrationBean druidServlet() {
            logger.info("init Druid Servlet Configuration ");
            ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
            // IP白名单
            servletRegistrationBean.addInitParameter("allow", "localhost,127.0.0.1");
            // IP黑名单(共同存在时,deny优先于allow)
            servletRegistrationBean.addInitParameter("deny", "192.168.1.100");
            //控制台管理用户
            servletRegistrationBean.addInitParameter("loginUsername", "admin");
            servletRegistrationBean.addInitParameter("loginPassword", "123456");
            //是否能够重置数据 禁用HTML页面上的“Reset All”功能
            servletRegistrationBean.addInitParameter("resetEnable", "false");
            return servletRegistrationBean;
        }
     
        @Bean
        public FilterRegistrationBean filterRegistrationBean() {
            FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter());
            filterRegistrationBean.addUrlPatterns("/*");
            filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
            return filterRegistrationBean;
        }
     
        //解决 spring.datasource.filters=stat,wall,log4j 无法正常注册进去
        @ConfigurationProperties(prefix = DB_PREFIX)
        class IDataSourceProperties {
            private String url;
            private String username;
            private String password;
            private String driverClassName;
            private int initialSize;
            private int minIdle;
            private int maxActive;
            private int maxWait;
            private int timeBetweenEvictionRunsMillis;
            private int minEvictableIdleTimeMillis;
            private String validationQuery;
            private boolean testWhileIdle;
            private boolean testOnBorrow;
            private boolean testOnReturn;
            private boolean poolPreparedStatements;
            private int maxPoolPreparedStatementPerConnectionSize;
            private String filters;
            private String connectionProperties;
     
            @Bean     //声明其为Bean实例
            @Primary  //在同样的DataSource中,首先使用被标注的DataSource
            public DataSource dataSource() {
                DruidDataSource datasource = new DruidDataSource();
                datasource.setUrl(url);
                datasource.setUsername(username);
                datasource.setPassword(password);
                datasource.setDriverClassName(driverClassName);
     
                //configuration
                datasource.setInitialSize(initialSize);
                datasource.setMinIdle(minIdle);
                datasource.setMaxActive(maxActive);
                datasource.setMaxWait(maxWait);
                datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
                datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
                datasource.setValidationQuery(validationQuery);
                datasource.setTestWhileIdle(testWhileIdle);
                datasource.setTestOnBorrow(testOnBorrow);
                datasource.setTestOnReturn(testOnReturn);
                datasource.setPoolPreparedStatements(poolPreparedStatements);
                datasource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize);
                try {
                    datasource.setFilters(filters);
                } catch (SQLException e) {
                    System.err.println("druid configuration initialization filter: " + e);
                }
                datasource.setConnectionProperties(connectionProperties);
                return datasource;
            }
     
            public String getUrl() {
                return url;
            }
     
            public void setUrl(String url) {
                this.url = url;
            }
     
            public String getUsername() {
                return username;
            }
     
            public void setUsername(String username) {
                this.username = username;
            }
     
            public String getPassword() {
                return password;
            }
     
            public void setPassword(String password) {
                this.password = password;
            }
     
            public String getDriverClassName() {
                return driverClassName;
            }
     
            public void setDriverClassName(String driverClassName) {
                this.driverClassName = driverClassName;
            }
     
            public int getInitialSize() {
                return initialSize;
            }
     
            public void setInitialSize(int initialSize) {
                this.initialSize = initialSize;
            }
     
            public int getMinIdle() {
                return minIdle;
            }
     
            public void setMinIdle(int minIdle) {
                this.minIdle = minIdle;
            }
     
            public int getMaxActive() {
                return maxActive;
            }
     
            public void setMaxActive(int maxActive) {
                this.maxActive = maxActive;
            }
     
            public int getMaxWait() {
                return maxWait;
            }
     
            public void setMaxWait(int maxWait) {
                this.maxWait = maxWait;
            }
     
            public int getTimeBetweenEvictionRunsMillis() {
                return timeBetweenEvictionRunsMillis;
            }
     
            public void setTimeBetweenEvictionRunsMillis(int timeBetweenEvictionRunsMillis) {
                this.timeBetweenEvictionRunsMillis = timeBetweenEvictionRunsMillis;
            }
     
            public int getMinEvictableIdleTimeMillis() {
                return minEvictableIdleTimeMillis;
            }
     
            public void setMinEvictableIdleTimeMillis(int minEvictableIdleTimeMillis) {
                this.minEvictableIdleTimeMillis = minEvictableIdleTimeMillis;
            }
     
            public String getValidationQuery() {
                return validationQuery;
            }
     
            public void setValidationQuery(String validationQuery) {
                this.validationQuery = validationQuery;
            }
     
            public boolean isTestWhileIdle() {
                return testWhileIdle;
            }
     
            public void setTestWhileIdle(boolean testWhileIdle) {
                this.testWhileIdle = testWhileIdle;
            }
     
            public boolean isTestOnBorrow() {
                return testOnBorrow;
            }
     
            public void setTestOnBorrow(boolean testOnBorrow) {
                this.testOnBorrow = testOnBorrow;
            }
     
            public boolean isTestOnReturn() {
                return testOnReturn;
            }
     
            public void setTestOnReturn(boolean testOnReturn) {
                this.testOnReturn = testOnReturn;
            }
     
            public boolean isPoolPreparedStatements() {
                return poolPreparedStatements;
            }
     
            public void setPoolPreparedStatements(boolean poolPreparedStatements) {
                this.poolPreparedStatements = poolPreparedStatements;
            }
     
            public int getMaxPoolPreparedStatementPerConnectionSize() {
                return maxPoolPreparedStatementPerConnectionSize;
            }
     
            public void setMaxPoolPreparedStatementPerConnectionSize(int maxPoolPreparedStatementPerConnectionSize) {
                this.maxPoolPreparedStatementPerConnectionSize = maxPoolPreparedStatementPerConnectionSize;
            }
     
            public String getFilters() {
                return filters;
            }
     
            public void setFilters(String filters) {
                this.filters = filters;
            }
     
            public String getConnectionProperties() {
                return connectionProperties;
            }
     
            public void setConnectionProperties(String connectionProperties) {
                this.connectionProperties = connectionProperties;
            }
        }
     
    }
    

    7 修改启动类

    package com.demo;
    
    import org.mybatis.spring.annotation.MapperScan;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    @MapperScan("com.demo.dao")
    public class DemospringbootMybatis02Application {
    
        public static void main(String[] args) {
            SpringApplication.run(DemospringbootMybatis02Application.class, args);
        }
    }
    
    

    8. 启动MyBatis-generator插件

    MyBatis-generator插件

    9 编写业务bean

    package com.demo.service;
    
    import java.util.List;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    import com.demo.dao.TuserMapper;
    import com.demo.pojo.Tuser;
    
    @Service
    public class TuserService {
        
       @Autowired
       private TuserMapper dao;
       
       public void save(Tuser user) {
           dao.insert(user);
       }
       
       public List<Tuser> findAll(){
           return dao.selectAll();
       }    
    }
    
    

    10. 编写测试

    package com.demo;
    
    import java.util.List;
    
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.context.junit4.SpringRunner;
    
    import com.demo.pojo.Tuser;
    import com.demo.service.TuserService;
    
    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class DemospringbootMybatis02ApplicationTests {
        @Autowired
        private TuserService userser;
        
        @Test
        public void inserts() {
            Tuser u=new Tuser();
            u.setTname("李凯");
            userser.save(u);
        }
    @Test
    public void selects() {
        List<Tuser> li = userser.findAll();
        System.out.println(li.size());
    }
    }
    
    

    相关文章

      网友评论

          本文标题:09-操作MyBatis

          本文链接:https://www.haomeiwen.com/subject/quhqsctx.html