实战项目完成代码:MybatisTest_GitHub
<dependencies>
<dependency>
<groupId>org.mybatisgroupId>
<artifactId>mybatisartifactId>
<version>3.4.5version>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>8.0.13version>
dependency>
<dependency>
<groupId>log4jgroupId>
<artifactId>log4jartifactId>
<version>1.2.12version>
dependency>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.10version>
dependency>
dependencies>
create database mybatistest;
use mybatistest;
drop table if exists `user`;
create table `user`(
`id` int(10) primary key auto_increment,
`name` varchar(20),
`age` int(3)
);
insert into `user`(`name`,`age`) values('小明',22);
insert into `user`(`name`,`age`) values('小红',25);
我们已经完成了父工程的搭建,接下来我们要正式开始第一天的学习
# Set root category priority to INFO and its only appender to CONSOLE.
#log4j.rootCategory=INFO, CONSOLE debug info warn error fatal
log4j.rootCategory=debug, CONSOLE, LOGFILE
# Set the enterprise logger category to FATAL and its only appender to CONSOLE.
log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE
# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n
# LOGFILE is set to be a File appender using a PatternLayout.
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=d:\axis.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n
public class User implements Serializable {
private Integer id;
private String name;
private Integer age;
}
在快速入门阶段,我们写一个最简单的例子——查询所有用户
public interface UserDao {
/**
* 查询所有用户
* @return
*/
public List<User> findAll();
}
<mapper namespace="com.lois.dao.UserDao">
<select id="findAll" resultType="com.lois.domain.User">
select * from user;
select>
mapper>
<configuration>
<environments default="mysql">
<environment id="mysql">
<transactionManager type="JDBC">transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatistest?serverTimezone=UTC&characterEncoding=utf-8&useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="1234567"/>
dataSource>
environment>
environments>
<mappers>
<mapper resource="com/lois/dao/UserDao.xml"/>
mappers>
configuration>
public class MybatisTest {
@Test
public void test1() throws IOException {
//1.获取工厂图纸(配置信息)
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.招募工人(创建构建者)
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//3.给工人图纸建造工厂(构建者构建工厂对象)
SqlSessionFactory factory = builder.build(in);
//4.构建产品流水线(打开自动提交事务)
SqlSession session = factory.openSession(true);
//5.根据产品设计图生产出产品(动态代理)
UserDao userDao = session.getMapper(UserDao.class);
//6.使用产品
List<User> users = userDao.findAll();
for (User user :
users) {
System.out.println(user);
}
//7.回收(释放资源)
session.close();
in.close();
}
}
2019-08-11 09:21:25,572 0 [ main] DEBUG ache.ibatis.logging.LogFactory - Logging initialized using 'class org.apache.ibatis.logging.log4j.Log4jImpl' adapter.
2019-08-11 09:21:25,844 272 [ main] DEBUG source.pooled.PooledDataSource - PooledDataSource forcefully closed/removed all connections.
2019-08-11 09:21:25,844 272 [ main] DEBUG source.pooled.PooledDataSource - PooledDataSource forcefully closed/removed all connections.
2019-08-11 09:21:25,844 272 [ main] DEBUG source.pooled.PooledDataSource - PooledDataSource forcefully closed/removed all connections.
2019-08-11 09:21:25,844 272 [ main] DEBUG source.pooled.PooledDataSource - PooledDataSource forcefully closed/removed all connections.
2019-08-11 09:21:25,969 397 [ main] DEBUG ansaction.jdbc.JdbcTransaction - Opening JDBC Connection
2019-08-11 09:21:26,454 882 [ main] DEBUG source.pooled.PooledDataSource - Created connection 728258269.
2019-08-11 09:21:26,454 882 [ main] DEBUG ansaction.jdbc.JdbcTransaction - Setting autocommit to false on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@2b6856dd]
2019-08-11 09:21:26,456 884 [ main] DEBUG com.lois.dao.UserDao.findAll - ==> Preparing: select * from user;
2019-08-11 09:21:26,487 915 [ main] DEBUG com.lois.dao.UserDao.findAll - ==> Parameters:
2019-08-11 09:21:26,545 973 [ main] DEBUG com.lois.dao.UserDao.findAll - <== Total: 2
User{id=1, name='小明', age=22}
User{id=2, name='小红', age=25}
2019-08-11 09:21:26,548 976 [ main] DEBUG ansaction.jdbc.JdbcTransaction - Resetting autocommit to true on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@2b6856dd]
2019-08-11 09:21:26,549 977 [ main] DEBUG ansaction.jdbc.JdbcTransaction - Closing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@2b6856dd]
2019-08-11 09:21:26,549 977 [ main] DEBUG source.pooled.PooledDataSource - Returned connection 728258269 to pool.
mybatis的入门其实比较简单,只有四步:
那么下面我们就来详细了解一下这四步
导包我就不再说了,聊一聊实体类。mybatis是ORM思想,所以实体类其实就像是数据库中的一个表,表中的字段就对应着实体类的属性,一个实体类的实例就对应着数据库表中的一行数据,当我们修改实体类的实例时再传给mybatis,mybatis会将我们修改的信息同步到数据库表中。这也就实现了我们修改实体类就是修改数据库表。当然这里要注意,实体类的属性类型要与数据库中字段的类型匹配。实体类还有一种用法,就是实体类中包含另外一种实体类,这是为什么呢?其实这是为了实现数据库中的关系:一对一,一对多,多对一,多对多。这个问题我们在后面章节再讨论。
使用mybatis框架,我们就不用自己写持久层实现类,但是我们还是要写持久层接口,因为我们要告诉mybatis我们需要什么样的方法,我们告诉了mybatis我们需要的方法,但是接口只能提供哪些信息?方法名,返回类型,参数列表。这些信息是不够的,还需要sql语句,所以就有映射文件,这个映射文件映射的就是dao接口中的方法,映射文件告诉mybatis接口中方法的sql语句,这样mybatis就能帮我们完成dao操作。
dao接口没有什么好说的,就跟以前我们不用框架一样,那我们就要来聊一聊这个映射文件。
映射文件要求:
映射文件内标签:
configuration 标签:外部总标签,没什么好说的
mappers标签:配置dao映射文件位置
在测试类中,我已经在注释中写了好记的7步,其实这里使用了两种模式:构建者模式和工厂模式。在搭建工厂时我们使用了构建者模式,在生产时我们使用了工厂模式。那么我们为什么要使用这么多步骤呢?为什么不一步到位?这是因为我们使用mybatis框架让它给我们实现dao,每多一个步骤,就会给mybatis更大的灵活性,多一步选择,这是很有好处的。mybatis在第5步生产产品时使用了动态代理,增强了我们写的dao接口类,实现了接口中的方法,从而使我们能够不写dao类。
如果你看懂了上面的思考,那么你就应该能写出基本的增删查改,请自行尝试,当然上面思考的内容有点多,我们在后面的章节中还会继续讲解,没有看懂也没事。
下一章:(二)Mybatis增删查改、动态SQL语句、多表操作(简单易懂,图文教学,整套实战)
相关内容:
(一)初见MyBatis,快速入门以及配置文件映射文件讲解(构建思路讲解,图文教学,整套实战)
(二)Mybatis增删查改、动态SQL语句、多表操作(简单易懂,图文教学,整套实战)
(三)Mybatis延迟加载(懒加载)、一(二)级缓存、注解开发(简单易懂,图文教学,整套实战)