一、mybatis的介绍
1.为什么要使用mybatis?(jdbc的缺点)
对结果的解析-->反射
sql语句硬编码在java代码中--->xx.xml
手动创建和关闭连接池--->连接池
2.什么mybatis?
mybatis前身是apache的ibatis,是一个封装了jdbc的持久层框架,使开发者只需关注sql语句即可
二、mybatis入门
1、pom.xml
mybatis、mysql-connection-java、log4j、junit
dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
<build>
<!-- 如果不添加此节点src/main/java目录下的所有配置文件都会被漏掉。 -->
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>
2、log4j.properites
# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
3、com.jy.mapper.UserMapper
public interface com.jy.mapper.UserMapper{
List<User> findAll();
}
4、com.jy.mapper.UserMapper.xml
<!--namespace:接口的全类名-->
<mapper namespace="com.jy.mapper.com.jy.mapper.UserMapper">
<!--
id:接口的方法名
resultType:接口方法的返回值
-->
<select id="findAll" resultType="com.jy.pojo.User">
SELECT * FROM user
</select>
</mapper>
5、mybatis-comfig.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>
<!-- 和spring整合后 environments配置将废除-->
<environments default="dev">
<!-- dev环境 -->
<environment id="dev">
<!-- 配置事务的类型:type="JDBC | MANAGED" 两种方式
JDBC:表示使用JDBC中原生的事务管理方式
MANAGED:被管理,例如Spring
-->
<transactionManager type="JDBC"></transactionManager>
<!-- 配置连接数据库的信息:用的是数据源(连接池) -->
<dataSource type="POOLED">
<!-- mysql5 -->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis?characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="1111"/>
</dataSource>
</environment>
</environments>
<!-- 告知 mybatis 映射配置的位置 -->
<mappers>
<mapper resource="com/jy/dao/UserDao.xml"/>
</mappers>
</configuration>
6.junit
@Test
public void testFindALL() throws IOException {
//读取配置文件
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
//创建sessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//创建sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//创建UserMapper接口的代理类
com.jy.mapper.UserMapper userMapper = sqlSession.getMapper(com.jy.mapper.UserMapper.class);
System.out.println(userMapper.getClass());//?class com.sun.proxy.$Proxy5
List<User> userList = userMapper.findAll();
for (User user : userList) {
System.out.println(user);
}
}
三、mybatis的运行原理
mybatis-config.xml
mapper.xml mapper.xml mapper.xml
|
|
SqlSessionFactoryBuild.build(inputStream)
|
|-->Map<namespace.id, MappedStatement(sql, resultType)>
|
SqlSessionFactory
|
|-->Map<namespace.id, MappedStatement(sql, resultType)>
|
SqlSession
|
|-->Map<namespace.id, MappedStatement(sql, resultType)>
|
ProxyFactory---->第三个参数,即Aaaaaaa
|
|--->MappedStatement(sql, resultType)
|
Executor
| |
| |
输入映射 输出映射
四、mybatis传递参数【重点】
1、传递一个参数
User findUserById(integer id);
WHERE id = #{id}
2、按序号传递参数【不推荐】
User findUser(integer id,String username);
WHERE id = #{param1} and username = #{param2}
WHERE id = #{arg0} and username = #{arg1}
3、注解传参【推荐】
User findUser2(@Param("id") integer id,@Param("username") String username);
4.对象传参【推荐】
User findUser3(User user);
WHERE id = #(id) and username = #{username}
注意:#{对象属性名},原因:id-->getid
5、Map传参【不推荐】
User findUser4(Map<String, Object> map);
WHERE id=#{id} and username=#{username}
注意:#{map的key},原因:map.get(key)
五、#{}和${}的区别