Mybatis 框架第二篇

Mybatis 框架第二篇

1.1 mybatis 环境搭建步骤

第⼀步:创建 maven ⼯程

第⼆步:导⼊坐标

第三步:编写必要代码(实体类和持久层接⼝)

第四步:编写 SqlMapConfig.xml

第五步:编写映射配置⽂件

第六步:编写测试类

2章 基于代理 Dao 实现 CRUD 操作

使⽤要求:

1、持久层接⼝和持久层接⼝的映射配置必须在相同的包下

2、持久层映射配置中 mapper 标签的 namespace 属性取值必须是持久层接⼝的全限定类名

3、SQL 语句的配置标签,,,的 id 属性必须和持久层接⼝的⽅法名相同。

2.1 根据 ID 查询

2.1.1 在持久层接⼝中添加 findById ⽅法

/

\ 根据 id 查询

\ @param userId

\ @return

/

User findById(Integer userId);

2.1.2 在⽤户的映射配置⽂件中配置

<!-- 根据 id 查询 -->

<select id="findById" resultType="com.soft.domain.User" parameterType="int">

select from user where id = #{uid}

</select>

细节:

resultType 属性:

⽤于指定结果集的类型。

parameterType 属性:

⽤于指定传⼊参数的类型。

sql 语句中使⽤#{}字符:

它代表占位符,相当于原来 jdbc 部分所学的?,都是⽤于执⾏语句时替换实际的数据。

具体的数据是由#{}⾥⾯的内容决定的。

\#{}中内容的写法:

由于数据类型是基本类型,所以此处可以随意写。

2.1.3 在测试类添加测试

import org.junit.After;

import org.junit.Before;

import org.junit.Test;

public class MybastisCRUDTest {

 private InputStream in;

 private SqlSessionFactory factory;

 private SqlSession session;

 private IUserDao userDao;

 @Test

 public void testFindOne() {

 //6.执⾏操作

 User user = userDao.findById(41);

 System.out.println(user); }

 @Before//在测试⽅法执⾏之前执⾏

 public void init() throws Exception {

 //1.读取配置⽂件

 in = Resources.getResourceAsStream("SqlMapConfig.xml");

 //2.创建构建者对象

 SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();

 //3.创建 SqlSession ⼯⼚对象

 factory = builder.build(in);

 //4.创建 SqlSession 对象

 session = factory.openSession();

 //5.创建 Dao 的代理对象

 userDao = session.getMapper(IUserDao.class);

 }

 @After//在测试⽅法执⾏完成之后执⾏

 public void destroy() throws Exception {

 session.commit();

 //7.释放资源

 session.close();

 in.close();

 }

}

2.2 保存操作

2.2.1 在持久层接⼝中添加新增⽅法

/**

 \* 保存⽤户

 \* @param user

 \* @return

 */

 int saveUser(User user);

2.2.2 在⽤户的映射配置⽂件中配置

 <insert id="saveUser" parameterType="com.soft.domain.User" >

-- 这⾥得到插⼊的id进⾏返回

 <selectKey keyColumn="id" keyProperty="id" resultType="int">

 select last_insert_id();

 </selectKey>

-- 插⼊语句

 insert into user(username,birthday,sex,address)

 values (#{username},#{birthday},#{sex},#{address})

 </insert>

细节:parameterType 属性:

代表参数的类型,因为我们要传⼊的是⼀个类的对象,所以类型就写类的全名称。

sql 语句中使⽤#{}字符:

它代表占位符,相当于原来 jdbc 部分所学的?,都是⽤于执⾏语句时替换实际的数据。

具体的数据是由#{}⾥⾯的内容决定的。

\#{}中内容的写法:

由于我们保存⽅法的参数是 ⼀个 User 对象,此处要写 User 对象中的属性名称。

它⽤的是 ognl 表达式。

ognl 表达式:

它是 apache 提供的⼀种表达式语⾔,全称是:

Object Graphic Navigation Language 对象图导航语⾔

它是按照⼀定的语法格式来获取数据的。

语法格式就是使⽤ #{对象.对象}的⽅式

\#{user.username}它会先去找 user 对象,然后在 user 对象中找到 username 属性,并调⽤

getUsername()⽅法把值取出来。但是我们在 parameterType 属性上指定了实体类名称,所以可以省略 user.

⽽直接写 username。

2.2.4 新增⽤户 id 的返回值

新增⽤户后,同时还要返回当前新增⽤户的 id 值,因为 id 是由数据库的⾃动增⻓来实现的,所以就相当于我们要在新增后将⾃动增⻓ auto_increment 的值返回。

 <insert id="saveUser" parameterType="com.soft.domain.User" >

-- 这⾥得到插⼊的id进⾏返回

 <selectKey keyColumn="id" keyProperty="id" resultType="int">

 select last_insert_id();

 </selectKey>

-- 插⼊语句

 insert into user(username,birthday,sex,address)

 values (#{username},#{birthday},#{sex},#{address})

 </insert>

2.2.5****保存⽤户代码测试

 @Test

 public void testSaveUser(){

 /* User user = userDao.findById(42);

 user.setUsername("hhhhhh");*/

 User user = new User();

 user.setUsername("⼩灰2020");

 user.setAddress("hz");

 user.setBirthday(new Date());

 user.setSex("男");

 int i = userDao.saveUser(user);

 //在这⾥使⽤对象的getId()获取返回值

 System.out.println(user.getId());

 System.out.println("插⼊后的id值:"+i);

 }

2.3 ⽤户更新

2.3.1 在持久层接⼝中添加更新⽅法

/**

\* 更新⽤户

\* @param user

\* @return 影响数据库记录的⾏数

*/

int updateUser(User user);

2.3.2 在⽤户的映射配置⽂件中配置

<!--更新⽤户-->

<update id="updateUser" parameterType="com.soft.domain.User">

 update user set username=#{username},birthday=#{birthday},sex=#{sex},address=# 

{address}

 where id = #{id}

</update>

2.3.3 加⼊更新的测试⽅法

@Test

public void testUpdateUser(){

 User user = userDao.findById(52);

 user.setAddress("深圳");

 int i = userDao.updateUser(user);

 System.out.println("影响的⾏数:"+i);

}

2.4 ⽤户删除

2.4.1 在持久层接⼝中添加删除⽅法

/**

\* 根据 id 删除⽤户

*

\* @param userId

\* @return

*/

int deleteUser(Integer userId);

2.4.2 在⽤户的映射配置⽂件中配置

 <!-- 删除⽤户 -->

 <delete id="deleteUser" parameterType="java.lang.Integer">

 delete from user where id = #{uid}

 </delete>

2.4.3 加⼊删除的测试⽅法

 @Test

 public void testDeleteUser() throws Exception {

 //6.执⾏操作

 int res = userDao.deleteUser(52);

 System.out.println(res);

 }

2.5 ⽤户模糊查询

2.5.1 在持久层接⼝中添加模糊查询⽅法

/**

\* 根据名称模糊查询

\* @param username

\* @return

*/

List<User> findByName(String username);

2.5.2 在⽤户的映射配置⽂件中配置

<select id="findByName" resultType="com.soft.domain.User" parameterType="String">

 select * from user where username like #{username};

</select>

2.5.3 加⼊模糊查询的测试⽅法

@Test

public void testFindByName(){

List<User> users = userDao.findByName("%王%");

 for (User user : users) {

 System.out.println(user);

 }

 }

2.5.4 模糊查询的另⼀种配置⽅式

<select id="findByName" parameterType="String" resultType="com.soft.domain.User">

 select * from user where username like '${value}';

</select> 

我们在上⾯将原来的#{}占位符,改成了 v a l u e 。 注 意 如 果 ⽤ 模 糊 查 询 的 这 种 写 法 , 那 么 {value}。注意如果⽤模糊查询的这种写法,那么 value{value}的写法就是固定的,不能写成其它名字。

**2.5.5 #{}**与${}的区别

#{}表示⼀个占位符号

通过#{}可以实现 preparedStatement 向占位符中设置值,⾃动进⾏ java 类型和 jdbc 类型转换,

#{}可以有效防⽌ sql 注⼊。 #{}可以接收简单类型值或 pojo 属性值。 如果 parameterType 传输单个简单类型值,#{}括号中可以是 value 或其它名称。

${}表示拼接sql串

通过${}可以将 parameterType 传⼊的内容拼接在 sql 中且不进⾏ jdbc 类型转换, 可 以 接 收 简 单 类 型 值 或 p o j o 属 性 值 , 如 果 p a r a m e t e r T y p e 传 输 单 个 简 单 类 型 值 , {}可以接收简单类型值或 pojo 属性值,如果 parameterType 传输单个简单类型值, pojoparameterType{}括号中只能是 value。

2.5.6 模糊查询的**${value}**源码分析

在这里插入图片描述

这就说明了源码中指定了读取的 key 的名字就是”value”,所以我们在绑定参数时就只能叫 value 的名字

了。

2.6 查询使⽤聚合函数

2.6.1 在持久层接⼝中添加模糊查询⽅法

/**

\* 查询总记录条数

\* @return

*/

int findTotal();

2.6.2 在⽤户的映射配置⽂件中配置

<!-- 查询总记录条数 -->

<select id="findTotal" resultType="int">

select count(*) from user;

</select>

2.6.3 加⼊聚合查询的测试⽅法

@Test

public void testFindTotal() {

 int total = userDao.findTotal();

 System.out.println(total);

}

2.7 Mybatis JDBC 编程的⽐较

1.数据库链接创建、释放频繁造成系统资源浪费从⽽影响系统性能,如果使⽤数据库链接池可解决此问题。解决:

在 SqlMapConfig.xml 中配置数据链接池,使⽤连接池管理数据库链接。

2.Sql 语句写在代码中造成代码不易维护,实际应⽤ sql 变化的可能较⼤,sql 变动需要改变 java 代码。

解决:

将 Sql 语句配置在 XXXXmapper.xml ⽂件中与 java 代码分离。

3.向 sql 语句传参数麻烦,因为 sql 语句的 where 条件不⼀定,可能多也可能少,占位符需要和参数对应。

解决:

Mybatis ⾃动将 java 对象映射⾄ sql 语句,通过 statement 中的 parameterType 定义输⼊参数的类型。

4.对结果集解析麻烦,sql 变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成 pojo 对象解析⽐较⽅便。

解决:

Mybatis ⾃动将 sql 执⾏结果映射⾄ java 对象,通过 statement 中的 resultType 定义输出结果的类型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值