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 报错:

 

    

 

posted @ 2018-12-29 14:13  花咖  阅读(178)  评论(0编辑  收藏  举报