首页 > 代码库 > Mybatis入门案例

Mybatis入门案例

Mybatis入门程序

1. 创建java工程, 导入jar包

技术分享

其中:mybatis-3.2.7.jar为mybatis的主要jar包, 剩下的为一些依赖的jar包、日志记录的jar包和数据库驱动jar包

2.配置log4j日志记录文件

### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### direct messages to file hibernate.log ###
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=D:/hibernate.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### set log levels - for more verbose logging change ‘info‘ to ‘debug‘ ###

log4j.rootLogger=info, stdout

3. 配置Mybatis核心配置文件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="http://www.mamicode.com/com.mysql.jdbc.Driver" />
                <property name="url" value="http://www.mamicode.com/jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8" />
                <property name="username" value="http://www.mamicode.com/root" />
                <property name="password" value="http://www.mamicode.com/123" />
            </dataSource>
        </environment>
    </environments>


    <!-- 配置mapper映射文件 -->
    <mappers>
        <mapper resource="sqlmap/User.xml"/>
    </mappers>
</configuration>

4.配置pojo数据java类

package cn.rodge.entity;

import java.util.Date;

public class User {
    private int id;
    private String username;// 用户姓名
    private String sex;// 性别
    private Date birthday;// 生日
    private String address;// 地址
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public Date getBirthday() {
        return birthday;
    }
    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
}

5.配置实体类的映射文件

在根目录下,某个包内创建sql映射文件User.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="demo">
    <!-- 根据id获取用户信息
        parameterType:定义输入到sql中的映射类型,
        #{id}表示使用preparedstatement设置占位符号并将输入变量id传到sql。
        resultType:定义结果映射类型。    
     -->
    <select id="findUserById" parameterMap="int" resultMap="cn.rodge.entity.User">
        SELECT * from `user` where id = #{id}
    </select>
</mapper>

6.加载映射文件

在Mybatis核心配置文件sqlMapConfig.xml中添加映射文件的引用

    <!-- 配置mapper映射文件 -->
    <mappers>
        <mapper resource="sqlmap/User.xml"/>
    </mappers>

7.在User.xml中添加查询信息

    <!-- 根据id获取用户信息
        parameterType:定义输入到sql中的映射类型,
        #{id}表示使用preparedstatement设置占位符号并将输入变量id传到sql。
        resultType:定义结果映射类型。    
     -->
    <select id="findUserById" parameterMap="int" resultMap="cn.rodge.entity.User">
        SELECT * from `user` where id = #{id}
    </select>

注:如果parameterMap中的值是基本数据类型, 那么#{}中的变量名可以为任意值;

  如果parameterMap中的值是POJO,那么#{}中的变量名必须为POJO的属性名

8.创建java测试类

package cn.rodge.mybatis.firstDemo;

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.Test;

import cn.rodge.entity.User;

public class MybatisFirstDemo {
    
    @Test
    public void demo1 () throws IOException {
        //1创建sessionfactorybuilder对象
        SqlSessionFactoryBuilder factoryBuilder = new SqlSessionFactoryBuilder();
        //2获取核心配置文件输入流
        InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        //3加载核心配置文件,创建sessionfactory
        SqlSessionFactory sessionFactory = factoryBuilder.build(inputStream);
        //4创建sqlsession
        SqlSession sqlSession = sessionFactory.openSession();
        //5执行查询
        User user = sqlSession.selectOne("findUserById", 1);
        //6释放资源
        System.out.println(user);
        sqlSession.close();
    }
}

9. 代码抽取

 package cn.rodge.mybatis.firstDemo;

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 cn.rodge.entity.User;

public class MybatisFirstDemo {
    private SqlSessionFactory sessionFactory = null;
    @Before
    public void init () throws IOException {
        //1创建sessionfactorybuilder对象
        SqlSessionFactoryBuilder factoryBuilder = new SqlSessionFactoryBuilder();
        //2获取核心配置文件输入流
        InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        //3加载核心配置文件,创建sessionfactory
        sessionFactory = factoryBuilder.build(inputStream);
    }
    
    @Test
    public void findUserById () {
        //4创建sqlsession
        SqlSession sqlSession = sessionFactory.openSession();
        //5执行查询
        User user = sqlSession.selectOne("findUserById", 1);
        //6释放资源
        System.out.println(user);
        sqlSession.close();
    }
}

10.模糊查询

     <!-- 模糊查询
        ${}是用作字符串的拼接的
        如果parameterType的值为简单数据类型,那么${} 变量名必须为value
        如果parameterType的值为自定义POJO,那么${}的变量名必须为pojo的属性名
    -->
    <select id="findUserByName" parameterType="string" resultType="cn.rodge.entity.User">
        SELECT * FROM `user` where username LIKE ‘%${value}%‘
    </select>

注:${}存在sql注入的风险,而#{}不存在这种问题

    @Test
    public void findUserByName () {
        //获取sqlsession
        SqlSession sqlSession = sessionFactory.openSession();
        //调用sqlsession中的方法进行查询
        List<User> list = sqlSession.selectList("findUserByName", "张");
        //打印结果
        System.out.println(list);
        //释放资源
        sqlSession.close();
    }

11. #{}和${}

  #{}表示一个占位符号,通过#{}可以实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换,#{}可以有效防止sql注入。 #{}可以接收简单类型值或pojo属性值。 如果parameterType传输单个简单类型值,#{}括号中可以是value或其它名称。

  ${}表示拼接sql串,通过${}可以将parameterType 传入的内容拼接在sql中且不进行jdbc类型转换, ${}可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值,${}括号中只能是value。

12. parameterType和resultType

parameterType:指定输入参数类型,mybatis通过ognl从输入对象中获取参数值拼接在sql中。

resultType:指定输出结果类型,mybatis将sql查询结果的一行记录数据映射为resultType指定类型的对象。

13. 添加用户

user.xml中的配置

  <!-- 插入数据  -->
     <insert id="insertUser" parameterType="cn.rodge.entity.User">
         INSERT INTO user (username, birthday, sex, address) VALUES (#{username}, #{birthday}, #{sex}, #{address})
     </insert>

java代码

    @Test
    public void insertUser () {
        //获取sqlsession
        SqlSession sqlSession = sessionFactory.openSession();
        User user = new User();
        user.setUsername("小乔");
        user.setBirthday(new Date());
        user.setSex("2");
        user.setAddress("动物");
        //执行插入操作
        sqlSession.insert("insertUser", user );
        //提交事务
        sqlSession.commit();
        //释放资源
        sqlSession.close();
    }

14. 主键返回

 User.xml中配置参数

    <!-- 插入数据  -->
     <insert id="insertUser" parameterType="cn.rodge.entity.User">
         <!--
             主键返回
             keyProperty:返回的主键存储在pojo中的哪个属性
             resultType:返回的主键类型;
             order:BEFORE表示在插入之前查询主键(UUID)
                     AFTER表示在插入之后查询主键(主键自增长)
          -->
         <selectKey keyProperty="id" resultType="int" order="AFTER">
             SELECT LAST_INSERT_ID()
         </selectKey>
         INSERT INTO user (username, birthday, sex, address) VALUES (#{username}, #{birthday}, #{sex}, #{address})
     </insert>

 Java代码

    @Test
    public void insertUser () {
        //获取sqlsession
        SqlSession sqlSession = sessionFactory.openSession();
        User user = new User();
        user.setUsername("王昭君");
        user.setBirthday(new Date());
        user.setSex("2");
        user.setAddress("西安");
        //执行插入操作
        sqlSession.insert("insertUser", user );
        //打印插入的主键
        System.out.println(user.getId());
        //提交事务
        sqlSession.commit();
        //释放资源
        sqlSession.close();
    }

15.删除操作

      <!-- 删除数据 -->
     <delete id="deleteUser" parameterType="int">
         DELETE FROM user WHERE id = #{id}
     </delete>

 

     @Test
    public void deleteUser () {
        //获取sqlsession
        SqlSession sqlSession = sessionFactory.openSession();
        //执行删除
        sqlSession.delete("deleteUser", 40);
        //提交事物
        sqlSession.commit();
        //释放资源
        sqlSession.close();
    }

16. 更新操作

     <!-- 更新操作 -->
     <update id="updateUser" parameterType="cn.rodge.entity.User">
         UPDATE user SET username = #{username} WHERE id = #{id}
     </update>

 

    @Test
    public void updateUser () {
        //获取sqlsession
        SqlSession sqlSession = sessionFactory.openSession();
        //创建待跟新的数据
        User user = new User();
        user.setId(27);
        user.setUsername("张角");
        //更新操作
        sqlSession.update("updateUser", user );
        //提交事务
        sqlSession.commit();
        //释放资源
        sqlSession.close();
    }

Mybatis入门案例