Mybatis使用总结 本文分为三部分,一是入门总结,二是自动代码生成,三是深入总结。 一 入门总结 什么是Mybatis? MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(Plan Old Java Objects,普通的Java对象)映射成数据库中的记录。 Mybatis入门 每一个MyBatis的应用程序都以一个SqlSessionFactory对象的实例为核心。SqlSessionFactory对象的实例可以通过SqlSessionFactoryBuilder对象来获得。SqlSessionFactoryBuilder对象可以从XML配置文件,或从Configuration类的习惯准备的实例中构建SqlSessionFactory对象 从XML文件中构建SqlSessionFactory的实例: String resource = "org/mybatis/example/Configuration.xml"; Reader reader = Resources.getResourceAsReader(resource); sqlMapper = new SqlSessionFactoryBuilder().build(reader); XML配置文件的一个简单的示例:Configuration.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-////DTD Config 3.0//EN" "http:///dtd/mybatis-3-config.dtd"> <configuration> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments> <mappers> <mapper resource="org/mybatis/example/BlogMapper.xml"/> </mappers> </configuration> 当然,在XML配置文件中还有很多可以配置的,上面的示例指出的则是最关键的部分。要注意XML头部的声明,需要用来验证XML文档正确性。environment元素体中包含对事务管理和连接池的环境配置。mappers元素是包含所有mapper(映射器)的列表,这些mapper的XML文件包含SQL代码和映射定义信息。 XML映射文件BlogMapper.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-////DTD Mapper 3.0//EN" "http:///dtd/mybatis-3-mapper.dtd"> <mapper namespace="org.mybatis.example.BlogMapper"> <select id="selectBlog" parameterType="int" resultType="Blog"> select * from Blog where id = #{id} </select> </mapper> 在命名空间“com.mybatis.example.BlogMapper”中,它定义了一个名为“selectBlog”的映射语句,这样它允许你使用完全限定名“org.mybatis.example.BlogMapper.selectBlog”来调用映射语句。 从SqlSessionFactory中可以获取SqlSession,SqlSession对象完全包含以数据库为背景的所有执行SQL操作的方法。你可以用SqlSession实例来直接执行已映射的SQL语句 SqlSession session = sqlMapper.openSession(); try { Blog blog = (Blog) session.selectOne( "org.mybatis.example.BlogMapper.selectBlog", 101); } finally { session.close(); } 以我自己练手的例子为例,附有源代码。 1、前提说明: 数据库:MySql5.5.8; 相关Jar包:mybatis-3.0.4.jar; mysql-connector-java-bin.jar 数据库表的定义:User(id, username, psw) 2、实现步骤: (1)给项目添加jar包:mybatis-3.0.4.jar; mysql-connector-java-bin.jar。 (2)创建entity类 (3)创建Mybatis的配置文件,然后创建SQL映射文件(位于config包下) (4)创建mybatis公共类GetSqlSessionFactory (5)创建Dao层接口和实现类 (6)写main类,测试运行(保证数据库已经存在相关的表) 3、相关文件如下: (1)Mybatis的配置文件: <configuration> <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/test"/> <property name="username" value="root"/> <property name="password" value=""/> </dataSource> </environment> </environments> <mappers> <!-- 定义SQL映射语句 --> <mapper resource="cn/com/config/UserMapper.xml"/> </mappers> </configuration> (2)SQL映射文件如下: <mapper namespace="cn.com.config"> <!-- 描述如何从数据库结果集中来加载对象,即把数据库字段和pojo类的属性相关联 --> <!-- property对应的是pojo类的属性,column对应的是数据库字段 --> <resultMap type="cn.com.entity.User" id="userAlia"> <id property="uid" column="id" javaType="int" jdbcType="INTEGER" /> <result property="userName" column="userName" javaType="string" jdbcType="VARCHAR" /> <result property="upsw" column="psw" javaType="string" jdbcType="VARCHAR" /> </resultMap> <!-- SQL语句 parameterType是传进来的参数的类型;resultMap是返回的结果集,对应上面的映射关联 --> <select id="selectById" parameterType="int" resultMap="userAlia"> select * from user where id=#{uid} </select> <insert id="insertvalues" parameterType="cn.com.entity.User"> insert into user (userName,psw) values (#{userName},#{upsw}) </insert> <update id="updatevalue" parameterType="cn.com.entity.User"> update user set userName=#{name} where id=#{id} </update> </mapper> (3)GetSqlSessionFactory文件,读取配置文件,创建sqlsessionFactory实例 public class GetSqlSessionFactory { private static SqlSessionFactory sqlSessionFactory = null; private static GetSqlSessionFactory getSqlSessionFactory = null; private GetSqlSessionFactory(){//在构造方法内创建SqlSessionFactory实例 String rs = "cn/com/config/sqlMapConfig.xml"; Reader reader = null; try { reader = Resources.getResourceAsReader(rs);//加载资源文件 } catch (IOException e) { e.printStackTrace(); } //创建SqlSessionFactory实例 sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); } //获取类的实例,单例模式 public static GetSqlSessionFactory getInstance(){ if(getSqlSessionFactory == null){ getSqlSessionFactory = new GetSqlSessionFactory(); } return getSqlSessionFactory; } //获取SqlSessionFactory实例 public SqlSessionFactory getSqlSessionFactory() { return sqlSessionFactory; } } (4)实现Mybatis映射方法,操作数据库 //从数据库读取记录,User为实体类 public User getUser(int id) { SqlSession session = GetSqlSessionFactory.getInstance().getSqlSessionFactory() .openSession();//获取session实例 User user = null; try{ //select方法,selectById已经在UserMapper.xml中定义 user = (User)session.selectOne("selectById", id); }catch(Exception e){ e.printStackTrace(); }finally{ session.close();//记得关闭session } return user; } //插入记录 public void insertUser(User user) { SqlSession session = GetSqlSessionFactory.getInstance().getSqlSessionFactory() .openSession();//获取session实例 try{ session.insert("insertvalues",user);//insert方法 session.commit();//记得要提交,否则无法写入数据库 }catch(Exception e){ e.printStackTrace(); }finally{ session.close();//记得关闭session } } 4 、Mybatis配置文件的编码方式要注意一下 5、测试运行: public static void main(String[] args){ TestDao t = new TestDaoImpl(); User u = new User(); u.setUserName("test"); u.setUpsw("123"); t.insertUser(u); User u1 = t.getUser(2); System.out.println(u1.getUserName()); } 二 自动代码生成 以我自己练手的例子为例,附有源代码。 1、前提说明: 使用工具:mybatis-generator-core-1.3.1 需要数据库驱动,本例使用mysql-connector-java-bin.jar 在Eclipse里新建一个项目,本例为mybatisGeneratorExample 2、步骤 (1)创建配置文件:generator.xml,和mysql-connector-java-bin.jar都放在mybatis-generator-core-1.3.1目录下面。 <generatorConfiguration> <!-- 注意:以下的文件路径中不可以出现中文字符 --> <!-- classPathEntry:数据库的JDBC驱动,换成你自己的驱动位置 --> <classPathEntry location="F:\mybatis-generator-core-1.3.1\mysql-connector-java-bin.jar" /> <context id="DB2Tables" targetRuntime="MyBatis3"> <!-- 去除自动生成的注释 --> <commentGenerator> <property name="suppressAllComments" value="true" /> </commentGenerator> <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost/test" userId="root" password=""> </jdbcConnection> <javaTypeResolver > <property name="forceBigDecimals" value="false" /> </javaTypeResolver> <!-- targetProject:自动生成代码的位置 --> <!-- 生成po类 targetPackage指生成的包名,targetProject指生成的包位于那个项目下面,由于我之前已经在Eclipse中新建了项目mybatisGeneratorExample,所以指向该项目--> <javaModelGenerator targetPackage="com.mybatis.generator.po" targetProject="F:\Alan_Eclipse\mybatisGeneratorExample\src"> <property name="enableSubPackages" value="true" /> <!-- <property name="trimStrings" value="true" /> --> </javaModelGenerator> <!-- 生成配置文件 --> <sqlMapGenerator targetPackage="com.mybatis.generator.mapper" targetProject="F:\Alan_Eclipse\mybatisGeneratorExample\src"> <property name="enableSubPackages" value="true" /> </sqlMapGenerator> <!-- 生成Dao类文件 --> <javaClientGenerator type="XMLMAPPER" targetPackage="com.mybatis.generator.dao" targetProject="F:\Alan_Eclipse\mybatisGeneratorExample\src"> <property name="enableSubPackages" value="true" /> </javaClientGenerator> <!-- tableName:用于自动生成代码的数据库表名;domainObjectName:对应于数据库表的javaBean类名 --> <table tableName="user" domainObjectName="UserPO" enableSelectByExample="false" selectByExampleQueryId="false" enableCountByExample="false" enableDeleteByExample="false" enableUpdateByExample="false" selectByPrimaryKeyQueryId="false"/> </context> </generatorConfiguration> (2)在命令行里运行一下命令: java -jar F:\mybatis-generator-core-1.3.1\lib\mybatis-generator-core-1.3.1.jar -configfile F:\mybatis-generator-core-1.3.1\generator.xml -overwrite (3)在Eclipse中刷新mybatisGeneratorExample,就可以看见自动生成的文件了,不过还需要自己手动配置Mybatis的配置文件,可以直接复制上一个例子中的sqlMapConfig.xml文件,然后按需要修改一下SQL映射文件就行了。 (4)测试运行,ok 三 深入总结 1、通过使用mybatis-spring插件,Mybatis可以通过dao层中的接口直接映射到sql映射文件,而不需要实现dao层中的接口,即不需要daoImpl包了; 2、dao层接口的方法传递多参数时可以用javabean对象、map对象或者用(@Param("字段名")类名 参数名)定义; 3、映射配置文件中#与$的区别,总结如下: (1) #是把传入的数据当作字符串,如# number,#传入的是20(数字),则生成的sql语句是这样,order by "20",这当然会报错; (2) $传入的数据直接生成在sql里,如# number ,#传入的是20,则sql语句生成是这样,orderby 20,这就对了; (3) #方式能够很大程度防止sql注入; (4)$方式无法防止sql注入; (5) $方式一般用于传入数据库对象.例如传入表名; 所以,一般能用#的就别用$。 |
|