MyBatis学习记录(一) 初始MyBatis

2017-11-19  本文已影响0人  叶绿素yls

最近想学习一下java web相关知识,于是就随便找了一个最近比较流行的一个持久层框架来学习,在实验楼学习的,感觉那个网站还是不错的,虽然很多课程需要会员,有在线的学习环境,但是我不想用,我还是比较喜欢本地练习。

什么是MyBatis呢?

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。

我对java也是刚刚入门的级别,所以里面的一些词语还是不太懂的,比如这个xml,我实验之后,给我的感觉它是一个配置文件,有点类似于json文件,然后POJO 我也不太清楚是什么东西。暂时先照葫芦画瓢把这个东西用起来。

准备条件

既然是根数据库有关的,那么肯定要装有数据库呀,我这里就是用的MySql,登录进去mysql -uroot -p 这里的-u 是说用户名,后面接的是用户名,然后-p表示需要密码,然后输入密码就可以登录到数据库啦。
然后新建一个mybatis测试用的数据库

create database mybatis;

然后新建一个表

create table user(
    id int primary key auto_increment,
    username varchar(20),
    password varchar(20),
    sex varchar(10),
    address varchar(20));

ok了,数据库的准备环境已经好了

然后就是MyBatis的环境了,首先下载MyBatis的包,去github下载就可以了,然后还需要一个连接mysql的java驱动包,去mysql的官网下载mysql-connector就可以了,接下来用你的ide,我比较喜欢idea,因为不喜欢eclipse的代码提示功能,创建一个web project,然后把这两个包加上一个mybatis目录lib里面的log4j-1.2.17.jar包 复制到web的lib(没有的话自己创建)目录下,然后再Project Structure 里面modules 的dependencis里面加入这个路径就行了。
然后基础的包都准备完毕。

然后就开始mybatis的配置了,在src目录下新建一个mybatis.cfg.xml文件,往里面填写

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <typeAliases>
        <package name="com.shiyanlou.mybatis.model" />
    </typeAliases>

    <!-- 配置mybatis运行环境 -->
    <environments default="development">
        <environment id="development">
            <!-- type="JDBC" 代表直接使用 JDBC 的提交和回滚设置 -->
            <transactionManager type="JDBC" />

            <!-- POOLED 表示支持JDBC数据源连接池 -->
            <!-- 数据库连接池,由 Mybatis 管理,数据库名是 mybatis,MySQL 用户名 root,密码为空 -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis" />
                <property name="username" value="root" />
                <property name="password" value="13198547" />
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <package name="com/shiyanlou/mybatis/mapper" />
    </mappers>
</configuration>

这个配置文件我也是复制教程上的,我想如果以后自己要写一个项目的话,没有这个东西怎么办呀,先不管这么多,看看这个文件里面干了什么。

其实注释已经写的很清楚了,这里的JDBC我也不是太清楚到底是什么东西,大概也是用于控制数据库的东西。
这里面有个东西值得我们注意,就是dataSource这个里面的东西,可以看到里面写到了连接数据库的用户名和密码,用的时候注意改。

然后这里还有两个没有注释的就是 typeAliases 和 mappers 等会说。

配置完成之后,我们需要建立一个java类,和我们数据库中的表格来一个完全一致的对应关心,就是类的属性和表格的字段最好一样。

package com.shiyanlou.mybatis.model;

public class User {
    private Integer id;
    private String username;
    private String password;
    private String sex;
    private String address;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    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 getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}

然后需要写一个你想要有哪些方法来操作数据库的一个接口,这里就是一个创建记录的方法,更新记录的方法,删除记录的方法,查询记录(根据id和所有)的方法,一共有五个方法,所以接口这么写:

package com.shiyanlou.mybatis.mapper;

import com.shiyanlou.mybatis.model.User;

import java.util.List;

public interface UserMapper {

    /*
    * 新增用户
    * @param user
    * @return
    * @throws Exception*/
    public int insertUser(User user) throws Exception;



    public int updateUser(User user) throws Exception;


    /*
    * 删除用户
    * @param id
    * @return
    * @throws Exception*/
    public int deleteUser(Integer id) throws Exception;


    /*
    * 根据id查询用户
    * @param id
    * @return
    * @throws Exception*/
    public User selectUserById(Integer id) throws Exception;


    /*
    * 查询所有用户
    * @return
    * @throws Exception*/
    public List<User> selectAllUser() throws Exception;

}

注意看最开头的package哦,它是这个接口所在的包,之后会用到。

然后接口完成之后,我们需要一个映射配置文件,在这个接口文件的包下,建立一个xml配置文件,用来配置具体的sql语句的实现(包括参数,返回类型)。
如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org/DTD Mapper 3.0" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.shiyanlou.mybatis.mapper.UserMapper">
    <!-- 自定义返回结果集 -->
    <resultMap id="userMap" type="User">
        <id property="id" column="id" javaType="int"></id>
        <result property="username" column="username" javaType="String"></result>
        <result property="password" column="password" javaType="String"></result>
        <result property="sex" column="sex" javaType="String"></result>
        <result property="address" column="address" javaType="String"></result>
    </resultMap>

    <!-- 定义 SQL 语句,其中 id 需要和接口中的方法名一致 -->
    <!-- useGeneratedKeys:实现自动生成主键 -->
    <!-- keyProperty: 唯一标记一个属性 -->
    <!-- parameterType 指明查询时使用的参数类型,resultType 指明查询返回的结果集类型 -->
    <insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
        insert into user (username,password,sex,address) values
        (#{username},#{password},#{sex},#{address})
    </insert>

    <update id="updateUser"  parameterType="User">
        update user set
        address=#{address} where
        id=#{id}
    </update>

    <delete id="deleteUser" parameterType="int">
        delete from user where
        id=#{id}
    </delete>

    <!-- 如未为 Java Bean 起类别名,resultType="com.shiyanlou.mybatis.model.User" -->

    <!-- 使用resultType时,一定要保证,你属性名与字段名相同;如果不相同,就使用resultMap -->
    <select id="selectUserById" parameterType="int" resultType="User">
        select * from user where id=#{id}
    </select>

    <select id="selectAllUser" resultMap="userMap">
        select * from user
    </select>

</mapper>

我们看到那个一开始mapper 有个namespace 它的值就是接口文件的位置,这个配置文件非常关键(个人感觉),其中开头配置了一个自定义的返回结果类型,就是userMap,在selectAllUser中用到了这个类型,目前还没有看懂为什么要用到resultMap而不继续用resultType,然后这个配置文件继续定义了各种数据库操作的sql语句,可以看到这个里面的updateUser其实是只更新了address,有缺陷,可以完善一下。这个东西弄好了以后,我们要在mybatis的配置文件中设置一下,也就是之前我说以后说的那个部分,在mybatis.cfg.xml中添加:

<mappers>
    <!-- 通过 mapper 接口包加载整个包的映射文件 -->
    <package name="com/shiyanlou/mybatis/mapper" />
</mappers>

以及为我们的javabean起一个别名,在文件中添加

<typeAliases>

<package name="com.shiyanlou.mybatis.model" />
</typeAliases>

正是因为我们添加这个东西,所以我们在写那个UserMapper.xml配置文件的时候,就可以直接用User这个类,而不需要写完整的包路径。

然后我们添加一个记录日志,在src目录下新建一个mybatis的目录文件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

我们再写一个测试文件,用户测试我们的之前写的所有东西是否正确。

我们创建一个UserTest类来进行测试。

package com.shiyanlou.mybatis.test;

import com.shiyanlou.mybatis.mapper.UserMapper;
import com.shiyanlou.mybatis.model.User;
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 java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class UserTest {


    private static SqlSessionFactory sqlSessionFactory;


    public static void main(String[] args) {
        // mybatis 配置文件路径
        String resource = "mybatis.cfg.xml";

        //得到配置流文件
        InputStream inputStream = null;
        try{
            inputStream = Resources.getResourceAsStream(resource);
        }catch (IOException e){
            e.printStackTrace();
        }

        //创建会话工厂,传入MyBatis 的配置文件信息
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        //insertUser();
        updateUser();
        //selectUserById();
        //selectAllUser();
        //deleteUser();
    }

    // 新增用户
    private static void insertUser(){
        // 通过工厂得到SqlSession
        SqlSession session = sqlSessionFactory.openSession();

        UserMapper mapper = session.getMapper(UserMapper.class);

        User user = new User();

        user.setUsername("John");
        user.setPassword("123456");
        user.setSex("male");
        user.setAddress("beijing");
        try {
            mapper.insertUser(user);
            session.commit();
        } catch (Exception e) {
            e.printStackTrace();
            session.rollback();
        }

        session.close();
    }

    // 更新用户
    private static void updateUser(){
        SqlSession session = sqlSessionFactory.openSession();

        UserMapper mapper = session.getMapper(UserMapper.class);

        User user = null;

        try {
            user = mapper.selectUserById(1);
        }catch (Exception e){
            e.printStackTrace();
        }

        System.out.println(user.getId()+" "+user.getUsername()+" "+user.getPassword()+" "+user.getAddress());
        user.setUsername("MiaoMiao");

        try{
            mapper.updateUser(user);
            session.commit();
        } catch (Exception e) {
            e.printStackTrace();
            session.rollback();
        }

        session.close();
    }


    // 根据id删除用户
    private static void deleteUser(){
        SqlSession session = sqlSessionFactory.openSession();

        UserMapper mapper = session.getMapper(UserMapper.class);

        try {
            mapper.deleteUser(3);
            session.commit();
        } catch (Exception e) {
            e.printStackTrace();
            session.rollback();
        }

        session.close();
    }

    // 根据id查找用户
    private static void selectUserById(){
        SqlSession session = sqlSessionFactory.openSession();

        UserMapper mapper = session.getMapper(UserMapper.class);

        try{
            User user = mapper.selectUserById(1);
            session.commit();
            System.out.println(user.getId()+" "+user.getUsername()+" "+user.getPassword()+" "+user.getAddress());
        }catch (Exception e){
            e.printStackTrace();
            session.rollback();
        }

        session.close();

    }

    private static void selectAllUser(){
        SqlSession session = sqlSessionFactory.openSession();

        UserMapper mapper = session.getMapper(UserMapper.class);

        try {
            List<User> userList = mapper.selectAllUser();
            session.commit();
            for (User user : userList){
                System.out.println(user.getId()+" "+user.getUsername()+" "+user.getPassword()+" "+user.getAddress());
            }
        } catch (Exception e) {
            e.printStackTrace();
            session.rollback();
        }
        session.close();
    }
}

同样注意包的名字,这个文件就比较好懂,里面配置了mybatis的配置文件,然后就可以根据这个东西创建一个SqlSessionFactory 来创建SqlSession了,然后就是基本的操作了。
最后我们就是一个一个方法进行测试就可以了。

上一篇下一篇

猜你喜欢

热点阅读