前言:之前一直在用SpringJPA和JdbcTemplate,Mybatis用过一段时间但是忘了,今天从最基础的地方从新复习一遍Mybatis,具体讲解不多,主要看代码吧。
目录
第一章 原生Java操作数据库
public class MysqlDemo {
static final String DB_URL = "jdbc:mysql://localhost:3306/mysql_learn?serverTimezone=GMT%2B8";
static final String USER = "root";
static final String PASS = "123456";
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
try {
Class.forName("com.mysql.jdbc.Driver");
System.out.println("opening the database...");
conn = DriverManager.getConnection(DB_URL,USER,PASS);
stmt = conn.createStatement();
String sql;
sql = "select * from person";
ResultSet rs = stmt.executeQuery(sql);
while(rs.next()) {
// getInt getString 都是指获得参数所指的那一列的数据
String name = rs.getString("name");
int age = rs.getInt("age");
String school = rs.getString("school");
String home = rs.getString("home");
System.out.println(age+name+home+school);
}
// 使用后关闭
rs.close();
stmt.close();
conn.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
第二章 原生Mybatis操作数据库
2.1 maven配置
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
2.2 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">
<configuration>
<!-- 配置环境-->
<environments default="mysql">
<!--配置mysql的环境-->
<environment id="mysql">
<!--配置事务的类型-->
<transactionManager type="JDBC"></transactionManager>
<!--配置连接池-->
<dataSource type="POOLED">
<!--配置连接数据库的4个基本信息-->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mysql_learn?serverTimezone=GMT%2B8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!--指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件-->
<mappers>
<mapper resource="mappers/Person.xml"/>
</mappers>
</configuration>
2.3 sql的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">
<!-- namespace:命名空间,用于隔离sql,还有一个很重要的作用,后面会讲 -->
<mapper namespace="Person">
<select id="findUserById" parameterType="String" resultType="common.Person">
select * from person where person_id = #{0}
</select>
</mapper>
2.4 运行代码
package mybatis;
/**
* @author ZhangChen
**/
public class MybatisDemo {
public static void main(String[] args) {
new MybatisDemo().start();
}
public void start(){
try {
testSearchById();
} catch (IOException e) {
e.printStackTrace();
}
}
public void testSearchById() throws IOException {
//1.读取配置文件
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.创建SqlSessionFactory工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
//3.使用工厂生产SqlSession对象
SqlSession session = sqlSessionFactory.openSession();
//4.执行Sql语句
Person person = session.selectOne("Person.findUserById", "1");
//5. 打印结果
System.out.println(person.getName());
//6.释放资源
session.close();
in.close();
}
}
第三章 Mybatis使用接口方式操作数据库
上面我们自己创建session,然后选择sql语句,传入参数查找,这样的话比较麻烦,我们观察到,如果我们能将接口与sql语句映射起来,那我们就能通过动态代理的方式根据接口创建类,在方法获取session,然后传入session与接口对应的sql语句,和我们传入的参数,就可以比较方便的使用Mybatis查询数据。
总的来说,就是:
同时,考虑到mapper多了之后,如果一个个都指定位置写在mappers中将会比较麻烦,可以定义一个包直接进行扫描。
特点值得注意的是:如果使用包指定配置的话,xxx.xml的名字必须和接口的名字一样,同时指定的包的路径必须和接口的路径一样(要让xml文件和dao层接口类在编译后生成在同一个文件夹)
这里留两个问题后面解决:为什么名字要一样,为什么xml文件编译后要和接口在同一个文件夹,感觉应该是源码设计的问题。
<mappers>
<mapper resource="mappers/Person.xml"/>
</mappers>
变成
<mappers>
<package name="mappers"></package>
</mappers>
3.1 接口
public interface PersonDao {
Person getPerson(String personId);
}
3.2 sql的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">
<!-- namespace:命名空间,用于隔离sql,还有一个很重要的作用,后面会讲 -->
<mapper namespace="mybatisinterface.PersonDao">
<select id="getPerson" parameterType="String" resultType="common.Person">
select * from person where person_id = #{0}
</select>
</mapper>
3.3 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">
<configuration>
<!-- 配置环境-->
<environments default="mysql">
<!--配置mysql的环境-->
<environment id="mysql">
<!--配置事务的类型-->
<transactionManager type="JDBC"></transactionManager>
<!--配置连接池-->
<dataSource type="POOLED">
<!--配置连接数据库的4个基本信息-->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mysql_learn?serverTimezone=GMT%2B8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!--指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件-->
<mappers>
<package name="mybatisinterface"/>
</mappers>
</configuration>
3.4 运行代码
public class MybatisInterfaceDemo {
public static void main(String[] args) {
new MybatisInterfaceDemo().start();
}
public void start(){
try {
testSearchById();
} catch (IOException e) {
e.printStackTrace();
}
}
public void testSearchById() throws IOException {
//1.读取配置文件
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.创建SqlSessionFactory工厂
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
//3.使用工厂生产SqlSession对象
SqlSession session = sqlSessionFactory.openSession();
//4.执行Sql语句
PersonDao personDao = session.getMapper(PersonDao.class);
Person person = personDao.getPerson("1");
//5. 打印结果
System.out.println(person.getName());
//6.释放资源
session.close();
in.close();
}
}
第四章 Mybatis结合Spring操作数据库
4.1 maven配置
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.18.RELEASE</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.12</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>4.3.18.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.3.18.RELEASE</version>
</dependency>
4.2 数据库配置文件
db.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mysql_learn?serverTimezone=GMT%2B8
jdbc.username=root
jdbc.password=123456
4.3 Mybatis个性化配置
mybatis-config.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>
<!-- 使用jdbc的getGeneratedKeys获取数据库自增主键值 -->
<setting name="useGeneratedKeys" value="true" />
<!-- 使用列别名替换列名 默认:true -->
<setting name="useColumnLabel" value="true" />
<!-- 开启驼峰命名转换:Table{create_time} -> Entity{createTime} -->
<setting name="mapUnderscoreToCamelCase" value="true" />
</settings>
</configuration>
4.4 Spring配置文件
spring-dao.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:cache="http://www.springframework.org/schema/cache"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd">
<context:annotation-config/>
<context:property-placeholder location="classpath:*.properties" />
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<!-- 配置连接池属性 -->
<property name="driverClassName" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
<!-- 4.配置SqlSessionFactory对象 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 注入数据库连接池 -->
<property name="dataSource" ref="dataSource" />
<!-- 配置MyBaties全局配置文件:mybatis-config.xml -->
<property name="configLocation" value="classpath:mybatis-config.xml" />
<!-- 扫描sql配置文件:mapper需要的xml文件 -->
<property name="mapperLocations" value="classpath:mybatisspring/*.xml" />
</bean>
<!-- 5.配置扫描Dao接口包,动态实现Dao接口,注入到spring容器中 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 注入sqlSessionFactory -->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
<!-- 给出需要扫描Dao接口包 -->
<property name="basePackage" value="mybatisspring.dao" />
</bean>
<context:component-scan base-package="mybatisspring.service" />
</beans>
4.5 sql的xml文件
<mapper namespace="mybatisspring.dao.PersonDao">
<select id="getPerson" parameterType="String" resultType="common.Person">
select * from person where person_id = #{0}
</select>
</mapper>
4.6 运行代码
public interface PersonDao {
Person getPerson(String personId);
}
@Service
public class PersonService {
@Autowired
PersonDao personDao;
public Person getPerson(String personId){
return personDao.getPerson(personId);
}
}
public class MybatisSpring {
public static void main(String[] args) {
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:spring/spring-dao.xml");
PersonService personService = applicationContext.getBean(PersonService.class);
Person person = personService.getPerson("1");
System.out.println(person.getName());
}
}
第五章 Mybatis结合SpringBoot操作数据库
5.1 maven配置
插件就是SpringBoot的默认插件
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.3</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
5.2 sql的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">
<!-- namespace:命名空间,用于隔离sql,还有一个很重要的作用,后面会讲 -->
<mapper namespace="com.aesjourey.mybatisspringboot.dao.PersonMapper">
<select id="getPersonById" parameterType="String" resultType="com.aesjourey.mybatisspringboot.entity.Person">
select * from person where person_id = #{0}
</select>
</mapper>
5.3 application.properties
server.port=8080
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mysql_learn?serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=123456
mybatis.mapperLocations=classpath:mappers/*.xml
5.4 运行代码
启动类:
@SpringBootApplication
@MapperScan("com.aesjourey.mybatisspringboot.dao")
public class MybatisspringbootApplication {
public static void main(String[] args) {
SpringApplication.run(MybatisspringbootApplication.class, args);
}
}
实体类:
@Getter
@Setter
public class Person {
String person_id;
String name;
int age;
String school;
String home;
}
controller:
@RestController
public class getPerson {
@Autowired
PersonService personService;
@RequestMapping("/getPersonByPersonId")
public Person getPersonByPersonId(String personId){
Person person = personService.getPersonById(personId);
return person;
}
}
service:
@Service
public class PersonService {
@Autowired
PersonMapper personMapper;
public Person getPersonById(String peopleId){
Person person = personMapper.getPersonById(peopleId);
return person;
}
}
dao:
public interface PersonMapper {
Person getPersonById(String personId);
}