置頂:Mybatis通用Mapper3筷凤,一個權(quán)威的文檔https://mapperhelper.github.io/docs/
————————————
18.1.26
繼承了Mapper<T>昭殉。
其中save和insertOrUpdate方法,會忽略mysql中設置的默認值藐守。
使用insertSelective方法挪丢,就不會忽略默認值。
//插入一條數(shù)據(jù),只插入不為null的字段,不會影響有默認值的字段
//支持Oracle序列,UUID,類似Mysql的INDENTITY自動增長(自動回寫)
//優(yōu)先使用傳入的參數(shù)值,參數(shù)值空時,才會使用序列卢厂、UUID,自動增長
int insertSelective(T record);
參考:http://blog.csdn.net/isea533/article/details/41457529乾蓬。
————————————
注意:在SpringBoot中使用通用Mapper。
Spring-boot啟動類慎恒,@MapperScan僅掃描業(yè)務接口包任内,不能掃描本地通用Mapper接口包,否則報java.lang.ClassCastException: sun.reflect.generics.reflectiveObjects.TypeVariableImpl cannot be cast to java.lang.Class異常融柬。
17.12.27
下面26日寫的只是寫代碼流程的簡介死嗦。
這里寫一些具體的注意事項,當然也都是從別人的博客摘抄的粒氧。
泛型(實體類)<T>的類型必須符合要求
實體類按照如下規(guī)則和數(shù)據(jù)庫表進行轉(zhuǎn)換,注解全部是JPA中的注解:
- 表名默認使用類名,駝峰轉(zhuǎn)下劃線(只對大寫字母進行處理),如UserInfo默認對應的表名為user_info越除。
- 表名可以使用@Table(name = “tableName”)進行指定,對不符合第一條默認規(guī)則的可以通過這種方式指定表名.
- 字段默認和@Column一樣,都會作為表字段,表字段默認為Java對象的Field名字駝峰轉(zhuǎn)下劃線形式.
- 可以使用@Column(name = “fieldName”)指定不符合第3條規(guī)則的字段名
- 使用@Transient注解可以忽略字段,添加該注解的字段不會作為表字段使用.
- 建議一定是有一個@Id注解作為主鍵的字段,可以有多個@Id注解的字段作為聯(lián)合主鍵.
7.默認情況下,實體類中如果不存在包含@Id注解的字段,所有的字段都會作為主鍵字段進行使用(這種效率極低).
8.實體類可以繼承使用,可以參考測試代碼中的com.github.abel533.model.UserLogin2類.
9.由于基本類型,如int作為實體類字段時會有默認值0,而且無法消除,所以實體類中建議不要使用基本類型。
除了上面提到的這些,Mapper還提供了序列(支持Oracle)外盯、UUID(任意數(shù)據(jù)庫,字段長度32)摘盆、主鍵自增(類似Mysql,Hsqldb)三種方式,其中序列和UUID可以配置多個饱苟,主鍵自增只能配置一個孩擂。
參考文章:http://blog.csdn.net/xfz0330/article/details/52275192
————————————
17.12.26
新項目打算使用通用mapper,針對mybatis掷空,原來寫xml的方式面對眾多文件和sql總是感覺亂糟糟的肋殴。使用通用mapper就可以省去很多寫mapper和sql的時間,即不需要寫Mapper.xml坦弟。
1护锤、引入mapper-spring-boot-starter
去maven repository里面找適合的版本。
2酿傍、mapper也就是dao烙懦,需要一個具體dao接口繼承Mapper<T>。泛型就是對應的domain赤炒。必須指定泛型實體<T>
這種寫法完全不需要dao接口的實現(xiàn)類氯析。
@Repository
public interface UserDao extends Mapper<User>{
public User selectUserByUserName(User user) throws Exception;
}
3亏较、對于domain,與數(shù)據(jù)庫表對應的注解一個不能少掩缓。
在類上面加@Table(name = "authority_user")雪情。指定對應表明。
在屬性上面加@Column(name = "name")你辣。指定對應的字段名巡通。
在主鍵id上面加
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
如果存在數(shù)據(jù)庫表中不存在的屬性,需要用@Transient注解舍哄,否則會報錯與數(shù)據(jù)表不對應之類的問題吧宴凉。
@Table(name = "authority_user")
public class User implements Serializable{
private static final long serialVersionUID = 1L;
/** 用戶id /
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
/ 用戶名稱 /
@Column(name = "name")
private String name;
/ 用戶密碼 **/
@Column(name = "password")
private Integer password;
--省略set/get方法--
}
4、在啟動類上面需要加掃描注解
@MapperScan(basePackages = { "com.example.test.dao" }) //掃描mapper
如果不加就是報錯表悬,找不到dao對應的bean
5弥锄、寫測試
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringBootMyBatisApplicationTests {
@Autowired
private UserDao mapper;
// 插入一條新記錄
@Test
public void insertOne() {
User newUser = new User();
newUser.setName("測試用戶特朗普");
newUser.setPassword(123);
mapper.insertSelective(newUser);
System.out.println("插入成功");
}
}
以上運行一下應該沒問題。不過我寫的也是過于簡略了蟆沫。
————————
補充籽暇。
接口可以多繼承》古樱可以寫一個更高級的mapper接口图仓。
public interface TkMapper<T> extends Mapper<T>, MySqlMapper<T> {
}
其中
Mapper接口:基本的增、刪但绕、改救崔、查方法
MySqlMapper:針對MySQL的額外補充接口,支持批量插入