MyBatis入门
MyBatis环境搭建
使用IDEA搭建MyBatis环境
1.创建Maven工程并添加依赖
pom.xml中添加依赖:(log4j可以在控制台输出执行的sql语句,便于观察)
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.18</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13-beta-3</version>
<scope>test</scope>
</dependency>
</dependencies>
2.创建实体类和dao的接口
注意包名,在src/main/java下创建包com.cjx.entity和com.cjx.dao
package com.cjx.entity;
import java.io.Serializable;
import java.util.Date;
/**
* @author :
* @date :Created in 2019/11/7 17:03
* @description : user
*/
public class User implements Serializable {
private int id;
private String username;
private Date birthday;
private String sex;
private String address;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", birthday=" + birthday +
", sex='" + sex + '\'' +
", address='" + address + '\'' +
'}';
}
}
package com.cjx.dao;
import com.cjx.entity.User;
import java.util.List;
/**
* @author :
* @date :Created in 2019/11/7 17:07
* @description : dao
*/
public interface IUserDao {
/**
* @author :
* @description :查询所有
* @date :Created in 2019/11/7
*/
List<User> findAll();
}
3.创建MyBatis主配置文件:SqlMapConfig.xml
这里要提前准备好一个数据库,这里取名为eesy_mybatis,表名为user,设计如下图:
随便往里面添加一些数据。
在resources中创建文件SqlMapConfig.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">
<!-- MyBatis的主配置文件 -->
<configuration>
<!-- 配置环境 -->
<environments default="mysql">
<!-- 配置MySQL环境 -->
<environment id="mysql">
<!-- 配置事务类型 -->
<transactionManager type="JDBC"/>
<!-- 配置数据源/连接池 -->
<dataSource type="POOLED">
<!-- 配置连接数据库的4个基本信息 -->
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/eesy_mybatis"/>
<property name="username" value="root"/>
<property name="password" value="1999"/>
</dataSource>
</environment>
</environments>
<!-- 指定映射配置文件的位置 -->
<mappers>
<mapper resource="com/cjx/dao/IUserDao.xml"/>
</mappers>
</configuration>
4.创建映射配置文件
在resources中创建目录com.cjx.dao,然后创建文件IUserDao.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.cjx.dao.IUserDao">
<!-- 配置查询所有 -->
<select id="findAll" resultType="com.cjx.entity.User">
select * from user
</select>
</mapper>
5.创建log4j的配置文件
与SqlMapConfig同级创建log4j.properties文件
log4j.rootLogger=DEBUG, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[service] %d - %c -%-4r [%t] %-5p %c %x - %m%n
#log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
#log4j.appender.R.File=../logs/service.log
#log4j.appender.R.layout=org.apache.log4j.PatternLayout
#log4j.appender.R.layout.ConversionPattern=[service] %d - %c -%-4r [%t] %-5p %c %x - %m%n
#log4j.logger.com.ibatis = debug
#log4j.logger.com.ibatis.common.jdbc.SimpleDataSource = debug
#log4j.logger.com.ibatis.common.jdbc.ScriptRunner = debug
#log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate = debug
#log4j.logger.java.sql.Connection = debug
log4j.logger.java.sql.Statement = debug
log4j.logger.java.sql.PreparedStatement = debug
log4j.logger.java.sql.ResultSet =debug
搭建环境的注意事项
- 创建IUserDao.xml和IUserDao.java时名称是为了和以前的知识保持一致。在MyBatis中把持久层的操作接口名称和映射文件也叫做Mapper。所以在其他项目中可能叫IUserMapper,到时候也要能看懂。
- 在idea中创建目录时和包是不一样的。包在创建是com.cjx.dao,这是一个三级的结构,而目录com.cjx.dao,这是一个1级的目录,目录的名字就叫“com.cjx.dao”,创建目录必须用斜杠,即com/cjx/dao,才会创建三级目录,在IDEA2019中会默认把目录也折叠成com.cjx.dao的形式,如果要创建一个service目录,那么就还在resources目录下创建一个com/cjx/service,就可以正常创建。
(此图展示com/cjx/dao的情况下IDEA2019中会默认把目录也折叠成com.cjx.dao的形式)
- MyBatis的映射配置文件位置必须和dao接口的包结构相同,包在com.cjx.dao,那么xml也必须在resources中的com/cjx/dao。
- 映射配置文件的mapper标签的namespace属性的取值必须是dao接口的全限定类名。
- 映射配置文件的操作配置(如select),id属性的取值必须是dao接口的方法名,因为查询操作有返回值,所以必须指定一个返回的结果类型,属性为resultType,取值是返回值的类,这里就是user。
当我们遵从了3、4、5点后,我们在开发中就无需再写dao的实现类,剩下的功能会由MyBatis来实现。
MyBatis入门案例
创建测试函数实现数据库查询
在test/java中创建包com.cjx.test,创建类MybatisTest,在类中创建Main函数,主要有以下几步:
- 读取配置文件
- 创建SqlSessionFactory工厂
- 使用工厂生产一个SqlSession对象
- 使用SqlSession创建dao接口的代理对象
- 使用代理对象执行方法
- 释放资源
代码如下:
package com.cjx.test;
import com.cjx.dao.IUserDao;
import com.cjx.entity.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.InputStream;
import java.util.List;
/**
* @author :
* @date :Created in 2019/11/8 10:12
* @description : 入门案例
*/
public class MybatisTest {
/**
* @author :
* @description :入门案例
* @param : [args]
* @return : void
* @date :Created in 2019/11/8
*/
public static void main(String[] args) throws Exception {
//1.读取配置文件
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.创建SqlSessionFactory工厂
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
//3.使用工厂生产一个SqlSession对象
SqlSession session = factory.openSession();
//4.使用SqlSession创建dao接口的代理对象
IUserDao userDao = session.getMapper(IUserDao.class);
//5.使用代理对象执行方法
List<User> users = userDao.findAll();
for (User user :
users) {
System.out.println(user);
}
//6.释放资源
session.close();
in.close();
}
}
点击运行后可能出现的一些问题
不支持发行版本 5
这是因为Maven默认的Java版本是1.5,而大部分人装的都是新的版本。解决方法如下:
- 在File->Settings->Build,Excution,Deployment->Compiler->Java Compiler中设置target bytecode version为13(我的是13,其他人可能是1.8)
- 在pom.xml中与<dependencies>同级的配置中加入
<properties>
<java.version>13</java.version>
<maven.compiler.source>13</maven.compiler.source>
<maven.compiler.target>13</maven.compiler.target>
</properties>
- 在File->Project Structure->Project Settings->Project中修改两处Project SDK
- 在Modules中也修改一处Language Level
访问数据库时可能出现的时区问题
解决方法:在数据库链接后面加上时区参数"?serverTimezone=UTC",即修改SqlMapConfig.xml文件中的这一句
<property name="url" value="jdbc:mysql://localhost:3306/eesy_mybatis?serverTimezone=UTC"/>
使用注解方式重新运行此项目
使用注解方式就可以删除掉映射配置文件,使用注解来代替,使项目更加简洁。
1.在dao接口中添加注解指定sql语句
在创建dao接口时,在findAll方法上加注解@Select(“select * from user”)即可取代映射配置文件。代码如下:
package com.cjx.dao;
import com.cjx.entity.User;
import org.apache.ibatis.annotations.Select;
import java.util.List;
/**
* @author :
* @date :Created in 2019/11/7 17:07
* @description : dao
*/
public interface IUserDao {
/**
* @author :
* @description :查询所有
* @date :Created in 2019/11/7
*/
@Select("select * from user")
List<User> findAll();
}
2.在主配置文件中配置mapper
在SqlMapConfig.xml中,配置mapper时使用class属性指定dao接口的全限定类名,代码如下:(主要是最后几行发生了变化),配置完成后就可以把resources下的com.cjx.dao.IUserDao.xml文件删掉,因为注解可以完全取代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">
<!-- MyBatis的主配置文件 -->
<configuration>
<!-- 配置环境 -->
<environments default="mysql">
<!-- 配置MySQL环境 -->
<environment id="mysql">
<!-- 配置事务类型 -->
<transactionManager type="JDBC"/>
<!-- 配置数据源/连接池 -->
<dataSource type="POOLED">
<!-- 配置连接数据库的4个基本信息 -->
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/eesy_mybatis?serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="1999"/>
</dataSource>
</environment>
</environments>
<!-- 使用xml方式配置时这里指定映射配置文件的位置,但是本次使用注解配置,应该使用class属性指定被注解的dao全限定类名 -->
<mappers>
<mapper class="com.cjx.dao.IUserDao"/>
</mappers>
</configuration>
删除IUserDao.xml后再次点击运行,仍然可以成功运行。
来源:oschina
链接:https://my.oschina.net/u/4373561/blog/4780757