Mybatis入门案例
整合log4j
默认的mybatis不能打印出sql日志,不便于查看调试
在resources下导入log4j.properties这一部分大家可以网上查查,我也不知道有没有用,不是很懂,可以评论告诉我
我把我的代码放在下面(我也是copy的别人的)
# Set root category priority to INFO and its only appender to CONSOLE.
#log4j.rootCategory=INFO, CONSOLE debug info warn error fatal
log4j.rootCategory=debug, CONSOLE, LOGFILE
# Set the enterprise logger category to FATAL and its only appender to CONSOLE.
log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE
# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n
# LOGFILE is set to be a File appender using a PatternLayout.
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=d\:axis.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n
Main函数执行入门案例
在test文件夹下面创建一个MybatisTest.java哦
上一p说了不用写dao实现类了
步骤:
- 读取配置文件
- 创建SqlSessionFactory工厂
- 使用工厂生产SqlSession对象
- 使用SqlSession对象创建dao接口的代理对象
不改变源码的基础上对已有方法的增强(动态代理) - 使用代理对象执行方法
- 释放资源
步骤解释
第一步
有连接数据库的信息
in = Resources.getResourceAsStream("SqlMapConfig.xml");
第二步
有了工厂就可以操作生产对象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
/**有了工厂就可以操作生产对象*/
SqlSessionFactory factory = builder.build(in);
SqlSessionFactory是接口不能直接new,得找他的实现
Mybatis在创建工厂的时候把细节省略了,准备了一个SqlSessionFactoryBuilder的对象可以直接new。
就可以builder.build(in)构建工厂把流传进去
然后怎么解析文件怎么封装都和我们无关了,全部交给Mybatis。(我变强了再看源码吧)
第三步
session对象就可以操作数据库
sqlSession=factory.openSession();
第四步
不是直接操作而是用dao操作,但是我们只有dao接口,所以需要创建代理对象
userDao = sqlSession.getMapper(IUserDao.class);
session给我们创建的代理对象,用的getMapper传的自己的,根据这个生成代理对象,有了代理对象就说明方法已经增强过了,能实现功能了。
第五步
调用方法实现功能,这里是findAll
List<User> users =userDao.findAll();
for(User user: users){
System.out.println(user);//打印的功能
}
第六步
释放资源
session.close();
in.close();
优化!!!
可能很有疑惑你没一个方法都这样写 重复的步骤也太多了!!!!
可以这样
有个 @Before 和 @After的很给力
//搞个全局变量
private InputStream in;
private SqlSession sqlSession;
private IUserDao userDao;
@Before//用于在测试方法执行方法执行之前执行
public void init()throws Exception{
//1.读取配置文件 目的是将SqlMapConfig.xml的信息加载进去
in = Resources.getResourceAsStream("SqlMapConfig.xml");
/**链接数据库的信息*/
//2.创建SqlSessionFactory工厂
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
/**有了工厂就可以操作生产对象*/
SqlSessionFactory factory = builder.build(in);
//3.使用工厂生产SqlSession对象
// 只有Dao的接口没有具体功能的实现所以得想办法把实现加出来
sqlSession=factory.openSession();
/**这个对象就可以操作数据库(非直接,用dao操作)*/
//4.使用SqlSession创建Dao接口的代理对象
userDao = sqlSession.getMapper(IUserDao.class);
/**括号内的dao接口,我们只有dao接口所以要创建代理对象*/
}
@After//用于在方法执行之后执行
public void destory()throws Exception{
//提交事务
sqlSession.commit();
//6.释放资源
sqlSession.close();
in.close();
}
执行方法
/**
* 测试查询所有
*/
@Test
public void testFindAll(){
List<User> users =userDao.findAll();
for(User user: users){
System.out.println(user);//打印的功能
}
}
这样就好啦
其实在SqlMapConfig中采用注解的方式
<mappers>
<mapper class="com.bruce.dao.IUser"/>
</mappers>
我们下一Part再捋一捋
坚持就是胜利奥利给
(点个赞吧求求了)