一、MyBatis引言
1、基本概念
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。MyBatis是一个持久层框架,完成是对数据库的访问和操作。
2、优点
解决了JDBC访问数据库过程中存在的问题,他是对原有JDBC技术的封装。
a、大量的代码冗余。
b、手工处理ORM。
c、没有对访问数据进行优化(没有cache)。
二、一个简单的Mybatis程序
1、环境搭建
a、导入核心jar包,导入第三方依赖jar包,导入对应数据库的驱动jar包。
b、引入配置文件
(1)log4j.properties(日志配置文件)放置在src根下
(2)mybatis-config.xml位置随意。
(3)mapper文件(实现DAO接口)位置随意。
c、初始化配置
mybatis-config.xml的文件配置
主要分为两大部分:1、数据库连接的相关参数。2、Mapper文件的注册。
ps、别名typeAlias
在配置文件中设置别名之后,在mapper文件中会舒服很多。
2、MyBatis核心API
a、Resource
作用:读取MyBatis相关配置文件,打开IO。
建议:因为频繁打开IO会很占用资源,所以建议一次性通过IO读取所有需要的数据。
b、SqlSessionFactory
作用:通过SqlSessionFactory这个工厂创建SqlSession。
特点:该类是一个重量级资源,并且线程安全,应该保证每一个应用只创建一个。
c、SqlSession
作用:(1)根据程序员写的mapper文件,自动创建mapper文件所对应的java类(DAO接口的实现类)
(2)SqlSession内部封装Connection对象(一一对应的关系)。
(3)SqlSession控制事务。
3、Mybatis开发步骤
a、创建表table。
b、创建对应的实体类entity。
d、创建DAO接口。
e、配置Mapper文件做DAO层的实现。
<mapper namespace="xxxx.mybatis.UserDao"> <select id="queryUserById" parameterType="int" resultType="xxxx.mybatis.User"> select id,name,password,birthday from t_user where id = #{id} </select> </mapper>
ps、namespace="xxxx.mybatis.UserDao"----->要实现的DAO接口的全限定名。
id="queryUserById"----->DAO接口中要实现的方法名。
parameterType="int"----->方法参数类型(可省略)。
resultType="xxxx.mybatis.User"----->sql语句所查询结果所对应的entity类。
#{id}----->方法传递的参数。
f、mapper文件的注册(在mybatis-config.xml配置)
<mappers> <mapper resource="xxxx/mybatis/resources/UserDaoMapper.xml"> </mappers>
ps、resource="xxxxxx"------->mapper文件的路径。
g、通过API运行mybatis
//1、通过Resource读取MyBatis的配置文件(路径要写对) InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml"); //2、创建SqlSessionFactory SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //3、创建SqlSession SqlSession sqlSession = sqlSessionFactory.openSession(); //4、通过sqlSession获取DAO的实现类 UserDao userDao = sqlSession.getMapper(UserDao.class); //5、编码 User user = userDao.queryUserById(1);
三、单表操作的Mapper文件配置问题
1、集合类型的返回值(如List<User>)
<select id="queryAllUsers" resultType="xxxx.mybaits.User"> select * from t_user </select> //resultType属性设置为集合中的元素类型即可
2、参数绑定
当DAO方法中只存在一个参数时,在mapper文件#{}中填写任意内容都可以识别。
当DAO方法中存在多个参数时,有以下两种解决方案:
a、以起始自0的下标#{0}#{1}#{2}来区分
java类:
public interface UserDao{ public User queryUser(String name,String password); }
mapper文件:
<mapper namespace="xxxxx.UserDao"> <select id="queryUser" resultType="User"> select * from t_user where name =#{0} and password = #{1} </select> </mapper>
这样书写,mybatis便会顺序识别,自动将name跟#{0}匹配,password跟#{1}匹配。
b、通过注解来进行绑定(推荐)
java类:
public interface UserDao{ public User queryUser(@Param("name")String name,@Param("password")String password); }
mapper文件:
<mapper namespace="xxxxx.UserDao"> <select id="queryUser" resultType="User"> select * from t_user where name =#{name} and password = #{password} </select> </mapper>
这种写法类似于给参数起了一个名字,在mapper文件里直接通过所起的名字来对应。这种方法更加灵活。