Mybatis基础
Posted ericz2j
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mybatis基础相关的知识,希望对你有一定的参考价值。
Mybatis简介:
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis,实质上Mybatis对ibatis进行 一些改进。 目前mybatis在github上托管。
MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发 者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、 创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。
Mybatis通过xml或注解的方式将要执行的各种statement(statement、
preparedStatemnt、CallableStatement)配置起来,并通过java对象和statement中的
sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成 java对象并返回。简单来说,mybatis封装了相关jdbc的操作,经过简单的配置,然后该框架就会帮我 们运行我们写的sql。
搭建Mybatis工作环境:
step1:
导入jar包(mybatis-3.4.5.jar、mysql-connector-java-5.1.7-bin.jar)。
step2:
书写UserBean,DAO接口 。
step3:
书写配置文件(两个):
1、资源文件(主配置文件)SqlMapConfig.xml,用于指定数据库连接参数和框架参数。
1.1 文件抬头格式书写
<?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">
1.2 内容配置
<configuration>
<environments default="mysql"> <!--配置数据库连接环境-->
<environment id="mysql">
<!--先配置事物 -->
<transactionManager type="JDBC" />
<!-- 配置mysql数据源 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/gokee_0703" />
<property name="username" value="root" />
<property name="password" value="123456" />
</dataSource>
</environment>
</environments>
<!-- 配置映射文件(sql语句)的位置 -->
<mappers>
<mapper resource="mapper/UserMapping.xml"/>
</mappers>
</configuration>
2、映射配置文件 SqlMap.xml,用于定义sql语句和映射信息。
2.1 文件抬头格式书写
<?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">
2.2 内容配置
<mapper namespace="dao.UserDAO"> <select id="findUserById" resultType="entity.UserBean" parameterType="String"> select * from bank where id=#id </select> </mapper>
参数解析:
①namespace为该mapper文件的命名空间,且一个DAO对应一个映射配置文件,值为对应dao的全类名;
②id指该sql语句的id,要求唯一,其值为对应接口的方法名;
③resultType表示返回数据的类型;
④parameterType表示传 入参数的类型。
代码测试
书写测试类(核心操作: 获取SqlSession 数据会话对象,调用其提供的方法实现对数据库的操作):
//使用类加载器加载mybatis的配置文件,并构建sqlSession的工厂 InputStream is = Resources.getResourceAsStream(“xml”); SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is); // 获取SqlSession 对象 SqlSession session = sessionFactory.openSession(); //获得相关的dao IUserDao userDao = session.getMapper(IUserDao.class);
API解析:
1、SqlSessionFactoryBuilder :
该对象负责根据配置文件SqlMapConfig.xml构建SqlSessionFactory实例。
2、SqlSessionFactory :
每一个Mybatis的应用程序都将以一个SqlSessionFactory 对象为核心,该对象负责构建SqlSession实例。
3、SqlSession(数据库会话):
该对象包含了所有执行Sql操作的方法,用来执行已经映射的sql语句,不过Sqlsession打开数据库,真正 完成交互的是Executor,SqlSession对数据库的操作都是通过Executor来完成的,Executor是动态创建,不需要我们 去管理。
CURD操作
1.单表增加操作:
usermapper.xml:
<insert id="saveUser" parameterType="entity.BankUser" >
INSERT INTO bank VALUES(#id,#user_name,#password,#address)
</insert>
java代码:
UserDAO userDAO=sqlSession.getMapper(UserDAO.class); User user=new User(); int i=userDAO.addUser(user); sqlSession.commit();
1、这里就算不写ResultType 也可以得到默认的返回值int,
2、mybatis框架独立运行时,需要手动控制事物,进行打开、提交、回滚、关闭操作。若集成了Spring框架, 则可以将其托管到Spring中自动管理。
2.单表修改操作:
usermapper.xml:
<update id="upadateUserName" parameterType="entity.UserBean"> UPDATE bank SET user_name=#user_name WHERE id=#id </update>
java代码:
int i=userDAO.updateUser(user); session.commit();
3.单表删除操作:
usermapper.xml:
<delete id="deleteUserName" parameterType="String"> DELETE FROM bank WHERE id=#id </delete>
java代码;
int i=userDAO.deleteUserById(“1”); session.commit();
4.单表查询操作:
1 查询单条数据:
usermapper.xml:
<select id="findUserById" parameterType="String"resultType="entity.UserBean"> select * from bank where id=#id </select>
java代码:
UserDAO userDAO=sqlSession.getMapper(UserDAO.class); BankUser bankUser=userDAO.getUserInfoById("1");
2 查询多条数据:
usermapper.xml:
<select id="findUserById" resultType="entity.UserBean"> select * from bank </select>
java代码:
UserDAO userDAO=sqlSession.getMapper(UserDAO.class); List<UserBean> list =userDAO.userDAO.getAllBankUser1();
注:这里需要注意一个问题就是resultType代表的是List中的元素类型,而不应该是List本身,所
以大家会看到如果我们想获取一个UserBean集合, 在配置不应该是resultType=“List”
3.查询数据返回一个Map(Mybatis自动将数据装入map中,键是字段名,值是字段值)类型:
usermapper.xml:
<select id="findUserById" parameterType="String" resultType="Map"> select * from bank where id=#id </select>
java代码:
UserDAO userDAO=sqlSession.getMapper(UserDAO.class); Map<String,Object> map=userDAO.getUserById("02");
4 查询单个字段:
usermapper.xml:
<select id="findUserById" parameterType="String" resultType="String"> select userName from bank where id=#id </select>
java代码:
UserDAO userDAO=sqlSession.getMapper(UserDAO.class); String userName=userDAO.getUserNameById("张三");
5.关于模糊查询:
我们知道模糊查询需要使用通配符 %,但是如果直接使用 #,明显不能实现的(下面会讲到#和$的区别):
SELECT * FROM bank WHERE user_name LIKE #name
所以我们可能会:
SELECT * FROM bank WHERE user_name LIKE ‘ $value ‘
但是使用 $ 也是我们不提倡的方式,所以此时我们可以使用concat函数
SELECT * FROM bank WHERE user_name LIKE CONCAT(‘ ‘,#name,‘ ‘)
Mybatis中#和 $参数取值:
参数的值的获取问题:
在Mybatis的映射配置文件中可以通过# 或 $ 这两种方式实现参数值的获取,一般来说能使用# 就不要使 用 $ 。
1、当传入参数为String类型时:
使用# 方式可以 通过 #参数名 或者默认的 #_parameter 来获取参数值,
但是使用$ 时,不能直接通过$参数名来获取,需要通过默认方式 $value 来取值
2、# 和 $ 取值的区别:
#进行参数获取时,会把参数转成字符串,即会自动加上一个引号 ‘ ’ ,如
select * from bank where name= #name
传入名字 “ zhangsan”,最终得到的是 :
select * from bank where name= ‘ zhangsan’
$是将传入的数据直接显示生成在sql中:
select * from bank where name= $value
传入名字 “zhangsan”,最终得到:
select * from bank where name = zhangsan
直接运行报错,所以需要我们手动添加 ‘ ‘:
select * from bank where name= ‘ $value ’
但是这样做会带来非常严重的sql注入
比如传入这样的参数:
userDAO.getUserIByPsd(" pwd111 ‘ OR ‘1‘=‘1 ")
实际上是
select * from bank where password= ‘ pwd111 ‘ OR ‘1‘=‘1‘
3、$ 的使用场景:
多数情况下我们应该使用# ,但是有些时候我们需要使用$,比如进行动态排序时,根据传入字段排序:
SELECT * FROM bank order by # columnName
比如说按照工资排序,你传入salary这个字段,结果:
SELECT * FROM bank order by ‘salary‘
这样明显排序时不起作用的,我们需要
SELECT * FROM bank order by $ columnName
所以说$ 方式一般用于传入数据库对象,例如传入表名 ,列名这种。
Mybatis多参数查询映射:
当sql语句只需要一个参数作为条件时,那么只要通过#参数名便可获得该参数值,但是当有多参数时, 这样做会直接报错,这里提供如下解决方案:
- 将多个参数传入map, 然后#keyName 获取
- 将多个参数封装到实体类,然后#属性名获取
- MyBatis还提供了一个使用@Param注解来参入多个参数的方式。这种方式需要在接口的参数上添加
public UserBean checkLogin(@Param(value="name")String userName, @Param(value="password")String password);
在映射文件中便可以通过 #name #password 取出。
ResultType和resultMap
MyBatis中在查询进行select映射的时候,返回数据类型可以用resultType,也可以用resultMap,resultType是直接表示返回类型的,而resultMap则是对外部ResultMap的引用,但是在同一个select节点中两 者不能够同时存在。
在MyBatis进行查询映射时,其实查询出来的每一个属性都是放在一个对应的Map里面的,其中键是属 性名,值则是其对应的值。
当提供的返回类型属性是resultType时,MyBatis会将Map里面的键值对取出赋给resultType所指定的对象 对应的属性。所以其实MyBatis的每一个查询映射的返回类型都是ResultMap,只是当提供的返回类型属性是resultType的时候,MyBatis对自动的给把对应的值赋给resultType所指定对象的属性。
<!-- 当表的字段名和实体类的属性名不一致时,MyBatis在进行数据映射时就失败,此时用resultMap解决此问题 --> <select id="findById3" parameterType="String" resultMap="userMap"> SELECT * FROM bank WHERE id=#id </select>
<!--id属性: resultMap标签的标识 ; type : 返回值的全限定类名,或类型别名 --> <resultMap type="entity.UserBean" id="userMap"> <id property="userId" column="id"/> <result property="userName" column="user_name"/> </resultMap>
注: resultMap 子节点有6个,①id元素 ,用于设置表的主键字段与实体类属性的映射关系,
②result元素 ,用于设置表普通字段与实体类属性的映射关系,其他作了解 。
子节点属性: property: 属性名 column:表的字段名。
以上是关于Mybatis基础的主要内容,如果未能解决你的问题,请参考以下文章