今日完成的Mybatis的入门学习,现进行总结。现提供完整测试代码,初学者可以进行测试学习。主要知识内容包括配置文件/映射文件的编写/日志文件的编写、sqlsession的使用以及封装成工具类。
1、它是基于Java的持久层框架,内部封装了JDBC,简单点就是用来执行sql语句与数据库进行交互的框架。
2、 与Hibernate的区别是,Mybatis还是要写sql语句,Hibernate封装的更加全面,不需要写sql语句
1、工程路径图:
2、写mapper文件
mapper文件的作用是程序用以查找具体执行的sql语句:
值得注意的是:
A、#{name},#{age},#{sore} 这个写法,后面讲到DAO层的时候会提。
B、namespace是命名空间,用来限定范围的:它有两个知识点:
1)后面开发,一般一个Dao对应一个mapper,在这种情况下,我们的insert语句的id可能出现重复,这个时候就可以
通过 使用namespace.id来限定是那个mapper文件的操作
2)通过限定namespace可以设定日志文件显示的内容
insert into student(sname,age,score) value(#{name},#{age},#{sore})
3、Mybatis配置文件
这里要说的点比较多:
3.1 映射文件的注册(没什么好讲的)
3.2 运行环境的配置
1)environmentals下可以配置多个environment,通过Id来进行选择,这里我们使用默认的JDBC的mysql环境
2)datasource用来选择数据连接池。作用是存放连接数据库的连接。因为每一次连接到数据库是件非常耗时的
事件,增加一个连接池,用来存放连接对象,它可以接受发送连接请求,也可以回收连接进行保存。数据
连接池有很多参数,包括最大,最小缓存等等,我们后台的调优,有一部就是这些参数的选择。
另外:这里我们使用Mybatis默认的连接池,后续我们会使用到c3p0/dbcp等数据池
3)数据库连接四要素,采用properties文件进行配置,采用${}方式进行获取
Mybatis.xml文件:
mysql.properties文件代码:
################################
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost/bjpowernode?serverTimezone=GMT%2B8
jdbc.username=root
jdbc.password=123
4、Dao层测试代码:
A 这里我们把获取sqlsession方法提取出来,封装成一个类在utils.myUtils文件中。
B sqlsession.insert("insertStudent", student);这里的第二个参数,是一个Student对象,因此我们在Mapper文件中的sql语句
采用获取的方式,进行编写
package dao;
import org.apache.ibatis.session.SqlSession;
import beans.Student;
import utils.myUtils;
public class IStudentDaoImpl implements IStudentDao {
private SqlSession sqlsession;
@Override
public void insertStu(Student student) {
// TODO Auto-generated method stub
try {
sqlsession = myUtils.getsqlsession();
//具体操作代码
sqlsession.insert("insertStudent", student);
//提交数据代码
sqlsession.commit();
}
finally {
if(sqlsession!=null) {
sqlsession.close();
}
}
}
}
myUtils.java文件代码:
这里我们使用了单例模式,因为考虑到创建factory耗时很长,因此就让他在初始化的时候,就创建好一个对象,并且每次
使用的是同一个对象。当然这样是线程不安全的,因为当我进行数据操作的时候,其他线程用的是同一个factory对象,他
会读取到我数据,类似mysql的dirtyread。具体情况具体使用。
package utils;
import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class myUtils {
private static SqlSessionFactory sqlsessionfactory;
private myUtils() {};
public static SqlSession getsqlsession() {
InputStream inputstream;
try {
//获取Mybatis容器内容
inputstream = Resources.getResourceAsStream("myBatis.xml");
if (sqlsessionfactory == null) {
//新建一个factory,他的作用用来生产sqlSeesion
sqlsessionfactory = new SqlSessionFactoryBuilder().build(inputstream);
}
//使用factory的open方法创建一个sqlSeesion
SqlSession sqlsession = sqlsessionfactory.openSession();
return sqlsession;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
5、日志文件
添加一个日志文件:
注意到最后一句:log4j.logger.test 这个test就是我们的命名空间,最后他之显现和test有关的日志信息到控制台console
### \u8F93\u51FA\u5230\u63A7\u5236\u53F0 ###
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.consoleTarget = System.out
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern =[%5-5p][%d{yyyy-MM-dd HH:mm:ss}] %c %L %m%n //格式信息
### set log levels ###
//debug输出到控制台
//test是我们mapper的命名空间,一下设置可以使得只输出有关test的信息
log4j.logger.test = debug,console
6 附上其他代码:
Student:
package beans;
public class Student {
private Integer id;
private String name;
private int age;
private double sore;
public Student(String name, int age, double sore) {
super();
this.name = name;
this.age = age;
this.sore = sore;
}
public Student() {
super();
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public double getSore() {
return sore;
}
public void setSore(double sore) {
this.sore = sore;
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + ", age=" + age + ", sore=" + sore + "]";
}
}
mytest文件:
package test;
import org.junit.Before;
import org.junit.Test;
import beans.Student;
import dao.IStudentDao;
import dao.IStudentDaoImpl;
public class myTest {
private IStudentDao sdao;
@Before
public void before() {
sdao = new IStudentDaoImpl();
}
@Test
public void test1() {
Student student = new Student("张si",23,93.2);
sdao.insertStu(student);
}
}
MYSQL数据库创建一张表:
use bjpowernode;
drop table if EXISTS student;
CREATE table student(
id INT(12) PRIMARY KEY auto_increment,
sname VARCHAR(32),
age INT(12),
score INT(12)
)