Mybatis使用总结

本文分为三部分,一是入门总结,二是自动代码生成,三是深入总结。
[color=red]
[b][size=medium]一 入门总结[/size][/b][/color]
[color=red][b]什么是Mybatis?[/b][/color]
[size=small]MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(Plan Old Java Objects,普通的Java对象)映射成数据库中的记录。[/size]

[color=red][b]Mybatis入门[/b][/color]
[size=small] 每一个MyBatis的应用程序都以一个SqlSessionFactory对象的实例为核心。SqlSessionFactory对象的实例可以通过SqlSessionFactoryBuilder对象来获得。SqlSessionFactoryBuilder对象可以从XML配置文件,或从Configuration类的习惯准备的实例中构建SqlSessionFactory对象[/size]
[color=red]从XML文件中构建SqlSessionFactory的实例:[/color]
String resource = "org/mybatis/example/Configuration.xml";
Reader reader = Resources.getResourceAsReader(resource);
sqlMapper = new SqlSessionFactoryBuilder().build(reader);

[color=red] XML配置文件的一个简单的示例:Configuration.xml[/color]
<?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">
<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代码和映射定义信息。

[color=red]XML映射文件BlogMapper.xml[/color]
<?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.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中可以[color=red]获取SqlSession[/color],SqlSession对象完全包含以数据库为背景的所有[color=red]执行SQL操作[/color]的方法。你可以用SqlSession实例来直接执行已映射的SQL语句
SqlSession session = sqlMapper.openSession();
try {
Blog blog = (Blog) session.selectOne(
"org.mybatis.example.BlogMapper.selectBlog", 101);
} finally {
session.close();
}

以我自己练手的例子为例,附有源代码。

[size=medium][color=darkblue]1、前提说明: [/color] [/size]

数据库:MySql5.5.8;

相关Jar包:mybatis-3.0.4.jar; mysql-connector-java-bin.jar

数据库表的定义:User(id, username, psw)

[size=medium][color=darkblue]2、实现步骤:[/color][/size]

(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类,测试运行(保证数据库已经存在相关的表)

[size=medium][color=darkblue]3、相关文件如下:[/color][/size]

(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类的属性相关联 -->
<!-- [color=blue]property对应的是pojo类的属性,column对应的是数据库字段[/color] -->
<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语句 [color=blue]parameterType是传进来的参数的类型;resultMap是返回的结果集,对应上面的映射关联[/color] -->
<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
}

}
[size=medium][color=darkblue]
4 、Mybatis配置文件的编码方式要注意一下[/color][/size]

[size=medium][color=darkblue]5、测试运行:[/color][/size]

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());
}
[size=medium]
[color=red]二 自动代码生成[/color][/size]

以我自己练手的例子为例,附有源代码。

[size=medium][color=darkblue]1、前提说明:[/color][/size]

使用工具:mybatis-generator-core-1.3.1

需要数据库驱动,本例使用mysql-connector-java-bin.jar

在Eclipse里新建一个项目,本例为mybatisGeneratorExample
[size=medium]
[color=darkblue]2、步骤[/color][/size]

(1)创建配置文件:generator.xml,和mysql-connector-java-bin.jar都放在mybatis-generator-core-1.3.1目录下面。

<generatorConfiguration>
<!-- 注意:以下的文件路径中不可以出现中文字符 -->
<!-- [color=blue]classPathEntry:数据库的JDBC驱动,换成你自己的驱动位置[/color] -->
<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类 [color=blue]targetPackage指生成的包名,targetProject指生成的包位于那个项目下面,由于我之前已经在Eclipse中新建了项目mybatisGeneratorExample,所以指向该项目[/color]-->
<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
[size=medium][color=red]
三 深入总结[/color][/size]

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) $方式一般用于传入数据库对象.例如传入表名;
所以,一般能用#的就别用$。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值