说到mybatis,我们首先说说ibatis,mybatis3.X是ibatis2.X的后期 版本,功能比ibatis强大了很多。
1、mybatis和ibatis比较
1.1、在 关系映射方面,mybatis相对ibatis的“嵌套查询”,多了“嵌套结果"查询的方式,嵌套查询会引发N+1查询问题,而嵌套结果查询可有效 避免。
1.2、mybatis实现了dao接口和xml映射文件的绑定,这使得在ibatis中无多大卵用的namespace在mybatis中派上了用场,命名空间唯一来保证xml配置文件和dao类的一一绑定。
1.3、mybatis提供了新的功能:注解,并且新增了ognl表达式,简化xml的配置 ,另外mybstis中的xml配置方式及dtd命名有了一些变化,使得在mybatis中xml映射及配置更加条理化。
2、入门:
2.1、mybatis简介;
MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装。MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录.
Mybatis中对List<Object> 对象List的批处理插入操作
2.2、加入jar包
【mybatis】
mybatis-3.1.1.jar
【MYSQL驱动包】
mysql-connector-java-5.1.7-bin.jar
2.3、创建数据表
2.4、添加mybatis配置文件conf.xml(主要用来注册xml映射文件和连接数据源)
示例:(在配置过程中没有提示的朋友可以将dtd加入eclipse配置即可。)
其中数据源配置可将配置文件放到peoperties文件中,具体如下:
<properties resource="db.properties"/>
<property value="${driver}" />
<property value="${url}" />
<property value="${username}" />
<property value="${password}" />
<?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="development">
<environment>
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property value="com.mysql.jdbc.Driver" />
<property value="jdbc:mysql://localhost:3306/mybatis" />
<property value="root" />
<property value="root" />
</dataSource>
</environment>
</environments>
</configuration>
2.5定义pojo类
2.6为实体类定义别名
<typeAliases>
<--! <typeAlias type="com.gsau.mybatis.bean.User" alias="_User"/>-->
<!--
类级别的别名映射
-->
<package/>
<!--
包级别的别名映射,这时pojo类要放到同一包中,如上面的com.gsau.mybaits.bean
-->
</typeAliases>
2.7定义sql映射文件XXX.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.gsau.mybatis_test.test1.XXX">
<select parameterType="int"
resultType="com.gsau.mybatis.bean.User">
select * from users where id=#{id}
</select>
</mapper>
2.8在配置文件中注册xml映射文件
<mappers>
<mapper resource="com/gsau/mybatis_test/test1/XXX.xml"/>
</mappers>
2.9编写测试
public class Test {
public static void main(String[] args) throws IOException {
String resource = "conf.xml";
//加载mybatis的配置文件(它也加载关联的映射文件)
Reader reader = Resources.getResourceAsReader(resource);
//构建sqlSession的工厂
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
//创建能执行映射文件中sql的sqlSession
SqlSession session = sessionFactory.openSession();
//映射sql的标识字符串
String statement = "com.gsau.mybatis.bean.userMapper"+".selectUser";
//执行查询返回一个唯一user对象的sql
User user = session.selectOne(statement, 1);
System.out.println(user);
}
}
3.1数据表的CRUD 操作
在没有配置别名映射的时候参数类型prametwrType以及结果类型resultType都需要写出实体类的全类名。以上配置使用的是包级别的别名映射。
<insert parameterType="User">
insert into users(name, age) values(#{name}, #{age});
</insert>
<delete parameterType="int">
delete from users where id=#{id}
</delete>
<update parameterType="User">
update users set name=#{name},age=#{age} where id=#{id}
</update>
<select parameterType="int" resultType="User">
select * from users where id=#{id}
</select>
<select resultType="User">
select * from users
</select>
3.2在conf.xml中注册映射文件
3.3在dao中调用sql映射文件
4、注解的实现
4.1定义sql映射的接口
public interface UserMapper {
@Insert("insert into users(name, age) values(#{name}, #{age})")
public int insertUser(User user);
@Delete("delete from users where id=#{id}")
public int deleteUserById(int id);
@Update("update users set name=#{name},age=#{age} where id=#{id}")
public int updateUser(User user);
@Select("select * from users where id=#{id}")
public User getUserById(int id);
@Select("select * from users")
public List<User> getAllUser();
}
4.2在conf.xml中注册 此接口
<mapper class="com.gsau.mybatis.crud.ano.UserMapper"/>
4.3在dao中调用
4.4可加入log4j配置文件,有properties和xml两种形式,方便找错,网上很多的(记得添加log4j的jar包)。
5、如果结果类型是多个可使用resultMap,将resultType替换,或者给查询结果列定义别名和实体类对应。
示例:
<select parameterType="int" resultMap="orderResultMap">
select * from orders where order_id=#{id}
</select>
<resultMap type="_Order">
<id property="id" column="order_id"/>
<result property="orderNo" column="order_no"/>
<result property="price" column="order_price"/>