一:Mybatis简介与对比
1.简介
2010 : 之前叫ibatis 是由Apache进行开发 2010 之后交由Google,2013 年交由github进行管理,Mybaits是一个数据持久层框架 (jdbc)。
2.对比
|Hibernate| 重量级的框架| 速度慢 |代码量小 |不用写sql语句|
|Mybatis | 轻量级框架 |速度较快 |代码一般 |需要写sql语句|
|Jdbc | 轻量级 |速度最快的|代码量较大|需要写sql语句|
二:配置pom.xml 依赖导入
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.3</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.26</version>
</dependency>
</dependencies>
三:配置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>
<!-- 该配置影响的所有映射器中配置的缓存的全局开关。默认值true -->
<setting name="cacheEnabled" value="false" />
<!-- 允许 JDBC 支持自动生成主键,需要驱动兼容。 如果设置为 true 则这个设置强制使用自动生成主键, 尽管一些驱动不能兼容但仍可正常工作(比如
Derby)。 默认值false -->
<setting name="useGeneratedKeys" value="true" />
<!-- 配置默认的执行器。SIMPLE 就是普通的执行器;REUSE 执行器会重用预处理语句(prepared statements); BATCH
执行器将重用语句并执行批量更新。默认SIMPLE -->
<setting name="defaultExecutorType" value="REUSE" />
</settings>
<!--
通过package, 可以直接指定package的名字, mybatis会自动扫描你指定包下面的javabean,
并且默认设置一个别名,默认的名字为: javabean 的首字母小写的非限定类名来作为它的别名。
也可在javabean 加上注解@Alias 来自定义别名, 例如: @Alias(user)
List<User> list = this.service.selectAll();
-->
<typeAliases>
<typeAlias alias="User" type="com.ygj.user.User" />
</typeAliases>
<!-- 配置数据库信息 mybatis 会自动去连接数据库 不需要在配置其余的信息 也可以说成是环境信息的配置-->
<environments default="development">
<environment id="development">
<transactionManager type="jdbc" />
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/jnmd" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments>
<!-- 配置我们的mapper映射文件的位置 和数据库建立连接 -->
<mappers>
<mapper resource="UserMapper.xml" />
</mappers>
</configuration>
四:编写实体类
public class User {
private int id;
private String name;
private String pwd;
五:编写接口
public interface UserDao {
List<User> selectAll();
int addUser();
int updateUser();
int deleteUserById();
}
六:编写映射(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.ygj.dao.UserDao">
```
<!-- id 对应的是接口中的方法 resultType 对应的是返回类型
注意: 查询集合时 返回的是集合中的对象
resultType 的三种形式
1 User(mybatis-config.xml中使用<typeAliases></typeAliases>标签配置的别名)
3 com.ygj.user.User
-->
```
<select id="selectAll" resultType="com.ygj.user.User" >
select * from user
</select>
<!-- 添加 -->
<insert id="addUser" parameterType="user">
insert into user (name,pwd) values (#{name},#{pwd})
</insert>
<!-- 修改 -->
<update id="updateUser" parameterType="User" >
update user set name= #{name}, pwd = #{pwd} where id = #{id}
</update>
<!-- 删除 -->
<delete id="deleteUserById" parameterType="String">
delete from user where id = #{id}
</delete>
<select id="getListById" parameterType="int" resultType="user" >
select * from user where id = #{id}
</select>
</mapper>
七:测试类
@Test
public void test3(){
Reader reader = null;
try {
//用mybaits方法读取主配置文件
reader = Resources.getResourceAsReader("mybatis-config.xml");
} catch (IOException e) {
System.out.println(e.getMessage());
}
//session工厂 用的是工厂模式
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
SqlSession sqlSession = sqlSessionFactory.openSession();
UserDao mapper = sqlSession.getMapper(UserDao.class);
User user = new User(9,"李四","h5+java全栈");
try {
mapper.updateUser(user);
//事物
sqlSession.commit();
} catch (Exception e) {
e.printStackTrace();
}
}
八:动态sql
1.代码块
<sql id="all" >
id,name,pwd
</sql>
<select id="login" resultType="users" parameterType="users">
SELECT
<include refid="all"></include>
FROM user WHERE name = #{name} AND pwd = #{pwd}
</select>
sql 标签和 include 标签结合使用
2.判断/循环
<where> 可以过滤and
<set>可以过滤 ,
<if test=""> 有做判断非空
3.接值方式
#{} //可以自动判断类型 , 需不需要加 ‘
${} //需要自己写’
九:返回值定义(map)
<resultMap type="com.ygj.user.Users" id="resultUserMap">
<id column="id" property="id" jdbcType="INTEGER" />
<result column="name" property="name" jdbcType="VARCHAR" />
<result column="pwd" property="pwd" jdbcType="VARCHAR" />
</resultMap>
<select id="select" resultMap="resultUserMap" parameterType="users">
当一对多张表的查询时 没有办法放到一个bean中 resultMap就有大作用了!