使用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();//记得提交
}
}