zoukankan      html  css  js  c++  java
  • mybatis 基础01

     hibernate 比较不好的一点 就是全表映射,

    比如不好定制 sql, 把表中的所有字段都 select 出来,增加网络开销 和 序列化的开销,增加了 CPU 的操作

    使用 hibernate 不需要 写 sql,屏蔽了 sql, 不利于 调优

    项目日志导入:

    <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>
        <groupId>com.enjoylearing.mybatis</groupId>
        <artifactId>mybatis-quick-start</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <dependencies>
            <!-- 单元测试相关依赖 -->
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.12</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-test</artifactId>
                <version>4.3.2.RELEASE</version>
                <scope>test</scope>
            </dependency>
    
            
    
            <!-- 日志相关依赖 -->
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-api</artifactId>
                <version>1.7.10</version>
            </dependency>
            <dependency>
                <groupId>ch.qos.logback</groupId>
                <artifactId>logback-classic</artifactId>
                <version>1.1.2</version>
            </dependency>
            <dependency>
                <groupId>ch.qos.logback</groupId>
                <artifactId>logback-core</artifactId>
                <version>1.1.2</version>
            </dependency>
    
            <!-- mysql驱动 -->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.18</version>
            </dependency>
    
    
            <!-- mybatis相关依赖 -->
            <dependency>
                <groupId>org.mybatis</groupId>
                <artifactId>mybatis</artifactId>
                <version>3.4.1</version>
            </dependency>
    
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>2.1</version>
                    <configuration>
                        <source>1.7</source>
                        <target>1.7</target>
                    </configuration>
                </plugin>
    
                <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>
    package com.enjoylearning.mybatis;
    //STEP 1. 导入sql相关的包
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.ArrayList;
    import java.util.List;
    
    import org.junit.Test;
    
    import com.enjoylearning.mybatis.entity.TUser;
    
    public class JdbcDemo {
        static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
        static final String DB_URL = "jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true";
    
        // Database credentials
        static final String USER = "root";
        static final String PASS = "422525";
    
        @Test
        public void QueryStatementDemo() {
            Connection conn = null;
            Statement stmt = null;
            List<TUser> users = new ArrayList<>();
            try {
                // STEP 2: 注册mysql的驱动
                Class.forName("com.mysql.jdbc.Driver");
    
                // STEP 3: 获得一个连接
                System.out.println("Connecting to database...");
                conn = DriverManager.getConnection(DB_URL, USER, PASS);
    
                // STEP 4: 创建一个查询
                System.out.println("Creating statement...");
                stmt = conn.createStatement();
                String userName = "lison";
                String sql="SELECT * FROM t_user where user_name='"+userName+"'";
                ResultSet rs = stmt.executeQuery(sql);
                System.out.println(stmt.toString());
                
    
                // STEP 5: 从resultSet中获取数据并转化成bean
                while (rs.next()) {
                    System.out.println("------------------------------");
                    // Retrieve by column name
                    TUser user = new TUser();
    //                user.setId(rs.getInt("id"));
    //                user.setUserName(rs.getString("user_name"));
                    user.setRealName(rs.getString("real_name"));
                    user.setSex(rs.getByte("sex"));
                    user.setMobile(rs.getString("mobile"));
                    user.setEmail(rs.getString("email"));
                    user.setNote(rs.getString("note"));
    
                    System.out.println(user.toString());
                    
                    users.add(user);
                }
                // STEP 6: 关闭连接
                rs.close();
                stmt.close();
                conn.close();
            } catch (SQLException se) {
                // Handle errors for JDBC
                se.printStackTrace();
            } catch (Exception e) {
                // Handle errors for Class.forName
                e.printStackTrace();
            } finally {
                // finally block used to close resources
                try {
                    if (stmt != null)
                        stmt.close();
                } catch (SQLException se2) {
                }// nothing we can do
                try {
                    if (conn != null)
                        conn.close();
                } catch (SQLException se) {
                    se.printStackTrace();
                }
            }
            System.out.println("-------------------------");
            System.out.println("there are "+users.size()+" users in the list!");
        }
        
        
        @Test
        public void QueryPreparedStatementDemo() {
            Connection conn = null;
            PreparedStatement stmt = null;
            List<TUser> users = new ArrayList<>();
            try {
                // STEP 2: 注册mysql的驱动
                Class.forName("com.mysql.jdbc.Driver");
    
                // STEP 3: 获得一个连接
                System.out.println("Connecting to database...");
                conn = DriverManager.getConnection(DB_URL, USER, PASS);
    
                // STEP 4: 创建一个查询
                System.out.println("Creating statement...");
                String sql;
                sql = "SELECT * FROM t_user where user_name= ? ";
                stmt = conn.prepareStatement(sql);
                stmt.setString(1, "lison");
                System.out.println(stmt.toString());//打印sql
                ResultSet rs = stmt.executeQuery();
                
    
                // STEP 5: 从resultSet中获取数据并转化成bean
                while (rs.next()) {
                    System.out.println("------------------------------");
                    // Retrieve by column name
                    TUser user = new TUser();
    //                user.setId(rs.getInt("id"));
    //                user.setUserName(rs.getString("user_name"));
                    user.setRealName(rs.getString("real_name"));
                    user.setSex(rs.getByte("sex"));
                    user.setMobile(rs.getString("mobile"));
                    user.setEmail(rs.getString("email"));
                    user.setNote(rs.getString("note"));
    
                    System.out.println(user.toString());
                    
                    users.add(user);
                }
                // STEP 6: 关闭连接
                rs.close();
                stmt.close();
                conn.close();
            } catch (SQLException se) {
                // Handle errors for JDBC
                se.printStackTrace();
            } catch (Exception e) {
                // Handle errors for Class.forName
                e.printStackTrace();
            } finally {
                // finally block used to close resources
                try {
                    if (stmt != null)
                        stmt.close();
                } catch (SQLException se2) {
                }// nothing we can do
                try {
                    if (conn != null)
                        conn.close();
                } catch (SQLException se) {
                    se.printStackTrace();
                }
            }
            System.out.println("-------------------------");
            System.out.println("there are "+users.size()+" users in the list!");
        }
    
        @Test
        public void updateDemo(){
            Connection conn = null;
            PreparedStatement stmt = null;
            try {
                // STEP 2: 注册mysql的驱动
                Class.forName("com.mysql.jdbc.Driver");
    
                // STEP 3: 获得一个连接
                System.out.println("Connecting to database...");
                conn = DriverManager.getConnection(DB_URL, USER, PASS);
                
                // STEP 4: 启动手动提交
                conn.setAutoCommit(false);
                
    
                // STEP 5: 创建一个更新
                System.out.println("Creating statement...");
                String sql = "update t_user  set mobile= ? where user_name= ? ";
                stmt = conn.prepareStatement(sql);
                stmt.setString(1, "186995587411");
                stmt.setString(2, "lison");
                System.out.println(stmt.toString());//打印sql
                int ret = stmt.executeUpdate();
                System.out.println("此次修改影响数据库的行数为:"+ret);
    
                // STEP 6: 手动提交数据
                conn.commit();
                
                // STEP 7: 关闭连接
                stmt.close();
                conn.close();
            } catch (SQLException se) {
                // Handle errors for JDBC
                try {
                    conn.rollback();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                se.printStackTrace();
            } catch (Exception e) {
                try {
                    conn.rollback();
                } catch (SQLException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
                e.printStackTrace();
            } finally {
                // finally block used to close resources
                try {
                    if (stmt != null)
                        stmt.close();
                } catch (SQLException se2) {
                }// nothing we can do
                try {
                    if (conn != null)
                        conn.close();
                } catch (SQLException se) {
                    se.printStackTrace();
                }
            }
        }
    }

     使用 maven 快速应用:

    package com.enjoylearning.mybatis;
    
    import java.io.IOException;
    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.Before;
    import org.junit.Test;
    
    import com.enjoylearning.mybatis.entity.TUser;
    import com.enjoylearning.mybatis.mapper.TUserMapper;
    
    public class MybatisQuickStart {
    
        private SqlSessionFactory sqlSessionFactory;
    
        @Before
        public void init() throws IOException {
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            // 1.读取mybatis配置文件创SqlSessionFactory
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            inputStream.close();
        }
    
        @Test
        // 快速入门
        public void quickStart() throws IOException {
            // 2.获取sqlSession
            SqlSession sqlSession = sqlSessionFactory.openSession();
            // 3.获取对应mapper
            TUserMapper mapper = sqlSession.getMapper(TUserMapper.class);
            // 4.执行查询语句并返回结果
            TUser user = mapper.selectByPrimaryKey(1);
            System.out.println(user.toString());
    
        }
        
    }

    mybatis 的配置 : mybatis-config.xml

    <?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 resource="db.properties" />
    
        <settings>
            <setting name="mapUnderscoreToCamelCase" value="true" />
        </settings>
    
    
        <!--配置environment环境 -->
        <environments default="development">
            <!-- 环境配置1,每个SqlSessionFactory对应一个环境 -->
            <environment id="development">
                <transactionManager type="JDBC" />
                <dataSource type="UNPOOLED">
                    <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>
    
        </environments>
    
        <!-- 映射文件,mapper的配置文件 -->
    <!--     <mappers>
            直接映射到相应的mapper文件
            <mapper resource="sqlmapper/TUserMapper.xml" />
        </mappers> -->
    
        <mappers>
            <mapper class="com.enjoylearning.mybatis.mapper.TUserMapper" />
        </mappers>
    
    
    </configuration>  

    mybatis 常用属性总结:

     配置 typeAliases 别名, mapper.xml 就不需要写全路径了

    typeHandler  自定义类型转换:

    mybatis 有一个注册中心的概念, 可以将 java的 类型 映射成 数据库的类型

     可以点进去 看一个 BigDecimalTypeHandler 

    /**
     *    Copyright 2009-2015 the original author or authors.
     *
     *    Licensed under the Apache License, Version 2.0 (the "License");
     *    you may not use this file except in compliance with the License.
     *    You may obtain a copy of the License at
     *
     *       http://www.apache.org/licenses/LICENSE-2.0
     *
     *    Unless required by applicable law or agreed to in writing, software
     *    distributed under the License is distributed on an "AS IS" BASIS,
     *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     *    See the License for the specific language governing permissions and
     *    limitations under the License.
     */
    package org.apache.ibatis.type;
    
    import java.math.BigDecimal;
    import java.sql.CallableStatement;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    
    /**
     * @author Clinton Begin
     */
    public class BigDecimalTypeHandler extends BaseTypeHandler<BigDecimal> {
    
      @Override
      public void setNonNullParameter(PreparedStatement ps, int i, BigDecimal parameter, JdbcType jdbcType)
          throws SQLException {
        ps.setBigDecimal(i, parameter);
      }
    
      @Override
      public BigDecimal getNullableResult(ResultSet rs, String columnName)
          throws SQLException {
        return rs.getBigDecimal(columnName);
      }
    
      @Override
      public BigDecimal getNullableResult(ResultSet rs, int columnIndex)
          throws SQLException {
        return rs.getBigDecimal(columnIndex);
      }
    
      @Override
      public BigDecimal getNullableResult(CallableStatement cs, int columnIndex)
          throws SQLException {
        return cs.getBigDecimal(columnIndex);
      }
    }

    我们可以自定义 一个 TypeHandler , 继承 mybatis 实现的 接口,就可以自动进行类型转化了。

  • 相关阅读:
    OpenResty 作者章亦春访谈实录
    linux 下C语言学习路线
    swift 集合类型
    不懂技术的人不要对懂技术的人说这很容易实现
    java学习笔记7--抽象类与抽象方法
    java学习笔记6--类的继承、Object类
    python练习题
    python的里字典和列表
    python里list列表,tuple元组内部功能介绍
    python里float和long内部功能及字符串str介绍
  • 原文地址:https://www.cnblogs.com/lyr-2000/p/13853724.html
Copyright © 2011-2022 走看看