• Mybatis入门程序(一)


    1、入门程序实现需求

    根据用户id查询一个用户信息

    根据用户名称模糊查询用户信息列表

    添加用户(二)

    更新用户(二)

    删除用户(二)

    2、引入Mybatis所需 jar 包(Maven工程)

    <dependencies>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.2.7</version>
        </dependency>
    
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.0</version>
        </dependency>
    
        <dependency>
            <groupId>cglib</groupId>
            <artifactId>cglib-nodep</artifactId>
            <version>2.2</version>
        </dependency>
    
        <dependency>
            <groupId>asm</groupId>
            <artifactId>asm</artifactId>
            <version>3.3.1</version>
        </dependency>
    
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.1.1</version>
        </dependency>
    
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.5</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.5</version>
            <scope>test</scope>
        </dependency>
    
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>
    </dependencies>

      最终引入jar包:

     

    2、在classpath下创建log4j.properties如下:

    # Global logging configuration
    log4j.rootLogger=DEBUG, stdout
    # Console output...
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

    3、在classpath下创建SqlMapConfig.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>
        <!-- 和spring整合后 environments配置将废除-->
        <environments default="development">
            <environment id="development">
            <!-- 使用jdbc事务管理-->
                <transactionManager type="JDBC" />
            <!-- 数据库连接池-->
                <dataSource type="POOLED">
                    <property name="driver" value="com.mysql.jdbc.Driver" />
                    <property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8" />
                    <property name="username" value="root" />
                    <property name="password" value="root" />
                </dataSource>
            </environment>
        </environments>
        
    </configuration>

     

    4、classpath下的sqlmap目录下创建sql映射文件Users.xml

    <?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">
    <mapper namespace="test">
        <!-- 
            parameterType:指定输入参数的类型,这里指定int型
            #{id}:其中的id表示接收输入的参数,参数的名称为id,如果输入参数是简单类型,
            #{}中参数名可以任意,可以是value或其他的名称
            resultType:指定sql输出结果所映射的java类型,select 指定resultType表示将单条记录映射成的Java对象
         -->
        <select id="findUserByIDd" parameterType="int" resultType="com.bjxb.mybatis.pojo.User">
            SELECT * FROM USER WHERE ID = #{id}
        </select>
    </mapper>

    5、pojo类作为mybatis进行sql映射使用,pojo类通常与数据库表对应,User.java如下:

    Public class User {
        private int id;
        private String username;// 用户姓名
        private String sex;// 性别
        private Date birthday;// 生日
        private String address;// 地址
        get/set……
    }

    6、在 sqlMapConfig.xml 中加载 User.xml

    <!-- 加载映射文件 -->
    <mappers>
        <mapper resource="sqlMap/User.xml"/>
    </mappers>

    7、根据id查询用户信息,编写程序

    public class MybatisFirst {
    
        // 根据id查询用户的信息,得到一条记录的结果
        @Test
        public void findUserByIdTest() {
            SqlSession sqlSession = null;
            
            try {
                // mybatis配置文件
                String resource = "config/SqlMapConfig.xml";// 得到配置文件流
                InputStream inputStream = Resources.getResourceAsStream(resource);
                
                // 创建会话工厂,传入mybatis的配置文件信息
                SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
                
                // 通过工厂的到SQLSession
                sqlSession = sqlSessionFactory.openSession();
                
                // 通过SQLSession操作数据库
                // 第一个参数:就是映射文件中statement中的id,等于=namespace+statement的id
                // 第二个参数:指定和映射文件中所匹配的parameterType类型的参数
                // sqlSession.selectOne结果是与映射文件中所匹配resultType类型的对象
                User user = sqlSession.selectOne("test.findUserById", 1);
                
                System.out.println(user);
            } catch (Exception e) {
                // TODO: handle exception
            }finally {
                // 释放资源
                sqlSession.close();
            }
            
        }
    }

     8、根据用户名模糊查询用户信息,编写程序

      (1)User.xml,添加根据用户名称模糊查询用户信息的 sql 语句

    <!-- 根据用户名称模糊查询用户信息,可能返回多条
        resultType:指定的就是单条记录所映射的java对象类型
        ${}:表示拼接sql串,将接收到的参数的内容,不加任何的修饰拼接在sql中。
        使用${}拼接sql,可能会引起sql注入
       ${value}:接收输入参数的内容,如果传入类型是简单类型,${}中只能使用value
     -->
    <select id="findUserByName" parameterType="java.lang.String" resultType="com.bjxb.mybatis.pojo.User">
        SELECT * FROM USER WHERE USERNAME LIKE '%${value}%'
    </select>

      

      我们观察到,输出的 SQL 语句,like后面并没有出现 ?,即占位符。这种情况就有可能出现 SQL 注入

     

      

      (2)编程:

    // 根据用户名称来模糊查询用户列表
    @Test
    public void findUserByNameTest() {
        SqlSession sqlSession = null;
        
        try {
            // mybatis配置文件
            String resource = "config/SqlMapConfig.xml";
            // 得到配置文件流
            InputStream inputStream = Resources.getResourceAsStream(resource);
            
            // 创建会话工厂,传入mybatis的配置文件信息
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            
            // 通过工厂的到SQLSession
            sqlSession = sqlSessionFactory.openSession();
            
            // list中的User和映射文件中的resultType所指定的类型一致
            List<User> list = sqlSession.selectList("test.findUserByName", "小明");
            /**
             *  方案一(不可行):我们直接传入参数"小明", 映射文件对应为 '%#{value}%'
             *      不可行原因: 因为#{}使用的是占位符 ? ,在实际编译过程中,因为我们传入的是字符串,会自动在小明两边加上''
             *      最终效果为  name like '%'小明'%'  显然查不出
             *  
             *  方案二(可行):我们可以传入参数 "%小明%",映射文件中用#{}接收
             *      优点:防止sql注入;  缺点:却需要我们每次都传入两个%
             *  
             *  方案三(可行):我们依然直接传入"小明",映射文件对应为 '%${}%'
             *      优点:我们不需要传入%,只需要传入查询名 ;   缺点:由于${}不会使用占位符 ? 而是直接拼接在SQL中, 会出现如下情况:
             *      SQL注入可以点击查看博主另一篇博客
             *  
             */
            System.out.println(list);
            
        } catch (Exception e) {
            // TODO: handle exception
        }finally {
            sqlSession.close();
        }
        
    }

    9、小结

      9.1:parameterType在映射文件中通过 parameterType 指定输入参数的类型

      9.2:resultType在映射文件中通过 resultType 指定输出结果的类型

      9.3:#{ }和 ${ }的区别:

        #{ } 表示一个占位符,#{ }接收输入参数,类型可以是简单类型,pojo,HashMap。

        如果接收的是简单类型,#{ } 中可以写成value或者其他名称。

        #{ } 接收 pojo 对象值,通过 OGNL 来读取对象中的属性值,通过属性.属性.属性...的方式获取对象属性值。

        

        ${ } 表示一个拼接符,会引起SQL注入,所以不建议使用 ${ }${ }接收输入参数,类型可以是简单类型,pojo,HashMap。

        如果接收的是简单类型,${ } 中只可以写成value。

        ${ } 接收 pojo 对象值,通过 OGNL 来读取对象中的属性值,通过属性.属性.属性...的方式获取对象属性值。    

      9.4:selectOne :表示查询出一条记录进行映射,一条记录也可以用 selectList 实现(查询出的 list 中只有一个对象)

      9.5:selectList :表示查询出一个列表(多条记录)进行映射,多条记录不可以用 selectOne

        如果查询结果是 List,我们使用 selectOne 报错:

        

  • 相关阅读:
    SQL大圣之路笔记——SQL 字段中英文字母如何区分大小写
    Python(二十五)
    Python(二十四)
    Python(二十二)
    Python(二十一)
    Python(二十)
    Python(十九)
    Python(十八)
    python(十七)
    python(十六)
  • 原文地址:https://www.cnblogs.com/xb1223/p/10193071.html
Copyright © 2020-2023  润新知