mybatis(一)菜鸟日记 --day04 下

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包
相关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());
	}
}

未完待续。。。

猜你喜欢

转载自blog.csdn.net/qq_38325853/article/details/85108444