Mybatis (一)菜鸟日记–day04 下
一、简述
1.Mybatis 特点
mybatis是java的持久层框架。
1)和原生态jdbc操作数据库相比,减少了硬编码。
2)和原生态jdbc操作相比,减少了频繁的开启和关闭连接,节省数据库资源。
3)sql语句编写在配置文件中,受到开发人员控制,修改查询条件不需要去修改代码。
4)通过输入输出映射将数据库操作和java对象进行关联。
2.Mybatis 操作数据库具体过程
1)通过配置文件SqlMapConfig.xml 创建sqlSessionFactory(会话工厂)
2)Session(会话)通过执行器来操作数据库。
执行器下面还有一层底层封装对象(statement) 主要实现对数据库操作存储封装:输入输出参数类型和sql语句
输入输出类型可以简单类型,自定义类型,以及hashMap类型。
最后数据库得到命令最终执行语句。
二、简单Mybatis框架使用
1.环境配置
jar包:主要有mybatis工具包以及mybatis的依赖包,日志处理相关jar包,数据库驱动包。
SqlMapConfig.xml 文件 mybatis核心框架配置
log4j.properties 打印日志的相关配置。可以在控制台看见mybaits最终生成的语句。
记得有次浏览器请求页面没有响应,到service层中一行查找记录就没有响应,也不报错。找了半天没找到解决办法,
当时调试过程中显示的是Mapper代理对象(Spring自动装配)为空,死活不知道为啥,后来想起来忘记加上log4j.properties文件,发现是数据库版本问题!!!!!第一步就错了。。重新安装个低版本数据库后程序就能正常运行了,不过Spring自动装配的对象为啥是null 一直没搞懂。连续几次出现这个问题,代码什么都没改,第二天突然就好了。。也是绝望
相关jar包
SqlMapConfig.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>
</configuration>
log4j.properties
log4j.properties 开发环境下相关配置
log4j.rootLogger=DEBUG,stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
2.最简单的mybatis应用程序
1)创建数据库,创建表,创建对应的实体类。
不对,一定是哪里出了问题,这是我的日记啊,记这没用的干嘛
2)建立Mapper.xml文件
<!--命名空间 作用1:分隔(跟包作用差不多) 作用2:mapper代理开发的时候用来和接口名做匹配-->
<mapper namespace="test">
<!-- 在映射文件中配置多条sql语句 -->
<!-- id用来标识映射文件中的sql 称为statementId select 里面封装了sql语句输入输出映射 -->
<select id="findTbUserById" parameterType="long"
resultType="com.test.mybatis.pojo.TbUser">
<!--填入id id表示接收输入的参数,输入的参数名就是id 如果输入参数是简单类型,那么输入的参数名可以任意 resultType 指定查询结果所映射的java对象 -->
select * from tb_user where id=#{id}
</select>
</mappper>
resultType是查询出来的单个结果的映射对象,查询多个结果的和查询单个结果返回值相同
3)映射文件加载
<mappers>
<!-- resource单个映射文件加载 -->
<mapper resource="sqlmap/TbUser.xml" />
</mappers>
4)查询结果
String resource="SqlMapConfig.xml";
InputStream inputStream=Resources.getResourceAsStream(resource);;
//创建会话工厂,传入mybatis的配置文件信息
SqlSessionFactory sessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
//通过工厂得到SqlSession
SqlSession sqlSession=sessionFactory.openSession();
//操作数据库,使用最简单的selectOne()
// param1: 命名空间+"."+sqlId(statementId);param2:指定和映射文件中//parameterType匹配的参数
long id=7;
TbUser tbUser= sqlSession.selectOne("test.findTbUserById",id);
System.out.println(tbUser.getUsername());
//释放资源
sqlSession.close();
selectOne和selectList:sql语句返回一条2种方法都可以使用。当sql语句返回多条结果用selectOne就会报错
相当于一个小袋子(selectOne)只能装一个苹果,装的多久会炸,大袋子(selectList)能装一堆苹果装一个啥问题没有
代理开发时,selectOne/List 通过返回值来判断 返回值是单个对象自动使用selectOne
3.传统开发方法
1)接口
public interface TbUserDao {
public TbUser findTbUserById(long in) throws Exception;//抛出异常提高系统健壮性
}
2)实体类
public class TbUserDaoImpl implements TbUserDao {
//向dao中注入sqlSessionFactory
//构造方法注入
private SqlSessionFactory sqlSessionFactory;
public TbUserDaoImpl(SqlSessionFactory sqlsessionFactory) {
this.sqlSessionFactory=sqlsessionFactory;
}
@Override
public TbUser findTbUserById(long in) throws Exception {
// TODO 自动生成的方法存根
SqlSession sqlSession=this.sqlSessionFactory.openSession();
TbUser tbUser= sqlSession.selectOne("test.findTbUserById",in) ;
sqlSession.close();
return tbUser;
}
}
3)测试
public class TbUserDaoImplTest {
private SqlSessionFactory sqlSessionFactory;
@Before
public void setUp() throws Exception {
//在方法执行前进行 创建sqlSessionFactory
String resource="SqlMapConfig.xml";
InputStream inputStream=Resources.getResourceAsStream(resource);;
sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void testFindTbUserByid() throws Exception {
TbUserDao tbUserDao=new TbUserDaoImpl(sqlSessionFactory);
TbUser tbUser= tbUserDao.findTbUserById((long)123);
System.out.println(tbUser);
}
}
4.mapper代理模式
1)mapper代理开发规则
1.接口名和mapper文件namespeace对应
2.方法名和statementId对应 配置的sql语句id
3.输入输出参数和接口方法的参数和返回值相对应
2)接口不变,调用该表
public class TbUserMapperTest {
private SqlSessionFactory sqlSessionFactory;
@Before
public void setUp() throws Exception {
//在方法执行前进行 创建sqlSessionFactory
String resource="SqlMapConfig.xml";
InputStream inputStream=Resources.getResourceAsStream(resource);;
sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void testFindTbUserById() throws Exception {
SqlSession sqlSession=this.sqlSessionFactory.openSession();
//new TbUserMapper对象 mybatis自动生成
TbUserMapper tbUserMapper=sqlSession.getMapper(TbUserMapper.class);
//调用方法
TbUser user= tbUserMapper.findTbUserById((long)123);
System.out.println(user.getUsername());
}
}
未完待续。。。