MyBatis核心配置檔案(參考官網)

1.1:properties标簽:引入外部properties檔案
在mybatis核心配置檔案中引入,使用${xxx},代替四大參數!
<properties resource="jdbc.properties"></properties>
1.3:typeAliases 标簽,類型别名
mybatis已經預設提供了很多别名,例如:Integer的别名是int,HashMap的别名是hashmap
- 為某個javaBean,指定别名
<typeAliases>
<typeAlias type="com.wzj.domain.Person" alias="person"></typeAlias>
</typeAliases>
- 為某個包下的類,指定别名,别名是類名首字母小寫
<typeAliases>
<package name="com.wzj.domain"/>
</typeAliases>
注:指定别名後,到時候再映射檔案中,寫屬性值和
parameterType
屬性值時,就不用使用類的全限定名了
resultType
1.4:typeHandlers标簽(自定義類型處理器)
1.4.1:概述
1.MyBatis 在設定預處理語句(PreparedStatement)中的參數或從結果集中取出一個值時, 都會用類型處理器将擷取到的值以合适的方式轉換成 Java 類型。
2.Mybatis提供了很多的類型處理器,但是有些沒有的,我們就需要自定義類型處理器了
例如需求:一個Java中的Date資料類型,我想将之存到資料庫的時候存成一個1970年至今的毫秒數,取出來時轉換成java的Date,即java的Date與資料庫的bigint毫秒值之間轉換。
1.4.2:環境搭建
環境搭建的流程:表->實體類->Mapper接口->Mapper映射檔案->引入到核心配置檔案->測試
1、表
create table person(
pid int auto_increment primary key,
pname varchar(20) not null,
birthday bigint not null
);
2、實體類
@Data
public class Person {
private Integer pid;
private String pname;
private Date birthday;
}
3、Mapper接口
public interface PersonMapper {
void save(Person person);
}
4、Mapper映射檔案
<?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="com.wzj.mapper.PersonMapper">
<insert id="save" parameterType="com.wzj.domain.Person">
insert into person(pname,birthday) values(#{pname},#{birthday})
</insert>
</mapper>
5、引入到核心配置檔案
<mappers>
<mapper resource="mapper/PersonMapper.xml"></mapper>
</mappers>
6、測試(在接口中,選中接口,右擊genernate即可)
public class PersonMapperTest {
private SqlSession sqlSession;
@Before
public void setUp() throws Exception {
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
sqlSession = sqlSessionFactory.openSession(); //設定true會自動送出
}
@After
public void tearDown() throws Exception {
sqlSession.commit();
sqlSession.close();
}
@Test
public void save() {
PersonMapper mapper = sqlSession.getMapper(PersonMapper.class);
Person person = new Person();
person.setPname("tom");
person.setBirthday(new Date());
mapper.save(person);
}
}
控制台:
原因:
因為實體類中的屬性是
birthday
類型,而存儲到資料庫的時候需要轉換為
Date
類型,由于mybatis沒有提供從
bigint
轉換為
java.util.Date
bigint
的類型處理器,是以會出現該異常。為了避免是以需要我們自定義類型處理器。
注:如果資料庫中列字段birthday的類型是
,此時就不會發生異常!
varchar(255)
1.4.3:自定義類型處理器
自定義類型處理器的步驟
1.自定義類實作TypeHandler 接口,或者繼承BaseTypeHandler
2.實作方法,其中setNonNullParameter()是設定到資料庫的類型,getNullableResult()重載方法,從底層随便調用哪個方法從資料庫擷取
3.注冊到mybatis核心配置檔案
- 1、自定義類型處理器
//@MappedJdbcTypes(JdbcType.DATE), 别加上它不要會報錯
public class DateTypeHandler extends BaseTypeHandler<Date> {
//将java類型轉換成資料庫需要的類型
@Override
public void setNonNullParameter(PreparedStatement preparedStatement, int i, Date date, JdbcType jdbcType) throws SQLException {
preparedStatement.setLong(i, date.getTime());
}
//将資料庫類型轉換成java類型
@Override
public Date getNullableResult(ResultSet resultSet, String s) throws SQLException {
long aLong = resultSet.getLong(s);
return new Date(aLong);
}
//将資料庫類型轉換成java類型
@Override
public Date getNullableResult(ResultSet resultSet, int i) throws SQLException {
long aLong = resultSet.getLong(i);
return new Date(aLong);
}
//将資料庫類型轉換為java類型
@Override
public Date getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
return callableStatement.getDate(i);
}
}
- 2、注冊到核心配置檔案
<typeHandlers>
<typeHandler handler="com.wzj.typeHandler.DateTypeHandler"></typeHandler>
</typeHandlers>
注:此時就完成了birthday存入資料庫是 Date -> bigint,而從資料庫取出來是 bigint -> Date
1.6:plugins标簽:使用分頁助手PageHelper
步驟
1.導入pageHelper的坐标
2.在mybatis核心配置檔案中配置PageHelper插件
3.測試分頁資料擷取
·1、pageHelper的坐标
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>3.7.5</version>
</dependency>
<dependency>
<groupId>com.github.jsqlparser</groupId>
<artifactId>jsqlparser</artifactId>
<version>0.9.1</version>
</dependency>
2、配置到核心配置檔案
<!--配置分頁助手插件-->
<plugins>
<plugin interceptor="com.github.pagehelper.PageHelper">
<property name="dialect" value="mysql"></property>
</plugin>
</plugins>
@Test
public void findAll() {
//設定分頁相關參數:目前頁,每頁顯示的條數
PageHelper.startPage(1,3 );
PersonMapper mapper = sqlSession.getMapper(PersonMapper.class);
List<Person> ps = mapper.findAll();
ps.forEach(person -> System.out.println(person));
}
注:控制台的sql日志:,
Preparing: select * from person limit ?,?
,是以隻輸出前三條資料。這就是pageHelper插件的強大!
Parameters: 0(Integer), 3(Integer)
3、測試其他分頁資料
@Test
public void findAll() {
//設定分頁相關參數:目前頁,每頁顯示的條數
PageHelper.startPage(1,3 );
PersonMapper mapper = sqlSession.getMapper(PersonMapper.class);
List<Person> ps = mapper.findAll();
ps.forEach(person -> System.out.println(person));
//分頁相關的其他資料
PageInfo<Person> pageInfo = new PageInfo<>(ps);
System.out.println("總記錄數:"+pageInfo.getTotal()); //5
System.out.println("每頁記錄數:"+pageInfo.getPageSize());//3
System.out.println("總頁數:"+pageInfo.getPages()); //總頁數 = 總記錄數/每頁記錄數, 2
System.out.println("目前頁碼:"+pageInfo.getPageNum());//1
System.out.println("上一頁:"+pageInfo.getPrePage());//0
System.out.println("下一頁:"+pageInfo.getNextPage());//2
System.out.println("第一頁:"+pageInfo.getFirstPage());//1
System.out.println("是否第一頁:"+pageInfo.isIsFirstPage());//true
System.out.println("最後一頁:"+pageInfo.getLastPage());//2
System.out.println("是否最後一頁:"+pageInfo.isIsLastPage());//false
}
}
1.9:mapper标簽:加載映射檔案
- 方式1.使用相對于類路徑的資源引用
<mappers>
<mapper resource="mapper/PersonMapper.xml"></mapper>
</mappers>
- 方式2.使用映射器接口實作類的完全限定類名
<mappers>
<mapper class="com.wzj.mapper.ClassesMapper"></mapper>
</mappers>
- 方式3.将包内的映射器接口實作全部注冊為映射器
<mappers>
<package name="mapper"/>
</mappers>
來自:雖然帥,但是菜的cxy