第一個MyBatis程序
一、基本程序
需求:實現將student信息寫入到DB中
1.定義實體類:
public class Student {
private Integer id;
private String name;
private int age;
private double score;
//無參、帶參構造器
//getter、setter
//toString()
}
2.定義Dao接口:
public interface IStudentDao {
void insertStu(Student student);
}
3.定義映射文件(mapper.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">
<mapper namespace="test" parameterType="com.hcx.beans.Student">
<insert id="insertStudent" parameterType="com.hcx.beans.Student">
insert into student(name,age,score)
values(#{name},#{age},#{score})
</insert>
</mapper>
注意:#{}中寫入的是student類的屬性名。
對于parameterType屬性,框架會自動根據用戶執行的Sqlsession方法中的參數自動檢測到,所以一般我們不用指定parameterType屬性。
4.定義主配置文件(mybatis.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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!-- 注冊映射文件 -->
<mappers>
<mapper resource="com/hcx/dao/mapper.xml"/>
</mappers>
</configuration>
5.定義dao實現類
public class StudentDaoImpl implements IStudentDao {
private SqlSession sqlSession;
@Override
public void insertStu(Student student) {
try {
//讀取主配置文件
InputStream inputStream = Resources.getResourceAsStream("mybatis.xml");
//創建SqlSessionFactory對象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//創建sqlsession對象
sqlSession = sqlSessionFactory.openSession();
//操作
sqlSession.insert("insertStudent",student);
//Sqlsession提交
sqlSession.commit();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
if(sqlSession!=null){
sqlSession.close();
}
}
}
}
6.測試
public class MyTest {
private IStudentDao dao;
@Before
public void before(){
dao = new StudentDaoImpl();
}
@Test
public void testInsert(){
Student student = new Student("張三",23,99.8);
dao.insertStu(student);
}
}
7.添加日志控制文件
日志級別設置:
- debug:顯示出所執行的sql語句、參數值、對DB的影響條數等信息。
- trace:顯示出查詢出的每條記錄的每個字段名及值
可以指定要輸出日志的工作空間的名字,此時,只會輸出該namespace下執行的SQL的日志內容
##define a logger
log4j.rootLogger=trace,console
##define a logger
##log4j.logger.namespace_value=trace,console
log4j.logger.test=trace,console
二、使用工具類
每一次執行Sqlsession的方法,均需要首先獲取到該對象。而Sqlsession對象的獲取又相對比較繁瑣,所以,可以獲取Sqlsession對象定義為一個工具類方法。
Sqlsession對象是通過SqlsessionFactory對象創建的。由于SqlsessionFactory類為重量級對象,且為線程安全的,所以可以將SqlsessionFactory對象定義為單例的。
1.創建工具類
public class MyBatisUtil {
private static SqlSessionFactory factory;
public static SqlSession getSqlSession(){
try {
if(factory==null){
//讀取主配置文件
InputStream inputStream = Resources.getResourceAsStream("mybatis.xml");
//創建Sqlsession工廠
factory = new SqlSessionFactoryBuilder().build(inputStream);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return factory.openSession();
}
}
2.修改dao接口的實現類
沒有異常需要處理,但Sqlsession必須要關閉。
public class StudentDaoImpl implements IStudentDao {
private SqlSession sqlSession;
@Override
public void insertStu(Student student) {
try {
sqlSession = MyBatisUtil.getSqlSession();
sqlSession.insert("insertStu,student");
//Sqlsession提交
sqlSession.commit();
}finally {
if(sqlSession!=null){
sqlSession.close();
}
}
}
}
三、從屬性文件中讀取DB連接四要素
1.定義屬性文件
在src下定義屬性文件jdbc.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql:///test
jdbc.user=root
jdbc.password=root
2.修改主配置文件
對于主配置文件,第一,需要注冊屬性文件。第二,需要從屬性文件中通過key,將其value讀取出來。
<?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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.dirver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.user}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!-- 注冊映射文件 -->
<mappers>
<mapper resource="com/hcx/dao/mapper.xml"/>
</mappers>
</configuration>
四、多個映射文件
在項目中,一般一個dao接口會對應一個映射文件。
1.新添加一個映射文件
<!-- 注冊映射文件 -->
<mappers>
<mapper resource="com/hcx/dao/mapper.xml"/>
<mapper resource="com/hcx/dao/mapper2.xml"/>
</mappers>
2.修改任意一個映射文件
可以修改任意一個映射文件<mapper/>標簽的namespace屬性,將兩個不用映射文件中的sql映射,歸入為不同的命名空間。
命名空間的作用:用于區分不同命名空間中的同名的sql映射id。
3.修改dao實現類
在dao實現類中使用時,需要給出具體使用的是哪個命名空間下的sql映射語句。
public class StudentDaoImpl2 implements IStudentDao {
private SqlSession sqlSession;
@Override
public void insertStu(Student student) {
try {
sqlSession = MyBatisUtil.getSqlSession();
sqlSession.insert("test.insertStu,student");
//Sqlsession提交
sqlSession.commit();
}finally {
if(sqlSession!=null){
sqlSession.close();
}
}
}
}