Mybatis—curd

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语句只需要一个参数作为条件时,那么只要通过#{参数名}便可获得该参数值,但是当有多参数时, 这样做会直接报错,这里提供如下解决方案:

  1. 将多个参数传入map, 然后#{keyName} 获取
  2. 将多个参数封装到实体类,然后#{属性名}获取
  3. 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:表的字段名。

posted @ 2019-06-29 22:02  橘子洲头。  阅读(196)  评论(0编辑  收藏  举报