赞
踩
每一个mybatis应用都以一个SqlSessionFactory为核心,而SqlSessionFactory则由SqlSessionFactoryBuilder来生成,配置文件一般为mybatis-config.xml;
SqlSessionFactory一旦创建,在程序执行期间应该都一直存在于内存中,并一般不需要重复创建,所以一般使用单例模式即可。
SqlSessionFactory是线程安全的。
<?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 id="development"> <transactionManager type="JDBC" /> <!--事务管理器--> <dataSource type="POOLED"> <!--连接池配置,jdbc的参数为一个配置文件中配置--> <property name="driver" value="${jdbc.driver}" /> <property name="url" value="${jdbc.url}" /> <property name="user" value="${jdbc.user}" /> <property name="password" value="${jdbc.password}" /> </dataSource> </environment> </environments> <mappers> <mapper resource="xxx/xxx/xxx.xml" /> <!--mapper映射器,包含SQL代码以及映射定义信息--> </mappers> <settings> <setting name="logImpl" value="STDOUT_LOGGING" /> </settings> </configuration>
sqlSession是mybatis的一个重要对象,用于应用程序和持久层之间进行交互;
sqlSession是线程私有的对象,所以不存在线程安全;
SqlSession通过SqlSessionFactory来获取: SqlSession sqlSession = sqlSessionFactory.openSession();
sqlSession包含有数据库操作的全部,底层封装jdbc的连接,可以直接用sqlSession来执行映射的SQL语句:
sqlSession.select(“aaa.bbb.ccc.xxxMapper.selectInfo”);
<?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="org.hexf.mapper.UserMapper"> <resultMap id="BaseResultMap" type="org.hexf.bean.User"> <id column="id" property="id"/> <result column="username" property="username"/> <result column="nickname" property="nickname"/> <result column="password" property="password"/> <result column="email" property="email"/> <collection property="roles" ofType="org.hexf.bean.Role"> <id column="rid" property="id"/> <result column="rname" property="name"/> </collection> </resultMap> <select id="loadUserByUsername" resultType="org.hexf.bean.User"> SELECT * FROM user WHERE username=#{username} </select> <insert id="reg" useGeneratedKeys="true" keyProperty="id"> INSERT INTO user set username=#{username},password=#{password} </insert> <update id="updateUserEmail"> UPDATE user set email=#{email} WHERE id=#{id} </update> <select id="getUserByNickname" resultMap="BaseResultMap"> SELECT u.*,r.`id` AS rid,r.`name` AS rname FROM user u,roles r,roles_user ru WHERE u.`id`=ru.`uid` AND r.`id`=ru.`rid` AND u.`id` NOT IN(SELECT u.`id` FROM user u,roles_user ru WHERE u.`id`=ru.`uid` AND ru.`rid`=1) <choose> <when test="nickname!=null and nickname!=''"> and u.nickname like concat('%',#{nickname},'%') ORDER BY u.`id` </when> <otherwise> ORDER BY u.`id` limit 20 </otherwise> </choose> </select> <delete id="deleteUserById"> DELETE FROM user WHERE id=#{id} </delete> </mapper>
相对应的,我们可以定义一个Java接口类,用于和上述的Mapper.xml进行映射;关于映射关系可以用命名空间nameSpace来进行限定,如上文件中的:***mapper namespace=“org.hexf.mapper.UserMapper”***,此处的命名空间为全限定名,即包名+类名唯一确定。接口类中的方法名和XML文件中的ID是一一对应的,如果错误则会找不到。同时,接口类需要加上注解@Mapper。
接口类如下(UserMapper.java):
@Mapper
public interface UserMapper {
User loadUserByUsername(@Param("username") String username);
long reg(User user);
int updateUserEmail(@Param("email") String email, @Param("id") Long id);
List<User> getUserByNickname(@Param("nickname") String nickname);
int deleteUserById(Long uid);
}
此外,还有一种方式就是不写XML文件,而是直接使用注解的方式实现,如下:
@Mapper
public interface UserMapper {
@Select("SELECT * FROM user WHERE username=#{username}")
User loadUserByUsername(@Param("username") String username);
......
}
但是基于注解的方式实现上有一定的限制,如果SQL语句较为简单还可以,一旦SQL语句比复杂则会导致代码的阅读性大幅度下降,维护起来很不容易。所以此处推荐使用XML的形式进行实现。
此外,使用XML的形式可以使用mybatis逆向工程来进行相关代码的自动生成。
mybatis逆向工程是通过自动配置相关的类和文件以此来自动生成mybatis的SQL语句的XML和相关接口类。
mybatis的逆向工程有自己的官网,网址为:http://www.mybatis.org/generator/quickstart.html;
可以在上面查看相关使用说明,此处仅举例说明使用方式。
逆向工程使用的配置文件如下(generatorConfig.xml):
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"> <generatorConfiguration> <classPathEntry location="/Program Files/IBM/SQLLIB/java/db2java.zip" /> <context id="DB2Tables" targetRuntime="MyBatis3"> <!-- 是否去除自动生成的注释 true:是 : false:否 --> <commentGenerator> <property name="suppressAllComments" value="true" /> </commentGenerator> <!-- 数据库信息配置,包括driver/url/user/pwd,用于连接使用的数据库 --> <jdbcConnection driverClass="COM.ibm.db2.jdbc.app.DB2Driver" connectionURL="jdbc:db2:TEST" userId="db2admin" password="db2admin"> </jdbcConnection> <!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 和 NUMERIC 类型解析为java.math.BigDecimal --> <javaTypeResolver > <property name="forceBigDecimals" value="false" /> </javaTypeResolver> <!-- 生成实体类存储的包的位置 --> <javaModelGenerator targetPackage="test.model" targetProject="\MBGTestProject\src"> <property name="enableSubPackages" value="true" /> <property name="trimStrings" value="true" /> </javaModelGenerator> <!-- 生成SQL对应XML的包位置 --> <sqlMapGenerator targetPackage="test.xml" targetProject="\MBGTestProject\src"> <property name="enableSubPackages" value="true" /> </sqlMapGenerator> <!-- 生成Mapper接口类的存储包位置 --> <javaClientGenerator type="XMLMAPPER" targetPackage="test.dao" targetProject="\MBGTestProject\src"> <property name="enableSubPackages" value="true" /> </javaClientGenerator> <!--指定需要生成的数据库表,可以写多个,tableName为表名,其他两个参数可以不配置--> <table schema="DB2ADMIN" tableName="User" domainObjectName="Customer" ></table> <table schema="DB2ADMIN" tableName="Workbook" domainObjectName="Customer" ></table> </context> </generatorConfiguration>
生成逆向工程的配置文件后,在Java中可以自己写一个类进行调用即可。
运行后可在配置文件中配置的对应的包下查看生成的文件。
参考代码如下:
public static void main(String[] args) {
List<String> warnings = new ArrayList<String>();
boolean overwrite = true;
// generatorConfig.xml为生成的逆向工程的配置文件,此处是工程的相对路径
File configFile = new File("generatorConfig.xml");
ConfigurationParser cp = new ConfigurationParser(warnings);
Configuration config = cp.parseConfiguration(configFile);
DefaultShellCallback callback = new DefaultShellCallback(overwrite);
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
myBatisGenerator.generate(null);
}
【本节完,后续记录mybatis的具体原理…】
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。