Mybatis

使用Mybatis jar包
这里写图片描述

在web项目src资源文件夹下(或者,在src资源文件夹右键,选择source filter,资源文件夹),创建数据库配置文件,db.properties,数据库以Mysql为例

 //驱动程序实现类
jdbc.driver=com.mysql.jdbc.Driver
//要连接的数据库的地址  遵循协议://ip地址:端口号/数据库名?字符集
jdbc.url=jdbc:mysql://localhost:3306/videomgr?characterEncoding=utf-8
//数据库用户名
jdbc.username=root
//连接数据库密码
jdbc.password=root

创建SqlMapConfig.xml文件,文件位置同 db.properties

//文件头,一般固定,可通过导入文件得到,稍后有分享
<?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>

    <!-- 配置文件中的内容是有顺序的 -->
    <!-- 先引入,再使用 -->
    <!-- 引入db.properties文件,用于连接数据库 -->
    <properties resource="db.properties" />

    <!-- 起别名 -->
    <typeAliases>
         <!-- <typeAlias alias="video" type="com.jnmd.video.pojo.Video"></typeAlias> -->
         <!-- 别名的名字是类名只要不缺少一个字母均可   video VIDEO viDeo -->
         <package name="com.jnmd.video.pojo"></package> 
    </typeAliases>

    <!-- 和spring整合后 environments配置将废除 -->
    <environments default="development">
        <environment id="development">
            <!-- 使用jdbc事务管理 -->
            <transactionManager type="JDBC" />
            <!-- 数据库连接池 -->
            <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>


    <mappers>
      <!--  <mapper resource="Video.xml"/> -->
       <!-- <mapper resource="com/jnmd/video/mapper/VideoMapper.xml"/> -->
       <package name="com.jnmd.video.mapper"></package>
    </mappers>

</configuration>

创建测试类,实现用Mybatis连接数据库并查询数据库

public class TestVideo {
    SqlSessionFactory sqlSessionFactory;
    @Before
    public void init() throws Exception{
         // 1. 创建SqlSessionFactoryBuilder对象
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        // 2. 加载SqlMapConfig.xml配置文件
        InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
        // 3. 创建SqlSessionFactory对象
        sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
    }
    //通过id查询数据
    @Test
    public void testSelectVideoById() throws Exception{
                //在此处开始使用mybatis连接数据库并且查询数据库
                // 4. 创建SqlSession对象  SqlSession是非线程安全的,多个数据库操作,不能共用一个对象
                SqlSession sqlSession = sqlSessionFactory.openSession();
                // 5. 执行SqlSession对象执行查询,获取结果User
                // 第一个参数是Video.xml的statement的id,第二个参数是执行sql需要的参数;
                Object video = sqlSession.selectOne("test.queryVideoById", 1);
                // 6. 打印结果
                System.out.println(video);
                // 7. 释放资源
                sqlSession.close();
    }
    //通过title模糊查询
    //queryVideoByTitle
    @Test
    public void testSelectVideoLike() throws Exception{
                //在此处开始使用mybatis连接数据库并且查询数据库
                // 4. 创建SqlSession对象  SqlSession是非线程安全的,多个数据库操作,不能共用一个对象
                SqlSession sqlSession = sqlSessionFactory.openSession();
                // 5. 执行SqlSession对象执行查询,获取结果Video
                // 第一个参数是Video.xml的statement的id,第二个参数是执行sql需要的参数;
                List<Video> list = sqlSession.selectList("queryVideoByTitle", "%测试%");
                // 6. 打印结果
                System.out.println(list);
                // 7. 释放资源
                sqlSession.close();
    }
    //新增
    @Test
    public void testSaveVideo() throws Exception{   
                //在此处开始使用mybatis连接数据库并且查询数据库                
                // 4. 创建SqlSession对象  SqlSession是非线程安全的,多个数据库操作,不能共用一个对象
                SqlSession sqlSession = sqlSessionFactory.openSession();
                // 5. 执行SqlSession对象执行查询,获取结果Video
                // 第一个参数是Video.xml的statement的id,第二个参数是执行sql需要的参数;
                Video video =new Video();
                video.setCourseId(1);
                video.setTitle("忠文讲鬼故事");
                video.setDetail("讲的老搞笑呢");
                video.setPlayNum(0);
                sqlSession.insert("saveVideo2",video);
                // 6. 提交
                sqlSession.commit();  //记得提交  新增 修改 删除 均需要提交                
                System.out.println(video.getId()); //null 转变为 264 获取自增字段的id             
                // 7. 释放资源
                sqlSession.close();     
    }   
    //修改
        @Test
        public void testEditVideo() throws Exception{           
                    //在此处开始使用mybatis连接数据库并且查询数据库                    
                    // 4. 创建SqlSession对象  SqlSession是非线程安全的,多个数据库操作,不能共用一个对象
                    SqlSession sqlSession = sqlSessionFactory.openSession();
                    // 5. 执行SqlSession对象执行查询,获取结果Video
                    // 第一个参数是Video.xml的statement的id,第二个参数是执行sql需要的参数;
                    Video video =new Video();
                    video.setId(265);                   
                    video.setTitle("忠文讲鬼故事2222");
                    video.setDetail("讲的老搞笑呢33333");                 
                    sqlSession.update("updateVideoById",video);
                    // 6. 提交
                    sqlSession.commit();  //记得提交  新增修改删除均需要提交                   
                    // 7. 释放资源
                    sqlSession.close();     
        }   
        //删除
        @Test
        public void testDeleteVideo() throws Exception{         
                    //在此处开始使用mybatis连接数据库并且查询数据库                
                    // 4. 创建SqlSession对象  SqlSession是非线程安全的,多个数据库操作,不能共用一个对象
                    SqlSession sqlSession = sqlSessionFactory.openSession();
                    // 5. 执行SqlSession对象执行查询,获取结果Video
                    // 第一个参数是Video.xml的statement的id,第二个参数是执行sql需要的参数;       
                    sqlSession.delete("deleteVideoById",265);
                    // 6. 提交
                    sqlSession.commit();  //记得提交  新增修改删除均需要提交
                    // 7. 释放资源
                    sqlSession.close();
        }   
}

在使用Mybatis连接并使用数据库时,配合使用的Video.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">
<!-- namespace:命名空间,用于隔离sql,还有一个很重
要的作用,稍后分享 -->
<mapper namespace="test">
<!-- 通过id查询数据  paramerType入参类型 resultType 结果集类型(没有list  写成list里存放的类型) -->
  <select id="queryVideoById" parameterType="int" 
resultType="video" >  <!-- List<Video> -->
       select * from video where id=#{id}
  </select>

  <select id="queryVideoByTitle" parameterType="String" resultType="video" >  
  <!--List<Video> -->
       select * from video  where title  like "%"#{title}"
  </select>

  <!-- 新增 -->
  <insert id="saveVideo" parameterType="video" >
      insert into video (title,detail,time,spearker_id,course_id,play_num)
        values(#{title},#{detail},#{time},#{spearkerId},#{courseId},#{playNum})
  </insert>

  <insert id="saveVideo2" parameterType="video" >
  <!-- 主键自增长,插入的是增长后的 值 -->
      <selectKey keyColumn="id" keyProperty="id" order="AFTER" resultType="int">
        select LAST_INSERT_ID()
      </selectKey>
      insert into video (title,detail,time,spearker_id,course_id,play_num)
      values(#{title},#{detail},#{time},#{spearkerId},#{courseId},#{playNum})
  </insert>
  <!-- 更新 -->
  <update id="updateVideoById" parameterType="video" >
      update video set title=#{title},detail=#{detail} where id=#{id}
  </update>
  <!-- 删除 -->
  <delete id="deleteVideoById" parameterType="int">
      delete from video where id=#{id}
  </delete>
</mapper>

另一个模式,将工程合理分层,如在src下创建dao包,将查询方法的实现放到dao层,dao层有响应接口和实现类

接口 如下:

public interface VideoDao {
    //通过id查询Video
    public Video queryVideoById(int id);
    //增加
    public void saveVideo(Video video);
}

实现类 如下:

public class VideoDaoImpl implements VideoDao {
    private SqlSessionFactory sqlSessionFactory;
    // sqlSessionFactory的获得 来自utils包下的工具类 
    public VideoDaoImpl(SqlSessionFactory sqlSessionFactory){
        this.sqlSessionFactory=sqlSessionFactory;
    }
    @Override
    public Video queryVideoById(int id) {   
        SqlSession sqlSession = sqlSessionFactory.openSession();
        Video video = sqlSession.selectOne("test.queryVideoById", 1);
        sqlSession.close();
        return video;
    }
    @Override
    public void saveVideo(Video video) {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        sqlSession.insert("saveVideo",video);
        sqlSession.commit();  //记得提交  新增修改删除均需要提交
        sqlSession.close();
    }
}

工具类

如下:

public class DBUtils {
    private static SqlSessionFactory sqlSessionFactory;
    //写一个方法,能够获取到sqlSessionFactory
    //通过单例模式
    public static SqlSessionFactory getSqlSessionFactory(){
        //没有sqlSessionFactory,就创建
        if(null==sqlSessionFactory){
            SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
            InputStream inputStream;
            try {
                inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
                sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return sqlSessionFactory;   
            //有 sqlSessionFactory 就返回使用
        }else{
            return sqlSessionFactory;
        }           
    }
}

测试类,测试分层之后 Mybatis连接并查询数据库 的使用

public class TestDao {  
    //使用工具类得到
   /*SqlSessionFactory sqlSessionFactory;
    @Before
    public void init() throws Exception{
         // 1. 创建SqlSessionFactoryBuilder对象
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        // 2. 加载SqlMapConfig.xml配置文件
        InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
        // 3. 创建SqlSessionFactory对象
        sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);    
    }*/

    @Test
    public void testSelect(){
        VideoDao videoDao=new VideoDaoImpl(DBUtils.getSqlSessionFactory());
        Video video = videoDao.queryVideoById(1);
        System.out.println(video);
    }

    @Test
    public void testSave(){
        VideoDao videoDao=new VideoDaoImpl(DBUtils.getSqlSessionFactory());
        Video video =new Video();
        video.setCourseId(1);
        video.setTitle("lala");
        video.setDetail("题目");
        video.setPlayNum(0);    
        videoDao.saveVideo(video);
    }
}

终极模式,在src下创建mapper包,包里创建接口VideoMapper和同名VideoMapper.xml文件
接口 如下:

package com.jnmd.video.mapper;
import com.jnmd.video.pojo.Video;
public interface VideoMapper {
    public Video queryVideoById(int id);
    public void saveVideo(Video video);
}

.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">
<!-- namespace:命名空间,用于隔离sql,还有一个很重要的作用,后面分享 -->
<mapper namespace="com.jnmd.video.mapper.VideoMapper">
  <select id="queryVideoById" parameterType="int" resultType="video" >  <!-- List<Video> -->
       select * from video where id=#{id}
  </select>
  <insert id="saveVideo" parameterType="video" >
      insert into video(title,detail,time,spearker_id,course_id,play_num)
        values(#{title},#{detail},#{time},#{spearkerId},#{courseId},#{playNum})
  </insert>
</mapper>

创建测试类,测试该模式的使用:

public class TestMapper {
    @Test
    public void testSelect(){
        SqlSession sqlSession= DBUtils.getSqlSessionFactory().openSession();
        VideoMapper videoMapper = sqlSession.getMapper(VideoMapper.class);
        System.out.println(videoMapper.queryVideoById(1));
    }
    @Test
    public void testSave(){
        SqlSession sqlSession= DBUtils.getSqlSessionFactory().openSession();
        VideoMapper videoMapper = sqlSession.getMapper(VideoMapper.class);
        Video video =new Video();
        video.setCourseId(1);
        video.setTitle("title");
        video.setDetail("detail");
        video.setPlayNum(0);
        videoMapper.saveVideo(video);
        sqlSession.commit();//记得提交
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值
>