天天看點

MyBatis核心配置檔案【二】

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

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

類型,而存儲到資料庫的時候需要轉換為

bigint

類型,由于mybatis沒有提供從

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>
           
MyBatis核心配置檔案【二】
@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 ?,?

Parameters: 0(Integer), 3(Integer)

,是以隻輸出前三條資料。這就是pageHelper插件的強大!

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

ssm

繼續閱讀