在上一篇的文章里,简单介绍了一些SpringMVC的一些简单使用方法。今天就来看看Mybatis。现在流行的Hibernate、Mybatis都是比较常见的ORM框架。什么是ORM呢,就是 Object Relational Mapping,对象关系映射,通俗点说,就是把对象映射成sql语句,在操作的时候,直接操作对象就可以了。了解过Hibernate的都知道,在做CRUD的时候,直接操作一个Model,即可操作数据库,对于一些特殊的情况,我们还可以使用hql,虽然这样很方便,但是在一些特殊的情况下,往往会有比较复杂的sql,虽然用Hibernate也能够解决,但却并不怎么容易。而Mybatis呢,了解过的都知道,它还是通过sql语句来操作数据库,只是把sql都写在配置文件中,并且对于参数,返回结果都能用对象来操作。这样不仅能解决一些复杂sql的问题,对代码层面来说,只是调用insert,select这些方法,而不需要显示的创建connection,statement,resultset等等。下面呢,我们就来看看如何在项目中使用Mybatis。
我们仍然以之前文章里搭建的项目为基础,来看看Mybatis的配置。
首先,我们先看看mybatis的核心配置文件: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> <setting name="cacheEnabled" value="true" /> <setting name="lazyLoadingEnabled" value="false" /> <setting name="defaultStatementTimeout" value="30" /> </settings> <mappers> <mapper resource="mybatis/UserMapper.xml" /> </mappers> </configuration>
这个是最简单的配置方式,settings里配置了一些是否使用缓存,是否使用懒加载,默认的超时时间等信息。而mappers里配置了要加载的具体sql映射配置文件。操作数据库,数据库的连接信息是必不可少的,由于我们项目中使用了spring,这些信息都放在了spring的配置文件中,如果项目中没用spring,那就需要在这个配置文件中配置数据库的相关信息了,可以使用如下的配置:
<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/mybatis" /> <property name="username" value="root" /> <property name="password" value="root" /> </dataSource> </environment> </environments>
当然了,其中还有一些其他的配置,就不一一来说了,有需要的可以自行查阅相关文档。
接下来就看看,怎么去使用mybatis-config配置文件呢?我们操作数据库,就需要dao,这个类我们一般会继承SqlSessionDaoSupport来进行操作。这个类需要我们注入一个属性sqlSessionFactory。配置如下:
<bean id="userDao" class="com.demo.dao.impl.UserDaoImpl"> <property name="sqlSessionFactory" ref="sqlSessionFactory"></property> </bean>
那么sqlSessionFactory怎么配置呢?
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="configLocation" value="classpath:mybatis-config.xml" /> <property name="dataSource" ref="dataSource" /> </bean>
configLocation指定了mybatis的核心配置文件,dataSource就是数据源,是对数据库的配置信息。
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="${jdbc.driverClassName}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}"></property> <property name="password" value="${jdbc.password}"></property> </bean>
这个就是datasource的配置,现在使用的是DriverManager的方式去配置的。其实在项目中,比较常用的是JNDI数据源。JNDI数据源不是配置在项目中的,而是配置在容器中。比如在Tomcat数据源的配置是在TOMCAT_HOME/conf/context.xml中context里加上如下的配置:
<Resource name="jdbc/usertest" auth="Container" type="javax.sql.DataSource" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost/test" username="root" password="root" maxActive="100" maxIdle="30" maxWait="10000" />
这样,我们需要修改数据库配置的时候,直接修改容器的配置文件就行了,就不需要修改项目啦。JNDI数据源配置之后,项目中dataSource也需要修改。
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> <property name="jndiName" value="java:comp/env/java/usertest"></property> </bean>
这里只需要配置jndiName就可以了,名字必须是java:comp/ev/加上在容器中配置的jndi名字jdbc/usertest。这样jndi数据源就配置好了。
下面我们就来说说mybatis的配置*Mapper.xml,这个文件里存放的就是sql的配置了。一般这个文件的命名都是模块名+Mapper.xml,每个模块都有自己的Mapper。
<mapper namespace="user"> <resultMap type="com.demo.model.UserModel" id="UserModel"> <result column="id" property="id" jdbcType="INTEGER"/> <result column="name" property="name" jdbcType="VARCHAR"/> <result column="age" property="age" jdbcType="INTEGER"/> <result column="address" property="address" jdbcType="VARCHAR"/> </resultMap> <insert id="insertUser" parameterType="com.demo.model.UserModel"> insert into t_user(`name`,`age`,`address`) values( #{name,jdbcType=VARCHAR}, #{age,jdbcType=INTEGER}, #{address,jdbcType=VARCHAR} ); </insert> <select id="selectUserById" parameterType="INTEGER" resultMap="UserModel"> select `id`,`name`,`age`,`address` from t_user where `id` = #{userid,jdbcType=INTEGER}; </select> <select id="selectAllUser" resultType="com.demo.model.UserModel"> select `id`,`name`,`age`,`address` from t_user </select> </mapper>
首先是mapper的namespace属性,一般我们都使用模板的名字。
resultMa是结果映射,主要用于将sql的返回结果映射到对象,一般用于数据库表的字段名和Model的属性名不一致的情况。mybatis和java类型映射关系如下:
JDBC Type Java Type CHAR String VARCHAR String LONGVARCHAR String NUMERIC java.math.BigDecimal DECIMAL java.math.BigDecimal BIT boolean BOOLEAN boolean TINYINT byte SMALLINT short INTEGER int BIGINT long REAL float FLOAT double DOUBLE double BINARY byte[] VARBINARY byte[] LONGVARBINARY byte[] DATE java.sql.Date TIME java.sql.Time TIMESTAMP java.sql.Timestamp CLOB Clob BLOB Blob ARRAY Array DISTINCT mapping of underlying type STRUCT Struct REF Ref DATALINK java.net.URL
接下来就是sql了,mybatis对sql进行了区分,不同的sql使用不同的标签,插入:insert,查询:select,删除:delete,更新:update,每个sql都必须有一个唯一的id,这个id就是在代码里需要执行这条sql的一个标识。
parameterType是参数的类型,如果没有可以不填,如果是java类型,一定要写全路径名。
返回结果呢,有两种,一种是resultType,一种是resultMap,resultType就是返回正常的类型,如INTEGER,就是不需要转换的对象。如果需要转换,就得使用resultMap了,对应的值,必须在上边的<resultMap>中进行了配置。
以上就是配置方面的信息,在代码中使用就很简单了。
public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao { public boolean insert(UserModel user) { int count = getSqlSession().insert("insertUser", user); if(count > 0) { return true; } return false; } public UserModel getUser(int userid) { List<UserModel> list = getSqlSession().selectList("selectUserById", userid); return list != null && list.size() > 0 ? list.get(0) : null; } }
直接调用getSqlSession()的相应方法就可以了。在这要注意,如果有多条查询结果的话,mybatis会默认把他们放到List里。
版权声明:本文为博主原创文章,未经博主允许不得转载。