MyBatis源码分析-IDEA新建MyBatis源码工程
MyBatis 是支持定制化 SQL、存儲(chǔ)過(guò)程以及高級(jí)映射的優(yōu)秀的持久層框架。MyBatis 避免了幾乎所有的 JDBC 代碼和手動(dòng)設(shè)置參數(shù)以及獲取結(jié)果集。MyBatis 可以對(duì)配置和原生Map使用簡(jiǎn)單的 XML 或注解,將接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java對(duì)象)映射成數(shù)據(jù)庫(kù)中的記錄。項(xiàng)目GitHub地址
下載MyBatis源碼,導(dǎo)入到IDEA工程(Maven工程)中,工程結(jié)構(gòu)如下:
在pom.xml中新增如下依賴:
<!-- MySQL相關(guān) --> <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.38</version> </dependency><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.2</version> </dependency> <dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><version>2.6.2</version> </dependency><dependency><groupId>ognl</groupId><artifactId>ognl</artifactId><version>3.1.6</version> </dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.7.21</version> </dependency><dependency><groupId>cglib</groupId><artifactId>cglib</artifactId><version>2.2.2</version> </dependency>等待依賴更新完畢后,如果出現(xiàn)了@Override覆蓋接口方法報(bào)錯(cuò)問(wèn)題,請(qǐng)參考IDEA中 @override報(bào)錯(cuò)的解決方法。
?
MyBatis配置conf.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><settings><setting name="cacheEnabled" value="true"/><setting name="lazyLoadingEnabled" value="false"/><!--setting name="logImpl" value="STDOUT_LOGGING"/--> <!-- 日志 --></settings><typeAliases><typeAlias type="com.luoxn28.dao.User" alias="User"/></typeAliases><environments default="development"><environment id="development"><transactionManager type="JDBC" /> <!-- 聲明使用那種事務(wù)管理機(jī)制 JDBC/MANAGED --><!-- 配置數(shù)據(jù)庫(kù)連接信息 --><dataSource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver" /><property name="url" value="jdbc:mysql://192.168.1.150:3306/xxx" /><property name="username" value="xxx" /><property name="password" value="xxx" /></dataSource></environment></environments><mappers><mapper resource="userMapper.xml"/></mappers></configuration>User類(lèi)的映射文件userMapper.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="com.luoxn28.dao.UserDao"><select id="getById" parameterType="int" resultType="User">SELECT * FROM user WHERE id=#{id}; <!-- #{xxx} xxx為類(lèi)中的數(shù)據(jù)域名稱 --></select><select id="getAll" resultType="com.luoxn28.dao.User">SELECT * FROM user;</select> </mapper>測(cè)試代碼:
/*** MyBatis測(cè)試類(lèi)*/ public class TestMain {public static void main(String[] args) throws IOException {String resouce = "conf.xml";//InputStream is = TestMain.class.getClassLoader().getResourceAsStream(resouce);InputStream is = Resources.getResourceAsStream(resouce);// 構(gòu)建sqlSession工廠SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);SqlSession session = sqlSessionFactory.openSession();/*** 第一種方式: 直接執(zhí)行已映射的 SQL 語(yǔ)句*/String statement = "com.luoxn28.dao.UserDao.getById";User user = session.selectOne(statement, 1);System.out.println(user);System.out.println("---------------------");/*** 第二種方式: 執(zhí)行更清晰和類(lèi)型安全的代碼*/UserDao userDao = session.getMapper(UserDao.class);user = userDao.getById(1);System.out.println(user);}}User用戶類(lèi):
/*** User - 用戶類(lèi)*/ public class User {public static final int MAN = 0; // 男生public static final int WOMAN = 1; // 女生public static final int OTHER = 2; // 其他private int id; // 用戶idprivate String name; // 用戶名private String password; // 用戶密碼private int sex; // 用戶性別private String email; // 用戶郵箱private String phone; // 用戶手機(jī)private String admin; // 用戶是否是管理員,"admin"表示是管理員,其他為普通用戶public User() { }public User(String name, String password, int sex, String email, String phone) {this.name = name;this.password = password;this.sex = sex;this.email = email;this.phone = phone;this.admin = "";}public User(String name, String password, String sex, String email, String phone) {this.name = name;this.password = password;setSex(sex); // this.sex = sex;this.email = email;this.phone = phone;this.admin = "";}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public int getSex() {return sex;}public void setSex(int sex) {this.sex = sex;}public void setSex(String sexStr) {int sex = Integer.valueOf(sexStr);switch (Integer.valueOf(sexStr)) {case 0: {this.sex = MAN;break;}case 1: {this.sex = WOMAN;break;}default: {this.sex = OTHER;break;}}}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}public String getAdmin() {return admin;}public void setAdmin(String admin) {this.admin = admin;}@Overridepublic String toString() {return "User{" +"id=" + id +", name='" + name + '\'' +", password='" + password + '\'' +", sex=" + sex +", email='" + email + '\'' +", phone='" + phone + '\'' +", admin='" + admin + '\'' +'}';}} UserUserDao用戶操作類(lèi)
/*** UserDao - User操作類(lèi)*/ public interface UserDao {public User getById(int id);public List<User> getAll();}以上示例代碼是用XML來(lái)設(shè)置映射語(yǔ)句的,當(dāng)然,也可以用Java注解來(lái)做。比如,上面的 XML 示例可被替換如下:
/*** UserDao - User操作類(lèi)*/ public interface UserDao {@Select("SELECT * FROM user WHERE id=#{id}")public User getById(int id);@Select("SELECT * FROM user")public List<User> getAll();}使用注解時(shí)調(diào)用實(shí)例:
UserDao userDao = session.getMapper(UserDao.class); user = userDao.getById(1); System.out.println(user);對(duì)于簡(jiǎn)單語(yǔ)句來(lái)說(shuō),注解使代碼顯得更加簡(jiǎn)潔,然而 Java 注解對(duì)于稍微復(fù)雜的語(yǔ)句就會(huì)力不從心并且會(huì)顯得更加混亂。因此,如果你需要做很復(fù)雜的事情,那么最好使用 XML 來(lái)映射語(yǔ)句。選擇何種方式以及映射語(yǔ)句的定義的一致性對(duì)你來(lái)說(shuō)有多重要這些完全取決于你和你的團(tuán)隊(duì)。換句話說(shuō),永遠(yuǎn)不要拘泥于一種方式,你可以很輕松的在基于注解和 XML 的語(yǔ)句映射方式間自由移植和切換。注意:UserDao接口的getById方法配置了注解,那么就不要XML中配置<select id="getById">xxx</select>了,否則程序會(huì)報(bào)異常。
?
參考:
1、IDEA中 @override報(bào)錯(cuò)的解決方法
2、MyBatis3中文文檔
轉(zhuǎn)載于:https://www.cnblogs.com/luoxn28/p/5922457.html
總結(jié)
以上是生活随笔為你收集整理的MyBatis源码分析-IDEA新建MyBatis源码工程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 一种压缩图片的方法---Machine
- 下一篇: HDU5730 FFT+CDQ分治