MyBatis学习(一)

概述

MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。

使用

资源

用法

这里通过对t_user数据库查询为例
在这里插入图片描述
实体类User.java

public class User {
    private String uid;
    private String uname;
    private int uage;
    private String usex;


    public String getUid() {
        return uid;
    }

    public void setUid(String uid) {
        this.uid = uid;
    }

    public String getUname() {
        return uname;
    }

    public void setUname(String uname) {
        this.uname = uname;
    }

    public int getUage() {
        return uage;
    }

    public void setUage(int uage) {
        this.uage = uage;
    }

    public String getUsex() {
        return usex;
    }

    public void setUsex(String usex) {
        this.usex = usex;
    }

    @Override
    public String toString() {
        return "User{" +
                "uid='" + uid + '\'' +
                ", uname='" + uname + '\'' +
                ", uage=" + uage +
                ", usex='" + usex + '\'' +
                '}';
    }
}

配置文件

  1. 全局配置文件:mybatis-config.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>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <!--数据库连接的四大参数-->
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/sql_test"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <!--实体类对应的数据库xml文件-->
        <mapper resource="sqlmap/User.xml"/>
    </mappers>
</configuration>
  1. 实体类对应的xml文件: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="cn.edu.stu">

    <!--
        id:findUserById sql语句对应的标识id.
        parameterType: 参数类型
        resultType:sql语句执行后返回值类型
    -->
    <select id="findUserById" parameterType="String" resultType="cn.edu.stu.po.User">
        select * from t_User where uid = #{value}
    </select>

    <select id="findUserByName" parameterType="String" resultType="cn.edu.stu.po.User">
        select * from t_User where uname like '%${value}%'
    </select>

    <insert id="insertUser" parameterType="cn.edu.stu.po.User">
        <!--mysql主键不自增:通过调用MySQL自带的uuid()函数,自动生成一个uuid,并在插入之前生成,然后存入到uid中
		mysql主键自增:使用select LAST_INSERT_ID()在插入语句后查询自增主键值。
		 <selectKey keyProperty="uid" order="AFTER" resultType="java.lang.String">
            select LAST_INSERT_ID()
        </selectKey>
		-->
        <selectKey keyProperty="uid" order="BEFORE" resultType="java.lang.String">
            select uuid()
        </selectKey>
        insert into t_user values (#{uid},#{uname},#{uage},#{usex})
    </insert>

    <delete id="deleteUserById" parameterType="java.lang.String">
        delete from t_user where uid=#{uid}
    </delete>

    <update id="updateUserById" parameterType="cn.edu.stu.po.User">
        update t_user set uname=#{uname},uage=#{uage},usex=#{usex} where uid=#{uid}
    </update>
</mapper>

实体类映射数据库操作的文件,包含增,删,改,查。

  • #{}:占位符。如果是简单类型(例如:int,String 等)可以使用value或任意字符作为变量名;如果是实体类类型,可以通过OGNL读取对象中的属性值:通过属性.属性.属性等
    在这里插入图片描述
    对于图片上的例子,String和int类型,可以直接#{value}或#{uid等};如果是一个User对象:要使用对象zhangsanuname属性:#{zhangsan.uname}

  • ${}: 表示一个sql拼接符号,例如上面xml中使用的 ‘%&{value}%’ 在模糊查询中有所应用。如果接收的是简单类型,变量名只能是value;如果接受的是对象类型,一样可以使用属性.属性方式。

核心类或接口

  • SqlSessionFactory(接口):Sql会话工厂,用来产生session对象
  • SqlSessionFactoryBuilder(类):调用自身的build()方法得到工厂
  • SqlSession(接口):调用自身的方法,对数据库进行操作

测试代码

@Test
    public void findUserById() throws IOException {

        //得到mybatis全局配置文件
        String resource="mybatis-config.xml";

        //得到配置文件流
        InputStream resourceAsStream = Resources.getResourceAsStream(resource);

        //创建工厂
        SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(resourceAsStream);

        //得到session
        SqlSession sqlSession = factory.openSession();

        /**
         * 调用session的查询方法
         * 参数1:User映射xml中命名空间名+sql语句id
         */

        User user = sqlSession.selectOne("cn.edu.stu.findUserById", "2019041701");

        System.out.println(user);
        //释放回话
        sqlSession.close();
    }

Mybatis中dao开发

原始dao开发

需要实现dao接口和dao实现类
用户管理接口:UserDao.java

public interface UserDao {

    //根据用户id查询用户
    public User findUserById(String uid) throws Exception;
    //根据用户id删除用户
    public void deleteUserById(String uid) throws Exception;
    //插入用户
    public void insertUser(User user) throws Exception;
    //根据用户id更新
    public void updateUserById(User user) throws Exception;
}

用户管理实现类:UserDaoImpl.java

/**
 * 因为sqlsession是线程不安全的,需要在每个方法中单独创建使用
 */
public class UserDaoImpl implements UserDao{

    private SqlSessionFactory factory;
    //通过构造函数,注入工厂实例
    public UserDaoImpl(SqlSessionFactory factory){
        this.factory=factory;
    }


    @Override
    public User findUserById(String uid) throws Exception {
        //得到session对象
        SqlSession session=factory.openSession();
        //单行查询
        User user=session.selectOne("cn.edu.stu.findUserById",uid);
        //释放session
        session.close();
        return user;
    }

    @Override
    public void deleteUserById(String uid) throws Exception {
        //得到session对象
        SqlSession session=factory.openSession();
        //删除
        session.delete("cn.edu.stu.deleteUserById",uid);

        //提交
        session.commit();
        //释放session
        session.close();
    }

    @Override
    public void insertUser(User user) throws Exception {
        //得到session对象
        SqlSession session=factory.openSession();
        //删除
        session.insert("cn.edu.stu.insertUser",user);

        //提交
        session.commit();
        //释放session
        session.close();
    }

    @Override
    public void updateUserById(User user) throws Exception {
        //得到session对象
        SqlSession session=factory.openSession();
        //删除
        session.update("cn.edu.stu.updateUserById",user);

        //提交
        session.commit();
        //释放session
        session.close();
    }
}

方法测试

@Test
    public void DAOTest() throws Exception {
        //得到mybatis全局配置文件
        String resource="mybatis-config.xml";

        //得到配置文件流
        InputStream resourceAsStream = Resources.getResourceAsStream(resource);

        //创建工厂
        SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(resourceAsStream);
        
        UserDao dao=new UserDaoImpl(factory);

        User user =dao.findUserById("2019041703");
        System.out.println(user);
    }

mapper代理方式

使用mapper代理,我们只需要写mapper接口(例如dao接口)。但是需要满足一些规范

  • mapper映射xml(对应原始dao开发中的User.xml)的命名空间namespace需要等于mapper接口类路径
<mapper namespace="cn.edu.stu.mapper.UserMapper">
  • mapper接口中的方法名和mapper映射xml中sql语句的id一致
  • mapper接口中的方法的参数和返回值需要和mapper映射xml中参数和返回值对应一致

具体实现

mapper映射文件:UserMapper.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="cn.edu.stu.mapper.UserMapper">

    <select id="findUserById" parameterType="String" resultType="cn.edu.stu.po.User">
        select * from t_User where uid = #{value}
    </select>
    <insert id="insertUser" parameterType="cn.edu.stu.po.User">
        /*通过调用MySQL自带的uuid()函数,自动生成一个uuid,并在插入之前生成,然后存入到uid中*/
        <selectKey keyProperty="uid" order="BEFORE" resultType="java.lang.String">
            select uuid()
        </selectKey>
        insert into t_user values (#{uid},#{uname},#{uage},#{usex})
    </insert>

    <delete id="deleteUserById" parameterType="java.lang.String">
        delete from t_user where uid=#{uid}
    </delete>

    <update id="updateUserById" parameterType="cn.edu.stu.po.User">
        update t_user set uname=#{uname},uage=#{uage},usex=#{usex} where uid=#{uid}
    </update>
</mapper>

在全局配置文件中添加UserMapper.xml的引用

	<mappers>
        <mapper resource="sqlmap/User.xml"/>
        <!--添加-->
        <mapper resource="mapper/UserMapper.xml"/>
    </mappers>

mapper接口UserMapper.java

public interface UserMapper {

    //根据用户id查询用户
    public User findUserById(String uid) throws Exception;
    //根据用户id删除用户
    public void deleteUserById(String uid) throws Exception;
    //插入用户
    public void insertUser(User user) throws Exception;
    //根据用户id更新
    public void updateUserById(User user) throws Exception;
}

测试

@Test
    public void MapperTest() throws Exception {
        //得到mybatis全局配置文件
        String resource="mybatis-config.xml";

        //得到配置文件流
        InputStream resourceAsStream = Resources.getResourceAsStream(resource);

        //创建工厂
        SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(resourceAsStream);
		//获得session
        SqlSession session=factory.openSession();
		//通过session得到mapper接口中的类
        UserMapper mapper = session.getMapper(UserMapper.class);
		//调用mapper中的方法
        User user = mapper.findUserById("2019041705");
        System.out.println(user);
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值