MyBatis笔记(一)——MyBatis介绍与入门程序

        /*   这段时间刚开始学习MyBatis,学习过程中有许多不理解和犯错的地方,希望能借助博客记录下来。  */

MyBatis是一款优秀的开源框架,用于持久层的设计开发中,MyBatis支持开发者编写特定的SQL语句,支持存储化过程(?)与高级映射(?)。MyBatis几乎避免了所有的JDBC代码和手动设置参数以及获取结果集。MyBatis通过XML设置配置和映射原生信息,将接口和POJOS映射成数据库中的记录。


注:一下所有内容在Java WebApplication中完成,没有涉及到Maven

(一)相关jar包导入

MyBatis的支持jar包:


相关工程架构:


(二)mybatis.cfg.xml与mysql.properties

在mysql.properties配置文件中,配置我们需要的数据库信息,在这里我使用的是mySql数据库


在mybatis.cfg.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="mysql.properties"/>
 <!-- 配置mybatis运行环境 -->
         <environments default="cybatis">
             <environment id="cybatis">
                <!-- type="JDBC" 代表使用JDBC的提交和回滚来管理事务 -->
                 <transactionManager type="JDBC" />

                 <!-- mybatis提供了3种数据源类型,分别是:POOLED,UNPOOLED,JNDI -->
                 <!-- POOLED 表示支持JDBC数据源连接池 -->
                 <!-- UNPOOLED 表示不支持数据源连接池 -->
                <!-- JNDI 表示支持外部数据源连接池 -->
                <dataSource type="POOLED">
                     <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>
</configuration>

配置完毕后,为了后续的操作,先在Mysql中新建一个数据表为t_user


(三)持久类与其Maper接口,映射文件

与数据库字段所对应,我们新建一个持久类

package ouc;

public class User {
    private int id;
    private String name;
    private int age;

    public int getId() {
        return id;
    }

    public User(){
    }

    public User(int id,String name,int age) {
        super();
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

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

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

为了管理方便,我们把maper类相关的类与文件都放在一个包下面,我们再创建UserMaper接口:

package maper;

import ouc.User;

public interface UserMaper {

    public int insertUser(User user) throws Exception;

    public void updateUser(User user,int id) throws Exception;

    public User findUser(int id) throws Exception;
}

最后创建持久类的映射配置文件:

<?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="maper.UserMaper">                                      <!--  不要忘记maper标签中的namespace属性!该属性是Maper接口!  -->
    <resultMap id="userMap" type="User">                                  <!-- 自定义返回集 id属性为返回集名称,type属性为返回集的原生对象-->
        <id property="id" column="id" javaType="int"/>                    <!-- 主键  -->
        <result property="name" column="name" javaType="String"/>         <!-- 属性名与数据表字段名对应 --> 
        <result property="age" column="age" javaType="int"/>
    </resultMap>                                                          <!-- id对应的名称必须要是唯一的 -->

    <insert id="insertUser" useGeneratedKeys="true" keyProperty="id">     <!-- 与Maper接口中的方法名对应 -->
        insert into t_user (id,username,age) values(#{id},#{name},#{age}) <!--  useGeneratedKeys:设置是否使用JDBC的useGeneratedKeys方法获取主键,并生成到keyProperty对应的字段中 -->
    </insert>                                                              <!-- #{}占位符 -->

    <update id="updateUser">
        update t_user set username=#{username},age=#{age} where id=#{id} 
    </update>

    <select id="findUser" parameterType="int" resultMap="userMap">      <!--  parameterType 参数类型 -->
        select * from t_user where id=#{id}
    </select>
</mapper>

在完成以上配置后,在mybatis.cfg.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="mysql.properties"/>
    <typeAliases>
        <package name="ouc"/>              <!--自动扫描-->
    </typeAliases>
        <!-- 配置mybatis运行环境 -->
         <environments default="cybatis">
             <environment id="cybatis">
                <!-- type="JDBC" 代表使用JDBC的提交和回滚来管理事务 -->
                 <transactionManager type="JDBC" />

                 <!-- mybatis提供了3种数据源类型,分别是:POOLED,UNPOOLED,JNDI -->
                 <!-- POOLED 表示支持JDBC数据源连接池 -->
                 <!-- UNPOOLED 表示不支持数据源连接池 -->
                <!-- JNDI 表示支持外部数据源连接池 -->
                <dataSource type="POOLED">
                     <property name="driver" value="com.mysql.jdbc.Driver" />
                   <property name="url" value="jdbc:mysql://localhost:3306/practice1" />
                     <property name="username" value="root" />
                     <property name="password" value="330324" />
                 </dataSource>
             </environment>
        </environments>
    <mappers>
        <package name="maper"/>                  <!--自动扫描-->
    </mappers>
</configuration>

(四)测试

在测试前,我们先写一个工具类,与hibernate相同,如果每次映射都要创建工厂的话,是非常非常消耗资源的,所以写这个类帮助我们减少资源的消耗。

package Tools;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.tools.ant.types.Resource;

import java.io.IOException;
import java.io.Reader;

public class DBtools {
    private static SqlSessionFactory sqlSessionFactory;

    static {
        try {
            Reader reader = Resources.getResourceAsReader("mybatis.cfg.xml");
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static SqlSession getSession(){
        return sqlSessionFactory.openSession();
    }
}

最后就是我们的测试了!

package Test;

import Tools.DBtools;
import maper.ClassMaper;
import maper.StudentMaper;
import maper.UserMaper;
import org.apache.ibatis.session.SqlSession;
import ouc.Class;
import ouc.Student;
import ouc.User;

public class test {

    public static void main(String agrs[]){
        User user = new User(10,"Lucy",18);
        SqlSession session = DBtools.getSession();
        UserMaper maper = session.getMapper(UserMaper.class);
        try {
            maper.insertUser(user);
            User Lucy = maper.findUser(10);
            System.out.print(Lucy);
            session.commit();
        } catch (Exception e) {
            e.printStackTrace();
            session.rollback();
        }
    }
}

让我们看下结果吧~

我这里只写了增与查,并没有写改与删,以及返回所有User的方法,但是原理是一样的。


猜你喜欢

转载自blog.csdn.net/lpckr94/article/details/79686854