北京动力节点-王鹤-MyBatis框架.pdf

第一章

1、三层架构

  1. 界面层: 和用户打交道的, 接收用户的请求参数, 显示处理结果的。(jsp html servlet)<br /> 业务逻辑层: 接收了界面层传递的数据,计算逻辑,调用数据库,获取数据<br /> 数据访问层: 就是访问数据库, 执行对数据的查询,修改,删除等等的
  2. 三层对应的包<br /> 界面层: controller servlet)<br /> 业务逻辑层: service 包(XXXService类)<br /> 数据访问层: dao包(XXXDao类)
  3. 三层中类的交互<br /> 用户使用界面层--> 业务逻辑层--->数据访问层(持久层)-->数据库(mysql)<br /> <br /> 三层对应的处理框架<br /> 界面层---servlet---springmvc(框架)<br /> 业务逻辑层---service类--spring(框架)<br /> 数据访问层---dao类--mybatis(框架)<br />

2、框架

框架是一个舞台, 一个模版

模版:
1. 规定了好一些条款,内容。
2. 加入自己的东西

框架是一个模块
1.框架中定义好了一些功能。这些功能是可用的。
2.可以加入项目中自己的功能, 这些功能可以利用框架中写好的功能。

框架是一个软件,半成品的软件,定义好了一些基础功能, 需要加入你的功能就是完整的。
基础功能是可重复使用的,可升级的。

框架特点:
1. 框架一般不是全能的, 不能做所有事情
2. 框架是针对某一个领域有效。 特长在某一个方面,比如mybatis做数据库操作强,但是他不能做其它的。
3. 框架是一个软件

mybatis框架

一个框架,早期叫做ibatis, 代码在github。
mybatis是 MyBatis SQL Mapper Framework for Java (sql映射框架)
1)sql mapper :sql映射
可以把数据库表中的一行数据 映射为 一个java对象。
一行数据可以看做是一个java对象。操作这个对象,就相当于操作表中的数据
2) Data Access Objects(DAOs) : 数据访问 , 对数据库执行增删改查。

  1. mybatis提供了哪些功能:
  1. 提供了创建Connection ,Statement, ResultSet的能力 ,不用开发人员创建这些对象了
    2. 提供了执行sql语句的能力, 不用你执行sql
    3. 提供了循环sql, 把sql的结果转为java对象, List集合的能力
    while (rs.next()) {
    Student stu = new Student();
    stu.setId(rs.getInt(“id”));
    stu.setName(rs.getString(“name”));
    stu.setAge(rs.getInt(“age”));
    //从数据库取出数据转为 Student 对象,封装到 List 集合
    stuList.add(stu);
    }
    4.提供了关闭资源的能力,不用你关闭Connection, Statement, ResultSet

    开发人员做的是: 提供sql语句
    最后是: 开发人员提供sql语句—mybatis处理sql—-开发人员得到List集合或java对象(表中的数据)

    总结:
    mybatis是一个sql映射框架,提供的数据库的操作能力。增强的JDBC,
    使用mybatis让开发人员集中精神写sql就可以了,不必关心Connection,Statement,ResultSet
    的创建,销毁,sql的执行。

示例代码:

pom.xml文件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <groupId>com.bjpowernode</groupId>
  6. <artifactId>ch01-hello-mybatis</artifactId>
  7. <version>1.0-SNAPSHOT</version>
  8. <!--<packaging>jar</packaging>-->
  9. <properties>
  10. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  11. <maven.compiler.source>1.8</maven.compiler.source>
  12. <maven.compiler.target>1.8</maven.compiler.target>
  13. </properties>
  14. <dependencies>
  15. <dependency>
  16. <groupId>junit</groupId>
  17. <artifactId>junit</artifactId>
  18. <version>4.11</version>
  19. <scope>test</scope>
  20. </dependency>
  21. <!--mybatis依赖-->
  22. <dependency>
  23. <groupId>org.mybatis</groupId>
  24. <artifactId>mybatis</artifactId>
  25. <version>3.5.1</version>
  26. </dependency>
  27. <!--mysql驱动-->
  28. <dependency>
  29. <groupId>mysql</groupId>
  30. <artifactId>mysql-connector-java</artifactId>
  31. <version>5.1.9</version>
  32. </dependency>
  33. </dependencies>
  34. <build>
  35. <resources>
  36. <resource>
  37. <directory>src/main/java</directory><!--所在的目录-->
  38. <includes><!--包括目录下的.properties,.xml 文件都会扫描到-->
  39. <include>**/*.properties</include>
  40. <include>**/*.xml</include>
  41. </includes>
  42. <filtering>false</filtering>
  43. </resource>
  44. </resources>
  45. </build>
  46. </project>

StudentDao数据库操作接口

  1. package com.bjpowernode.dao;
  2. import com.bjpowernode.domain.Student;
  3. import java.util.List;
  4. //接口操作student表
  5. public interface StudentDao {
  6. //查询student表的所有的数据
  7. public List<Student> selectStudents();
  8. //插入方法
  9. //参数: student ,表示要插入到数据库的数据
  10. //返回值: int , 表示执行insert操作后的 影响数据库的行数
  11. public int insertStudent(Student student);
  12. }

StudentDao.xml

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="com.bjpowernode.dao.StudentDao">
  6. <!--
  7. select:表示查询操作。
  8. id: 你要执行的sql语法的唯一标识, mybatis会使用这个id的值来找到要执行的sql语句
  9. 可以自定义,但是要求你使用接口中的方法名称。
  10. resultType:表示结果类型的, sql语句执行后得到ResultSet,遍历这个ResultSet得到java对象的类型。
  11. 值写的类型的全限定名称
  12. -->
  13. <select id="selectStudents" resultType="com.bjpowernode.domain.Student" >
  14. select id,name,email,age from student order by id
  15. </select>
  16. <!--插入操作-->
  17. <insert id="insertStudent">
  18. insert into student values(#{id},#{name},#{email},#{age})
  19. </insert>
  20. </mapper>
  21. <!--
  22. sql映射文件(sql mapper): sql语句的, mybatis会执行这些sql
  23. 1.指定约束文件
  24. <!DOCTYPE mapper
  25. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  26. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  27. mybatis-3-mapper.dtd是约束文件的名称, 扩展名是dtd的。
  28. 2.约束文件作用: 限制,检查在当前文件中出现的标签,属性必须符合mybatis的要求。
  29. 3.mapper 是当前文件的根标签,必须的。
  30. namespace:叫做命名空间,唯一值的, 可以是自定义的字符串。
  31. 要求你使用dao接口的全限定名称。
  32. 4.在当前文件中,可以使用特定的标签,表示数据库的特定操作。
  33. <select>:表示执行查询,select语句
  34. <update>:表示更新数据库的操作, 就是在<update>标签中 写的是update sql语句
  35. <insert>:表示插入, 放的是insert语句
  36. <delete>:表示删除, 执行的delete语句
  37. -->

Student实体类

  1. package com.bjpowernode.domain;
  2. //推荐和表名一样。容易记忆
  3. public class Student {
  4. //定义属性, 目前要求是属性名和列名一样。
  5. private Integer id;
  6. private String name;
  7. private String email;
  8. private Integer age;
  9. public Integer getId() {
  10. return id;
  11. }
  12. public void setId(Integer id) {
  13. this.id = id;
  14. }
  15. public String getName() {
  16. return name;
  17. }
  18. public void setName(String name) {
  19. this.name = name;
  20. }
  21. public String getEmail() {
  22. return email;
  23. }
  24. public void setEmail(String email) {
  25. this.email = email;
  26. }
  27. public Integer getAge() {
  28. return age;
  29. }
  30. public void setAge(Integer age) {
  31. this.age = age;
  32. }
  33. @Override
  34. public String toString() {
  35. return "Student{" +
  36. "id=" + id +
  37. ", name='" + name + '\'' +
  38. ", email='" + email + '\'' +
  39. ", age=" + age +
  40. '}';
  41. }
  42. }

mybatis获取SqlSession工具类

  1. package com.bjpowernode.utils;
  2. import jdk.internal.util.xml.impl.Input;
  3. import org.apache.ibatis.io.Resources;
  4. import org.apache.ibatis.session.SqlSession;
  5. import org.apache.ibatis.session.SqlSessionFactory;
  6. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
  7. import java.io.IOException;
  8. import java.io.InputStream;
  9. public class MyBatisUtils {
  10. private static SqlSessionFactory factory = null;
  11. static {
  12. String config="mybatis.xml"; // 需要和你的项目中的文件名一样
  13. try {
  14. InputStream in = Resources.getResourceAsStream(config);
  15. //创建SqlSessionFactory对象,使用SqlSessionFactoryBuild
  16. factory = new SqlSessionFactoryBuilder().build(in);
  17. } catch (IOException e) {
  18. e.printStackTrace();
  19. }
  20. }
  21. //获取SqlSession的方法
  22. public static SqlSession getSqlSession() {
  23. SqlSession sqlSession = null;
  24. if( factory != null){
  25. sqlSession = factory.openSession();// 非自动提交事务
  26. }
  27. return sqlSession;
  28. }
  29. }

执行SQL语句

  1. package com.bjpowernode;
  2. import com.bjpowernode.domain.Student;
  3. import org.apache.ibatis.io.Resources;
  4. import org.apache.ibatis.session.SqlSession;
  5. import org.apache.ibatis.session.SqlSessionFactory;
  6. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
  7. import java.io.IOException;
  8. import java.io.InputStream;
  9. import java.util.List;
  10. public class MyApp {
  11. public static void main(String[] args) throws IOException {
  12. //访问mybatis读取student数据
  13. //1.定义mybatis主配置文件的名称, 从类路径的根开始(target/clasess)
  14. String config="mybatis.xml";
  15. //2.读取这个config表示的文件
  16. InputStream in = Resources.getResourceAsStream(config);
  17. //3.创建了SqlSessionFactoryBuilder对象
  18. SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
  19. //4.创建SqlSessionFactory对象
  20. SqlSessionFactory factory = builder.build(in);
  21. //5.获取SqlSession对象,从SqlSessionFactory中获取SqlSession
  22. SqlSession sqlSession = factory.openSession();
  23. //6.【重要】指定要执行的sql语句的标识。 sql映射文件中的namespace + "." + 标签的id值
  24. //String sqlId = "com.bjpowernode.dao.StudentDao" + "." + "selectStudents";
  25. String sqlId = "com.bjpowernode.dao.StudentDao.selectStudents";
  26. //7. 重要】执行sql语句,通过sqlId找到语句
  27. List<Student> studentList = sqlSession.selectList(sqlId);
  28. //8.输出结果
  29. //studentList.forEach( stu -> System.out.println(stu));
  30. for(Student stu : studentList){
  31. System.out.println("查询的学生="+stu);
  32. }
  33. //9.关闭SqlSession对象
  34. sqlSession.close();
  35. }
  36. }

通过工具类执行SQL语句

  1. package com.bjpowernode;
  2. import com.bjpowernode.domain.Student;
  3. import com.bjpowernode.utils.MyBatisUtils;
  4. import org.apache.ibatis.io.Resources;
  5. import org.apache.ibatis.session.SqlSession;
  6. import org.apache.ibatis.session.SqlSessionFactory;
  7. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
  8. import java.io.IOException;
  9. import java.io.InputStream;
  10. import java.util.List;
  11. public class MyApp2 {
  12. public static void main(String[] args) throws IOException {
  13. //获取SqlSession对象,从SqlSessionFactory中获取SqlSession
  14. SqlSession sqlSession = MyBatisUtils.getSqlSession();
  15. //【重要】指定要执行的sql语句的标识。 sql映射文件中的namespace + "." + 标签的id值
  16. String sqlId = "com.bjpowernode.dao.StudentDao.selectStudents";
  17. //【重要】执行sql语句,通过sqlId找到语句
  18. List<Student> studentList = sqlSession.selectList(sqlId);
  19. //输出结果
  20. studentList.forEach( stu -> System.out.println(stu));
  21. //关闭SqlSession对象
  22. sqlSession.close();
  23. }
  24. }

mybatis.xml

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration
  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <configuration>
  6. <!--settings:控制mybatis全局行为-->
  7. <settings>
  8. <!--设置mybatis输出日志-->
  9. <setting name="logImpl" value="STDOUT_LOGGING" />
  10. </settings>
  11. <!--环境配置: 数据库的连接信息
  12. default:必须和某个environmentid值一样。
  13. 告诉mybatis使用哪个数据库的连接信息。也就是访问哪个数据库
  14. -->
  15. <environments default="mydev">
  16. <!-- environment : 一个数据库信息的配置, 环境
  17. id:一个唯一值,自定义,表示环境的名称。
  18. -->
  19. <environment id="mydev">
  20. <!--
  21. transactionManager mybatis的事务类型
  22. type: JDBC(表示使用jdbc中的Connection对象的commitrollback做事务处理)
  23. -->
  24. <transactionManager type="JDBC"/>
  25. <!--
  26. dataSource:表示数据源,连接数据库的
  27. type:表示数据源的类型, POOLED表示使用连接池
  28. -->
  29. <dataSource type="POOLED">
  30. <!--
  31. driver, user, username, password 是固定的,不能自定义。
  32. -->
  33. <!--数据库的驱动类名-->
  34. <property name="driver" value="com.mysql.jdbc.Driver"/>
  35. <!--连接数据库的url字符串-->
  36. <property name="url" value="jdbc:mysql://localhost:3306/springdb"/>
  37. <!--访问数据库的用户名-->
  38. <property name="username" value="root"/>
  39. <!--密码-->
  40. <property name="password" value="123456"/>
  41. </dataSource>
  42. </environment>
  43. <!--表示线上的数据库,是项目真实使用的库-->
  44. <environment id="online">
  45. <transactionManager type="JDBC"/>
  46. <dataSource type="POOLED">
  47. <property name="driver" value="com.mysql.jdbc.Driver"/>
  48. <property name="url" value="jdbc:mysql://localhost:3306/onlinedb"/>
  49. <property name="username" value="root"/>
  50. <property name="password" value="fhwertwr"/>
  51. </dataSource>
  52. </environment>
  53. </environments>
  54. <!-- sql mapper(sql映射文件)的位置-->
  55. <mappers>
  56. <!--一个mapper标签指定一个文件的位置。
  57. 从类路径开始的路径信息。 target/clasess(类路径)
  58. -->
  59. <mapper resource="com/bjpowernode/dao/StudentDao.xml"/>
  60. <!--<mapper resource="com/bjpowernode/dao/SchoolDao.xml" />-->
  61. </mappers>
  62. </configuration>
  63. <!--
  64. mybatis的主配置文件: 主要定义了数据库的配置信息, sql映射文件的位置
  65. 1. 约束文件
  66. <!DOCTYPE configuration
  67. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  68. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  69. mybatis-3-config.dtd:约束文件的名称
  70. 2. configuration 根标签。
  71. -->

测试类

  1. package com.bjpowernode;
  2. import com.bjpowernode.domain.Student;
  3. import org.apache.ibatis.io.Resources;
  4. import org.apache.ibatis.session.SqlSession;
  5. import org.apache.ibatis.session.SqlSessionFactory;
  6. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
  7. import org.junit.Test;
  8. import java.io.IOException;
  9. import java.io.InputStream;
  10. import java.util.List;
  11. public class TestMyBatis {
  12. //测试方法,测试功能
  13. @Test
  14. public void testInsert() throws IOException {
  15. //访问mybatis读取student数据
  16. //1.定义mybatis主配置文件的名称, 从类路径的根开始(target/clasess)
  17. String config="mybatis.xml";
  18. //2.读取这个config表示的文件
  19. InputStream in = Resources.getResourceAsStream(config);
  20. //3.创建了SqlSessionFactoryBuilder对象
  21. SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
  22. //4.创建SqlSessionFactory对象
  23. SqlSessionFactory factory = builder.build(in);
  24. //5.获取SqlSession对象,从SqlSessionFactory中获取SqlSession
  25. //SqlSession sqlSession = factory.openSession();
  26. SqlSession sqlSession = factory.openSession(true);
  27. //6.【重要】指定要执行的sql语句的标识。 sql映射文件中的namespace + "." + 标签的id值
  28. String sqlId = "com.bjpowernode.dao.StudentDao.insertStudent";
  29. //7. 重要】执行sql语句,通过sqlId找到语句
  30. Student student = new Student();
  31. student.setId(1006);
  32. student.setName("关羽");
  33. student.setEmail("guanyu@163.com");
  34. student.setAge(20);
  35. int nums = sqlSession.insert(sqlId,student);
  36. //mybatis默认不是自动提交事务的, 所以在insert ,update ,delete后要手工提交事务
  37. //sqlSession.commit();
  38. //8.输出结果
  39. System.out.println("执行insert的结果="+nums);
  40. //9.关闭SqlSession对象
  41. sqlSession.close();
  42. }
  43. }

第二章

1. 主要类的介绍

1) Resources: mybatis中的一个类, 负责读取主配置文件
InputStream in = Resources.getResourceAsStream(“mybatis.xml”);

2) SqlSessionFactoryBuilder : 创建SqlSessionFactory对象,
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//创建SqlSessionFactory对象
SqlSessionFactory factory = builder.build(in);

3)SqlSessionFactory : 重量级对象, 程序创建一个对象耗时比较长,使用资源比较多。
在整个项目中,有一个就够用了。
SqlSessionFactory:接口 , 接口实现类: DefaultSqlSessionFactory
SqlSessionFactory作用: 获取SqlSession对象。SqlSession sqlSession = factory.openSession();
openSession()方法说明:
1. openSession() :无参数的, 获取是非自动提交事务的SqlSession对象
2. openSession(boolean): openSession(true) 获取自动提交事务的SqlSession.
openSession(false) 非自动提交事务的SqlSession对象

4)SqlSession:
SqlSession接口 :定义了操作数据的方法 例如 selectOne() ,selectList() ,insert(),update(), delete(), commit(), rollback()
SqlSession接口的实现类DefaultSqlSession。
使用要求: SqlSession对象不是线程安全的,需要在方法内部使用, 在执行sql语句之前,使用openSession()获取SqlSession对象。
在执行完sql语句后,需要关闭它,执行SqlSession.close(). 这样能保证他的使用是线程安全的。

1.1 示例代码:

学生Dao接口

  1. package com.bjpowernode.dao;
  2. import com.bjpowernode.domain.Student;
  3. import java.util.List;
  4. public interface StudentDao {
  5. List<Student> selectStudents();
  6. int insertStudent(Student student);
  7. }

学生Dao接口.xml

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="com.bjpowernode.dao.StudentDao">
  6. <select id="selectStudents" resultType="com.bjpowernode.domain.Student">
  7. select id,name,email,age from student order by id
  8. </select>
  9. <insert id="insertStudent">
  10. insert into student values(#{id},#{name},#{email},#{age})
  11. </insert>
  12. </mapper>

学生dao实现类

  1. package com.bjpowernode.dao.impl;
  2. import com.bjpowernode.dao.StudentDao;
  3. import com.bjpowernode.domain.Student;
  4. import com.bjpowernode.utils.MyBatisUtils;
  5. import org.apache.ibatis.session.SqlSession;
  6. import org.apache.ibatis.session.SqlSessionFactory;
  7. import java.util.List;
  8. public class StudentDaoImpl implements StudentDao {
  9. @Override
  10. public List<Student> selectStudents() {
  11. //获取SqlSession对象
  12. SqlSession sqlSession = MyBatisUtils.getSqlSession();
  13. String sqlId="com.bjpowernode.dao.StudentDao.selectStudents";
  14. //执行sql语句, 使用SqlSession类的方法
  15. List<Student> students = sqlSession.selectList(sqlId);
  16. //关闭
  17. sqlSession.close();
  18. return students;
  19. }
  20. @Override
  21. public int insertStudent(Student student) {
  22. //获取SqlSession对象
  23. SqlSession sqlSession = MyBatisUtils.getSqlSession();
  24. String sqlId="com.bjpowernode.dao.StudentDao.insertStudent";
  25. //执行sql语句, 使用SqlSession类的方法
  26. int nums = sqlSession.insert(sqlId,student);
  27. //提交事务
  28. sqlSession.commit();
  29. //关闭
  30. sqlSession.close();
  31. return nums;
  32. }
  33. }

学生实体类

  1. package com.bjpowernode.domain;
  2. public class Student {
  3. private Integer id;
  4. private String name;
  5. private String email;
  6. private Integer age;
  7. public Integer getId() {
  8. return id;
  9. }
  10. public void setId(Integer id) {
  11. this.id = id;
  12. }
  13. public String getName() {
  14. return name;
  15. }
  16. public void setName(String name) {
  17. this.name = name;
  18. }
  19. public String getEmail() {
  20. return email;
  21. }
  22. public void setEmail(String email) {
  23. this.email = email;
  24. }
  25. public Integer getAge() {
  26. return age;
  27. }
  28. public void setAge(Integer age) {
  29. this.age = age;
  30. }
  31. @Override
  32. public String toString() {
  33. return "Student{" +
  34. "id=" + id +
  35. ", name='" + name + '\'' +
  36. ", email='" + email + '\'' +
  37. ", age=" + age +
  38. '}';
  39. }
  40. }

mybatis工具类

  1. package com.bjpowernode.utils;
  2. import org.apache.ibatis.io.Resources;
  3. import org.apache.ibatis.session.SqlSession;
  4. import org.apache.ibatis.session.SqlSessionFactory;
  5. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
  6. import java.io.IOException;
  7. import java.io.InputStream;
  8. public class MyBatisUtils {
  9. private static SqlSessionFactory factory = null;
  10. static {
  11. String config="mybatis.xml"; // 需要和你的项目中的文件名一样
  12. try {
  13. InputStream in = Resources.getResourceAsStream(config);
  14. //创建SqlSessionFactory对象,使用SqlSessionFactoryBuild
  15. factory = new SqlSessionFactoryBuilder().build(in);
  16. } catch (IOException e) {
  17. e.printStackTrace();
  18. }
  19. }
  20. //获取SqlSession的方法
  21. public static SqlSession getSqlSession() {
  22. SqlSession sqlSession = null;
  23. if( factory != null){
  24. sqlSession = factory.openSession();// 非自动提交事务
  25. }
  26. return sqlSession;
  27. }
  28. }

mybatis.xml

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration
  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <configuration>
  6. <!--settings:控制mybatis全局行为-->
  7. <settings>
  8. <!--设置mybatis输出日志-->
  9. <setting name="logImpl" value="STDOUT_LOGGING"/>
  10. </settings>
  11. <environments default="mydev">
  12. <environment id="mydev">
  13. <transactionManager type="JDBC"/>
  14. <dataSource type="POOLED">
  15. <!--数据库的驱动类名-->
  16. <property name="driver" value="com.mysql.jdbc.Driver"/>
  17. <!--连接数据库的url字符串-->
  18. <property name="url" value="jdbc:mysql://localhost:3306/springdb"/>
  19. <!--访问数据库的用户名-->
  20. <property name="username" value="root"/>
  21. <!--密码-->
  22. <property name="password" value="123456"/>
  23. </dataSource>
  24. </environment>
  25. </environments>
  26. <!-- sql mapper(sql映射文件)的位置-->
  27. <mappers>
  28. <mapper resource="com/bjpowernode/dao/StudentDao.xml"/>
  29. <!--<mapper resource="com/bjpowernode/dao/SchoolDao.xml" />-->
  30. </mappers>
  31. </configuration>

pop.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <groupId>com.bjpowernode</groupId>
  6. <artifactId>ch02-mybatis-dao</artifactId>
  7. <version>1.0-SNAPSHOT</version>
  8. <properties>
  9. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  10. <maven.compiler.source>1.8</maven.compiler.source>
  11. <maven.compiler.target>1.8</maven.compiler.target>
  12. </properties>
  13. <dependencies>
  14. <dependency>
  15. <groupId>junit</groupId>
  16. <artifactId>junit</artifactId>
  17. <version>4.11</version>
  18. <scope>test</scope>
  19. </dependency>
  20. <!--mybatis依赖-->
  21. <dependency>
  22. <groupId>org.mybatis</groupId>
  23. <artifactId>mybatis</artifactId>
  24. <version>3.5.1</version>
  25. </dependency>
  26. <!--mysql驱动-->
  27. <dependency>
  28. <groupId>mysql</groupId>
  29. <artifactId>mysql-connector-java</artifactId>
  30. <version>5.1.9</version>
  31. </dependency>
  32. </dependencies>
  33. <build>
  34. <resources>
  35. <resource>
  36. <directory>src/main/java</directory><!--所在的目录-->
  37. <includes><!--包括目录下的.properties,.xml 文件都会扫描到-->
  38. <include>**/*.properties</include>
  39. <include>**/*.xml</include>
  40. </includes>
  41. <filtering>false</filtering>
  42. </resource>
  43. </resources>
  44. </build>
  45. </project>

测试类

  1. package com.bjpowernode;
  2. import com.bjpowernode.dao.StudentDao;
  3. import com.bjpowernode.dao.impl.StudentDaoImpl;
  4. import com.bjpowernode.domain.Student;
  5. import org.junit.Test;
  6. import java.util.List;
  7. public class TestMyBatis {
  8. @Test
  9. public void testSelectStudents(){
  10. //com.bjpowernode.dao.StudentDao
  11. StudentDao dao = new StudentDaoImpl();
  12. /**
  13. * List<Student> studentList = dao.selectStudents(); 调用
  14. * 1.dao对象,类型是StudentDao,全限定名称是:com.bjpowernode.dao.StudentDao
  15. * 全限定名称 和 namespace 是一样的。
  16. *
  17. * 2.方法名称, selectStudents, 这个方法就是 mapper文件中的 id值 selectStudents
  18. *
  19. * 3.通过dao中方法的返回值也可以确定MyBatis要调用的SqlSession的方法
  20. * 如果返回值是List ,调用的是SqlSession.selectList()方法。
  21. * 如果返回值 int ,或是非List的, 看mapper文件中的 标签是<insert>,<update> 就会调用
  22. * SqlSession的insert, update等方法
  23. *
  24. * mybatis的动态代理: mybatis根据 dao的方法调用,获取执行sql语句的信息。
  25. * mybatis根据你的dao接口,创建出一个dao接口的实现类, 并创建这个类的对象。
  26. * 完成SqlSession调用方法, 访问数据库。
  27. *
  28. */
  29. List<Student> studentList = dao.selectStudents();
  30. for(Student stu:studentList){
  31. System.out.println(stu);
  32. }
  33. }
  34. @Test
  35. public void testInsertStudent(){
  36. StudentDao dao = new StudentDaoImpl();
  37. Student student = new Student();
  38. student.setId(1005);
  39. student.setName("盾山");
  40. student.setEmail("dunshan@qq.com");
  41. int nums = dao.insertStudent(student);
  42. System.out.println("添加对象的数量:"+nums);
  43. }
  44. }

第三章

1. 动态代理:

使用SqlSession.getMapper(dao接口.class) 获取这个dao接口的对象

1.1 代码实现

studentDao接口

  1. package com.bjpowernode.dao;
  2. import com.bjpowernode.domain.Student;
  3. import java.util.List;
  4. public interface StudentDao {
  5. List<Student> selectStudents();
  6. int insertStudent(Student student);
  7. }

studentDao.xml

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="com.bjpowernode.dao.StudentDao">
  6. <select id="selectStudents" resultType="com.bjpowernode.domain.Student">
  7. select id,name,email,age from student order by id
  8. </select>
  9. <insert id="insertStudent">
  10. insert into student values(#{id},#{name},#{email},#{age})
  11. </insert>
  12. </mapper>

学生实体类

  1. package com.bjpowernode.domain;
  2. public class Student {
  3. private Integer id;
  4. private String name;
  5. private String email;
  6. private Integer age;
  7. public Integer getId() {
  8. return id;
  9. }
  10. public void setId(Integer id) {
  11. this.id = id;
  12. }
  13. public String getName() {
  14. return name;
  15. }
  16. public void setName(String name) {
  17. this.name = name;
  18. }
  19. public String getEmail() {
  20. return email;
  21. }
  22. public void setEmail(String email) {
  23. this.email = email;
  24. }
  25. public Integer getAge() {
  26. return age;
  27. }
  28. public void setAge(Integer age) {
  29. this.age = age;
  30. }
  31. @Override
  32. public String toString() {
  33. return "Student{" +
  34. "id=" + id +
  35. ", name='" + name + '\'' +
  36. ", email='" + email + '\'' +
  37. ", age=" + age +
  38. '}';
  39. }
  40. }

mybatis工具类

  1. package com.bjpowernode.utils;
  2. import org.apache.ibatis.io.Resources;
  3. import org.apache.ibatis.session.SqlSession;
  4. import org.apache.ibatis.session.SqlSessionFactory;
  5. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
  6. import java.io.IOException;
  7. import java.io.InputStream;
  8. public class MyBatisUtils {
  9. private static SqlSessionFactory factory = null;
  10. static {
  11. String config="mybatis.xml"; // 需要和你的项目中的文件名一样
  12. try {
  13. InputStream in = Resources.getResourceAsStream(config);
  14. //创建SqlSessionFactory对象,使用SqlSessionFactoryBuild
  15. factory = new SqlSessionFactoryBuilder().build(in);
  16. } catch (IOException e) {
  17. e.printStackTrace();
  18. }
  19. }
  20. //获取SqlSession的方法
  21. public static SqlSession getSqlSession() {
  22. SqlSession sqlSession = null;
  23. if( factory != null){
  24. sqlSession = factory.openSession();// 非自动提交事务
  25. }
  26. return sqlSession;
  27. }
  28. }

mybatis.xml

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration
  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <configuration>
  6. <!--settings:控制mybatis全局行为-->
  7. <settings>
  8. <!--设置mybatis输出日志-->
  9. <setting name="logImpl" value="STDOUT_LOGGING"/>
  10. </settings>
  11. <environments default="mydev">
  12. <environment id="mydev">
  13. <transactionManager type="JDBC"/>
  14. <dataSource type="POOLED">
  15. <!--数据库的驱动类名-->
  16. <property name="driver" value="com.mysql.jdbc.Driver"/>
  17. <!--连接数据库的url字符串-->
  18. <property name="url" value="jdbc:mysql://localhost:3306/springdb"/>
  19. <!--访问数据库的用户名-->
  20. <property name="username" value="root"/>
  21. <!--密码-->
  22. <property name="password" value="123456"/>
  23. </dataSource>
  24. </environment>
  25. </environments>
  26. <!-- sql mapper(sql映射文件)的位置-->
  27. <mappers>
  28. <mapper resource="com/bjpowernode/dao/StudentDao.xml"/>
  29. <!--<mapper resource="com/bjpowernode/dao/SchoolDao.xml" />-->
  30. </mappers>
  31. </configuration>

pom.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <groupId>com.bjpowernode</groupId>
  6. <artifactId>ch03-proxy-dao</artifactId>
  7. <version>1.0-SNAPSHOT</version>
  8. <properties>
  9. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  10. <maven.compiler.source>1.8</maven.compiler.source>
  11. <maven.compiler.target>1.8</maven.compiler.target>
  12. </properties>
  13. <dependencies>
  14. <dependency>
  15. <groupId>junit</groupId>
  16. <artifactId>junit</artifactId>
  17. <version>4.11</version>
  18. <scope>test</scope>
  19. </dependency>
  20. <!--mybatis依赖-->
  21. <dependency>
  22. <groupId>org.mybatis</groupId>
  23. <artifactId>mybatis</artifactId>
  24. <version>3.5.1</version>
  25. </dependency>
  26. <!--mysql驱动-->
  27. <dependency>
  28. <groupId>mysql</groupId>
  29. <artifactId>mysql-connector-java</artifactId>
  30. <version>5.1.9</version>
  31. </dependency>
  32. </dependencies>
  33. <build>
  34. <resources>
  35. <resource>
  36. <directory>src/main/java</directory><!--所在的目录-->
  37. <includes><!--包括目录下的.properties,.xml 文件都会扫描到-->
  38. <include>**/*.properties</include>
  39. <include>**/*.xml</include>
  40. </includes>
  41. <filtering>false</filtering>
  42. </resource>
  43. </resources>
  44. </build>
  45. </project>

测试类

  1. package com.bjpowernode;
  2. import com.bjpowernode.dao.StudentDao;
  3. import com.bjpowernode.domain.Student;
  4. import com.bjpowernode.utils.MyBatisUtils;
  5. import org.apache.ibatis.session.SqlSession;
  6. import org.apache.ibatis.session.SqlSessionFactory;
  7. import org.junit.Test;
  8. import java.util.List;
  9. public class TestMyBatis {
  10. @Test
  11. public void testSelectStudents(){
  12. /**
  13. * 使用mybatis的动态代理机制, 使用SqlSession.getMapper(dao接口)
  14. * getMapper能获取dao接口对于的实现类对象。
  15. */
  16. SqlSession sqlSession = MyBatisUtils.getSqlSession();
  17. StudentDao dao = sqlSession.getMapper(StudentDao.class);
  18. //com.sun.proxy.$Proxy2 : jdk的动态代理
  19. System.out.println("dao="+dao.getClass().getName());
  20. //调用dao的方法, 执行数据库的操作
  21. List<Student> students = dao.selectStudents();
  22. for(Student stu: students){
  23. System.out.println("学生="+stu);
  24. }
  25. }
  26. @Test
  27. public void testInsertStudent(){
  28. SqlSession sqlSession = MyBatisUtils.getSqlSession();
  29. StudentDao dao = sqlSession.getMapper(StudentDao.class);
  30. Student student = new Student();
  31. student.setId(1007);
  32. student.setName("李飞");
  33. student.setEmail("dunshan@qq.com");
  34. student.setAge(28);
  35. int nums = dao.insertStudent(student);
  36. sqlSession.commit();
  37. System.out.println("添加对象的数量:"+nums);
  38. }
  39. }

2. 传入参数:

从java代码中把数据传入到mapper文件的sql语句中。
1)parameterType : 写在mapper文件中的 一个属性。 表示dao接口中方法的参数的数据类型。
例如StudentDao接口
public Student selectStudentById(Integer id)
2) 一个简单类型的参数:
简单类型: mybatis把java的基本数据类型和String都叫简单类型。
在mapper文件获取简单类型的一个参数的值,使用 #{任意字符}
接口:public Student selectStudentById(Integer id)
mapper:select id,name, email,age from student where id=#{studentId}
3) 多个参数,使用@Param命名参数
接口 public List selectMulitParam(@Param(“myname”) String name, @Param(“myage”) Integer age)
使用 @Param(“参数名”) String name
mapper文件:

4) 多个参数,使用java对象
语法 #{属性名}
vo: value object , 放一些存储数据的类。比如说 提交请求参数, name ,age
现在想把name ,age 传给一个service 类。
vo: view object , 从servlet把数据返回给浏览器使用的类,表示显示结果的类。
pojo: 普通的有set, get方法的java类。 普通的java对象
Servlet —- StudentService( addStudent( MyParam param) )
entity(domain域): 实体类, 和数据库中的表对应的类,

5) # 和 $
select id,name, email,age from student where id=#{studentId}
# 的结果: select id,name, email,age from student where id=?
select id,name, email,age from student where id=${studentId}
$ 的结果:select id,name, email,age from student where id=1001
String sql=”select id,name, email,age from student where id=” + “1001”;
使用的Statement对象执行sql, 效率比PreparedStatement低。
$:可以替换表名或者列名, 你能确定数据是安全的。可以使用$
# 和 $区别
1. #使用 ?在sql语句中做站位的, 使用PreparedStatement执行sql,效率高
2. #能够避免sql注入,更安全。
3. $不使用占位符,是字符串连接方式,使用Statement对象执行sql,效率低
4. $有sql注入的风险,缺乏安全性。
5. $:可以替换表名或者列名

2.1 示例代码:

学生dao接口

  1. package com.bjpowernode.dao;
  2. import com.bjpowernode.domain.Student;
  3. import com.bjpowernode.vo.QueryParam;
  4. import org.apache.ibatis.annotations.Param;
  5. import java.util.List;
  6. import java.util.Map;
  7. public interface StudentDao {
  8. /**
  9. * 一个简单类型的参数:
  10. * 简单类型: mybatis把java的基本数据类型和String都叫简单类型。
  11. * 在mapper文件获取简单类型的一个参数的值,使用 #{任意字符}
  12. */
  13. public Student selectStudentById(@Param("studentId") Integer id);
  14. /**
  15. * 多个参数: 命名参数,在形参定义的前面加入 @Param("自定义参数名称")
  16. */
  17. List<Student> selectMultiParam(@Param("myname") String name,
  18. @Param("myage") Integer age);
  19. /**
  20. * 多个参数,使用java对象作为接口中方法的参数
  21. */
  22. List<Student> selectMultiObject(QueryParam param);
  23. List<Student> selectMultiStudent(Student student);
  24. /**
  25. * 多个参数-简单类型的,按位置传值,
  26. * mybatis.3.4之前,使用 #{0} ,#{1}
  27. * mybatis。3.4之后 ,使用 #{arg0} ,#{arg1}
  28. */
  29. List<Student> selectMultiPosition( String name,Integer age);
  30. /**
  31. * 多个参数,使用Map存放多个值
  32. */
  33. List<Student> selectMultiByMap(Map<String,Object> map);
  34. List<Student> selectUse$(@Param("myname") String name);
  35. List<Student> selectUse$Order(@Param("colName") String colName);
  36. }

student.xml

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="com.bjpowernode.dao.StudentDao">
  6. <!--
  7. parameterType dao接口中方法参数的数据类型。
  8. parameterType它的值是java的数据类型全限定名称或者是mybatis定义的别名
  9. 例如:parameterType="java.lang.Integer"
  10. parameterType="int"
  11. 注意:parameterType不是强制的,mybatis通过反射机制能够发现接口参数的数类型。
  12. 所以可以没有。 一般我们也不写。
  13. 使用#{}之后, mybatis执行sql是使用的jdbc中的PreparedStatement对象
  14. mybatis执行下面的代码:
  15. 1. mybatis创建Connection PreparedStatement对象
  16. String sql="select id,name, email,age from student where id=?";
  17. PreparedStatement pst = conn.preparedStatement(sql);
  18. pst.setInt(1,1001);
  19. 2. 执行sql封装为resultType="com.bjpowernode.domain.Student"这个对象
  20. ResultSet rs = ps.executeQuery();
  21. Student student = null;
  22. while(rs.next()){
  23. //从数据库取表的一行数据, 存到一个java对象属性中
  24. student = new Student();
  25. student.setId(rs.getInt("id));
  26. student.setName(rs.getString("name"));
  27. student.setEmail(rs.getString("email"));
  28. student.setAge(rs.getInt("age"));
  29. }
  30. return student; //给了dao方法调用的返回值
  31. -->
  32. <select id="selectStudentById" parameterType="int" resultType="com.bjpowernode.domain.Student">
  33. select id,name, email,age from student where id=${studentId}
  34. </select>
  35. <!--多个参数,使用@Param命名-->
  36. <select id="selectMultiParam" resultType="com.bjpowernode.domain.Student">
  37. select id,name, email,age from student where name=#{myname} or age=#{myage}
  38. </select>
  39. <!--多个参数, 使用java对象的属性值,作为参数实际值
  40. 使用对象语法: #{属性名,javaType=类型名称,jdbcType=数据类型} 很少用。
  41. javaType:指java中的属性数据类型。
  42. jdbcType:在数据库中的数据类型。
  43. 例如: #{paramName,javaType=java.lang.String,jdbcType=VARCHAR}
  44. 我们使用的简化方式: #{属性名} javaType, jdbcType的值mybatis反射能获取。不用提供
  45. -->
  46. <!-- <select id="selectMultiObject" resultType="com.bjpowernode.domain.Student">
  47. select id,name, email,age from student where
  48. name=#{paramName,javaType=java.lang.String,jdbcType=VARCHAR}
  49. or age=#{paramAge,javaType=java.lang.Integer,jdbcType=INTEGER}
  50. </select>-->
  51. <select id="selectMultiObject" resultType="com.bjpowernode.domain.Student">
  52. select id,name, email,age from student where
  53. name=#{paramName} or age=#{paramAge}
  54. </select>
  55. <select id="selectMultiStudent" resultType="com.bjpowernode.domain.Student">
  56. select id,name, email,age from student where name=#{name} or age=#{age}
  57. </select>
  58. <!--多个参数使用位置-->
  59. <select id="selectMultiPosition" resultType="com.bjpowernode.domain.Student">
  60. select id,name, email,age from student where
  61. name = #{arg0} or age=#{arg1}
  62. </select>
  63. <!--多个参数,使用Map , 使用语法 #{mapkey}-->
  64. <select id="selectMultiByMap" resultType="com.bjpowernode.domain.Student">
  65. select id,name, email,age from student where
  66. name = #{myname} or age=#{age1}
  67. </select>
  68. <!--使用 ${}-->
  69. <select id="selectUse$" resultType="com.bjpowernode.domain.Student">
  70. select * from student where name=${myname}
  71. </select>
  72. <!--
  73. $替换列名
  74. -->
  75. <select id="selectUse$Order" resultType="com.bjpowernode.domain.Student">
  76. select * from student order by ${colName}
  77. </select>
  78. </mapper>

学生实体类

  1. package com.bjpowernode.domain;
  2. public class Student {
  3. private Integer id;
  4. private String name;
  5. private String email;
  6. private Integer age;
  7. public Integer getId() {
  8. return id;
  9. }
  10. public void setId(Integer id) {
  11. this.id = id;
  12. }
  13. public String getName() {
  14. return name;
  15. }
  16. public void setName(String name) {
  17. this.name = name;
  18. }
  19. public String getEmail() {
  20. return email;
  21. }
  22. public void setEmail(String email) {
  23. this.email = email;
  24. }
  25. public Integer getAge() {
  26. return age;
  27. }
  28. public void setAge(Integer age) {
  29. this.age = age;
  30. }
  31. @Override
  32. public String toString() {
  33. return "Student{" +
  34. "id=" + id +
  35. ", name='" + name + '\'' +
  36. ", email='" + email + '\'' +
  37. ", age=" + age +
  38. '}';
  39. }
  40. }

mybatis工具类

  1. package com.bjpowernode.utils;
  2. import org.apache.ibatis.io.Resources;
  3. import org.apache.ibatis.session.SqlSession;
  4. import org.apache.ibatis.session.SqlSessionFactory;
  5. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
  6. import java.io.IOException;
  7. import java.io.InputStream;
  8. public class MyBatisUtils {
  9. private static SqlSessionFactory factory = null;
  10. static {
  11. String config="mybatis.xml"; // 需要和你的项目中的文件名一样
  12. try {
  13. InputStream in = Resources.getResourceAsStream(config);
  14. //创建SqlSessionFactory对象,使用SqlSessionFactoryBuild
  15. factory = new SqlSessionFactoryBuilder().build(in);
  16. } catch (IOException e) {
  17. e.printStackTrace();
  18. }
  19. }
  20. //获取SqlSession的方法
  21. public static SqlSession getSqlSession() {
  22. SqlSession sqlSession = null;
  23. if( factory != null){
  24. sqlSession = factory.openSession();// 非自动提交事务
  25. }
  26. return sqlSession;
  27. }
  28. }

查询参数

  1. package com.bjpowernode.vo;
  2. public class QueryParam {
  3. private String paramName;
  4. private Integer paramAge;
  5. public String getParamName() {
  6. return paramName;
  7. }
  8. public void setParamName(String paramName) {
  9. this.paramName = paramName;
  10. }
  11. public Integer getParamAge() {
  12. return paramAge;
  13. }
  14. public void setParamAge(Integer paramAge) {
  15. this.paramAge = paramAge;
  16. }
  17. }

mybatis.xml

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration
  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <configuration>
  6. <!--settings:控制mybatis全局行为-->
  7. <settings>
  8. <!--设置mybatis输出日志-->
  9. <setting name="logImpl" value="STDOUT_LOGGING"/>
  10. </settings>
  11. <environments default="mydev">
  12. <environment id="mydev">
  13. <transactionManager type="JDBC"/>
  14. <dataSource type="POOLED">
  15. <!--数据库的驱动类名-->
  16. <property name="driver" value="com.mysql.jdbc.Driver"/>
  17. <!--连接数据库的url字符串-->
  18. <property name="url" value="jdbc:mysql://localhost:3306/springdb"/>
  19. <!--访问数据库的用户名-->
  20. <property name="username" value="root"/>
  21. <!--密码-->
  22. <property name="password" value="123456"/>
  23. </dataSource>
  24. </environment>
  25. </environments>
  26. <!-- sql mapper(sql映射文件)的位置-->
  27. <mappers>
  28. <mapper resource="com/bjpowernode/dao/StudentDao.xml"/>
  29. <!--<mapper resource="com/bjpowernode/dao/SchoolDao.xml" />-->
  30. </mappers>
  31. </configuration>

测试类

  1. package com.bjpowernode;
  2. import com.bjpowernode.dao.StudentDao;
  3. import com.bjpowernode.domain.Student;
  4. import com.bjpowernode.utils.MyBatisUtils;
  5. import com.bjpowernode.vo.QueryParam;
  6. import org.apache.ibatis.session.SqlSession;
  7. import org.apache.ibatis.session.SqlSessionFactory;
  8. import org.junit.Test;
  9. import java.util.HashMap;
  10. import java.util.List;
  11. import java.util.Map;
  12. public class TestMyBatis {
  13. @Test
  14. public void testSelectStudentById(){
  15. SqlSession sqlSession = MyBatisUtils.getSqlSession();
  16. StudentDao dao = sqlSession.getMapper(StudentDao.class);
  17. Student student = dao.selectStudentById(1001);
  18. System.out.println("student="+student);
  19. }
  20. @Test
  21. public void testSelectMultiParam(){
  22. SqlSession sqlSession = MyBatisUtils.getSqlSession();
  23. StudentDao dao = sqlSession.getMapper(StudentDao.class);
  24. List<Student> students = dao.selectMultiParam("李四",20);
  25. for(Student stu: students){
  26. System.out.println("学生="+stu);
  27. }
  28. sqlSession.close();
  29. }
  30. @Test
  31. public void testSelectMultiObject(){
  32. SqlSession sqlSession = MyBatisUtils.getSqlSession();
  33. StudentDao dao = sqlSession.getMapper(StudentDao.class);
  34. QueryParam param = new QueryParam();
  35. param.setParamName("张三");
  36. param.setParamAge(28);
  37. List<Student> students = dao.selectMultiObject(param);
  38. for(Student stu: students){
  39. System.out.println("学生="+stu);
  40. }
  41. sqlSession.close();
  42. }
  43. @Test
  44. public void testSelectMultiStudent(){
  45. SqlSession sqlSession = MyBatisUtils.getSqlSession();
  46. StudentDao dao = sqlSession.getMapper(StudentDao.class);
  47. Student student = new Student();
  48. student.setName("张三");
  49. student.setAge(28);
  50. List<Student> students = dao.selectMultiStudent(student);
  51. for(Student stu: students){
  52. System.out.println("学生="+stu);
  53. }
  54. sqlSession.close();
  55. }
  56. @Test
  57. public void testSelectMultiPosition(){
  58. SqlSession sqlSession = MyBatisUtils.getSqlSession();
  59. StudentDao dao = sqlSession.getMapper(StudentDao.class);
  60. List<Student> students = dao.selectMultiPosition("李四",20);
  61. for(Student stu: students){
  62. System.out.println("学生="+stu);
  63. }
  64. sqlSession.close();
  65. }
  66. @Test
  67. public void testSelectMultiByMap(){
  68. SqlSession sqlSession = MyBatisUtils.getSqlSession();
  69. StudentDao dao = sqlSession.getMapper(StudentDao.class);
  70. Map<String,Object> data = new HashMap<>();
  71. data.put("myname","张三");
  72. data.put("age1",28);
  73. List<Student> students = dao.selectMultiByMap(data);
  74. for(Student stu: students){
  75. System.out.println("学生="+stu);
  76. }
  77. sqlSession.close();
  78. }
  79. @Test
  80. public void testSelectUse$(){
  81. SqlSession sqlSession = MyBatisUtils.getSqlSession();
  82. StudentDao dao = sqlSession.getMapper(StudentDao.class);
  83. List<Student> students = dao.selectUse$("'李四';select * from user");
  84. for(Student stu: students){
  85. System.out.println("学生="+stu);
  86. }
  87. sqlSession.close();
  88. }
  89. @Test
  90. public void testSelectUse$Order(){
  91. SqlSession sqlSession = MyBatisUtils.getSqlSession();
  92. StudentDao dao = sqlSession.getMapper(StudentDao.class);
  93. List<Student> students = dao.selectUse$Order("age");
  94. for(Student stu: students){
  95. System.out.println("学生="+stu);
  96. }
  97. sqlSession.close();
  98. }
  99. }

pop.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <groupId>com.bjpowernode</groupId>
  6. <artifactId>ch04-param</artifactId>
  7. <version>1.0-SNAPSHOT</version>
  8. <properties>
  9. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  10. <maven.compiler.source>1.8</maven.compiler.source>
  11. <maven.compiler.target>1.8</maven.compiler.target>
  12. </properties>
  13. <dependencies>
  14. <dependency>
  15. <groupId>junit</groupId>
  16. <artifactId>junit</artifactId>
  17. <version>4.11</version>
  18. <scope>test</scope>
  19. </dependency>
  20. <!--mybatis依赖-->
  21. <dependency>
  22. <groupId>org.mybatis</groupId>
  23. <artifactId>mybatis</artifactId>
  24. <version>3.5.1</version>
  25. </dependency>
  26. <!--mysql驱动-->
  27. <dependency>
  28. <groupId>mysql</groupId>
  29. <artifactId>mysql-connector-java</artifactId>
  30. <version>5.1.9</version>
  31. </dependency>
  32. </dependencies>
  33. <build>
  34. <resources>
  35. <resource>
  36. <directory>src/main/java</directory><!--所在的目录-->
  37. <includes><!--包括目录下的.properties,.xml 文件都会扫描到-->
  38. <include>**/*.properties</include>
  39. <include>**/*.xml</include>
  40. </includes>
  41. <filtering>false</filtering>
  42. </resource>
  43. </resources>
  44. </build>
  45. </project>

3. mybatis的输出结果

  1. mybatis执行了sql语句,得到java对象。<br /> 1resultType结果类型, sql语句执行完毕后, 数据转为的java对象, java类型是任意的。<br /> resultType结果类型的它值 1. 类型的全限定名称 2. 类型的别名, 例如 java.lang.Integer别名是int<br /> <br /> 处理方式:<br /> 1. mybatis执行sql语句, 然后mybatis调用类的无参数构造方法,创建对象。<br /> 2. mybatisResultSet指定列值付给同名的属性。<br /> <select id="selectMultiPosition" resultType="com.bjpowernode.domain.Student"><br /> select id,name, email,age from student<br /> </select><br /> 对等的jdbc<br /> ResultSet rs = executeQuery(" select id,name, email,age from student" )<br /> while(rs.next()){<br /> Student student = new Student();<br /> student.setId(rs.getInt("id"));<br /> student.setName(rs.getString("name"))<br /> }<br /> 2) 定义自定义类型的别名<br /> 1)在mybatis主配置文件中定义,使<typeAlias>定义别名<br /> 2)可以在resultType中使用自定义别名<br /> 3resultMap:结果映射, 指定列名和java对象的属性对应关系。<br /> 1)你自定义列值赋值给哪个属性<br /> 2)当你的列名和属性名不一样时,一定使用resultMap
  2. resultMapresultType不要一起用,二选一
别名 映射的类型
_byte byte
_long long
_short short
_int int
_integer int
_double double
_float float
_boolean boolean
string String
byte Byte
long Long
short Short
int Integer
integer Integer
double Double
float Float
boolean Boolean
date Date
decimal BigDecimal
bigdecimal BigDecimal

map Map/HashMap

3.1 代码实现:

StudentDao

  1. package com.bjpowernode.dao;
  2. import com.bjpowernode.domain.MyStudent;
  3. import com.bjpowernode.domain.Student;
  4. import com.bjpowernode.vo.QueryParam;
  5. import com.bjpowernode.vo.ViewStudent;
  6. import org.apache.ibatis.annotations.Param;
  7. import java.util.List;
  8. import java.util.Map;
  9. public interface StudentDao {
  10. public Student selectStudentById(@Param("studentId") Integer id);
  11. List<Student> selectMultiParam(@Param("myname") String name,
  12. @Param("myage") Integer age);
  13. ViewStudent selectStudentReturnViewStudent(@Param("sid") Integer id);
  14. int countStudent();
  15. //定义方法返回Map
  16. Map<Object,Object> selectMapById(Integer id);
  17. /*
  18. * 使用resultMap定义映射关系
  19. * */
  20. List<Student> selectAllStudents();
  21. List<MyStudent> selectMyStudent();
  22. List<MyStudent> selectDiffColProperty();
  23. /*第一种模糊查询, 在java代码指定 like的内容*/
  24. List<Student> selectLikeOne(String name);
  25. /*name就是李值, 在mapper中拼接 like "%" 李 "%" */
  26. List<Student> selectLikeTwo(String name);
  27. }

StudentDao.xml

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="com.bjpowernode.dao.StudentDao">
  6. <select id="selectStudentById" resultType="Student">
  7. select id,name, email,age from student where id=#{studentId}
  8. </select>
  9. <!--多个参数,使用@Param命名-->
  10. <select id="selectMultiParam" resultType="com.bjpowernode.domain.Student">
  11. select id,name, email,age from student where name=#{myname} or age=#{myage}
  12. </select>
  13. <!--selectStudentReturnViewStudent-->
  14. <select id="selectStudentReturnViewStudent" resultType="ViewStudent">
  15. select id,name from student where id=#{sid}
  16. </select>
  17. <!--sql执行后返回一行一列-->
  18. <!--<select id="countStudent" resultType="int">-->
  19. <select id="countStudent" resultType="java.lang.Integer">
  20. select count(*) from student
  21. </select>
  22. <!--返回Map
  23. 1)列名是mapkey 列值是mapvalue
  24. 2)只能最多返回一行记录。多余一行是错误
  25. -->
  26. <select id="selectMapById" resultType="java.util.HashMap">
  27. select id,name,email from student where id=#{stuid}
  28. </select>
  29. <!--使用resultMap
  30. 1)先定义resultMap
  31. 2)在select标签,使用resultMap来引用1定义的。
  32. -->
  33. <!--定义resultMap
  34. id:自定义名称,表示你定义的这个resultMap
  35. typejava类型的全限定名称
  36. -->
  37. <resultMap id="studentMap" type="com.bjpowernode.domain.Student">
  38. <!--列名和java属性的关系-->
  39. <!--注解列,使用id标签
  40. column :列名
  41. property:java类型的属性名
  42. -->
  43. <id column="id" property="id" />
  44. <!--非主键列,使用result-->
  45. <result column="name" property="name" />
  46. <result column="email" property="email" />
  47. <result column="age" property="age" />
  48. </resultMap>
  49. <select id="selectAllStudents" resultMap="studentMap">
  50. select id,name, email , age from student
  51. </select>
  52. <resultMap id="myStudentMap" type="com.bjpowernode.domain.MyStudent">
  53. <!--列名和java属性的关系-->
  54. <id column="id" property="stuid" />
  55. <!--非主键列,使用result-->
  56. <result column="name" property="stuname" />
  57. <result column="email" property="stuemail" />
  58. <result column="age" property="stuage" />
  59. </resultMap>
  60. <!--列名和属性名不一样:第一种方式-->
  61. <select id="selectMyStudent" resultMap="myStudentMap">
  62. select id,name, email , age from student
  63. </select>
  64. <!--列名和属性名不一样:第二种方式
  65. resultType的默认原则是 同名的列值赋值给同名的属性, 使用列别名(java对象的属性名)
  66. -->
  67. <select id="selectDiffColProperty" resultType="com.bjpowernode.domain.MyStudent">
  68. select id as stuid ,name as stuname, email as stuemail , age stuage from student
  69. </select>
  70. <!--第一种 like java代码指定 like的内容-->
  71. <select id="selectLikeOne" resultType="com.bjpowernode.domain.Student">
  72. select id,name,email,age from student where name like #{name}
  73. </select>
  74. <!--第二种方式:在mapper文件中拼接 like的内容-->
  75. <select id="selectLikeTwo" resultType="com.bjpowernode.domain.Student">
  76. select id,name,email,age from student where name like "%" #{name} "%"
  77. </select>
  78. </mapper>

MyStudent

  1. package com.bjpowernode.domain;
  2. public class MyStudent {
  3. private Integer stuid;
  4. private String stuname;
  5. private String stuemail;
  6. private Integer stuage;
  7. public Integer getStuid() {
  8. return stuid;
  9. }
  10. public void setStuid(Integer stuid) {
  11. this.stuid = stuid;
  12. }
  13. public String getStuname() {
  14. return stuname;
  15. }
  16. public void setStuname(String stuname) {
  17. this.stuname = stuname;
  18. }
  19. public String getStuemail() {
  20. return stuemail;
  21. }
  22. public void setStuemail(String stuemail) {
  23. this.stuemail = stuemail;
  24. }
  25. public Integer getStuage() {
  26. return stuage;
  27. }
  28. public void setStuage(Integer stuage) {
  29. this.stuage = stuage;
  30. }
  31. @Override
  32. public String toString() {
  33. return "MyStudent{" +
  34. "stuid=" + stuid +
  35. ", stuname='" + stuname + '\'' +
  36. ", stuemail='" + stuemail + '\'' +
  37. ", stuage=" + stuage +
  38. '}';
  39. }
  40. }

Student

  1. package com.bjpowernode.domain;
  2. public class Student {
  3. private Integer id;
  4. private String name;
  5. private String email;
  6. private Integer age;
  7. public Integer getId() {
  8. return id;
  9. }
  10. public void setId(Integer id) {
  11. this.id = id;
  12. }
  13. public String getName() {
  14. return name;
  15. }
  16. public void setName(String name) {
  17. this.name = name;
  18. }
  19. public String getEmail() {
  20. return email;
  21. }
  22. public void setEmail(String email) {
  23. this.email = email;
  24. }
  25. public Integer getAge() {
  26. return age;
  27. }
  28. public void setAge(Integer age) {
  29. this.age = age;
  30. }
  31. @Override
  32. public String toString() {
  33. return "Student{" +
  34. "id=" + id +
  35. ", name='" + name + '\'' +
  36. ", email='" + email + '\'' +
  37. ", age=" + age +
  38. '}';
  39. }
  40. }

工具类

  1. package com.bjpowernode.utils;
  2. import org.apache.ibatis.io.Resources;
  3. import org.apache.ibatis.session.SqlSession;
  4. import org.apache.ibatis.session.SqlSessionFactory;
  5. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
  6. import java.io.IOException;
  7. import java.io.InputStream;
  8. public class MyBatisUtils {
  9. private static SqlSessionFactory factory = null;
  10. static {
  11. String config="mybatis.xml"; // 需要和你的项目中的文件名一样
  12. try {
  13. InputStream in = Resources.getResourceAsStream(config);
  14. //创建SqlSessionFactory对象,使用SqlSessionFactoryBuild
  15. factory = new SqlSessionFactoryBuilder().build(in);
  16. } catch (IOException e) {
  17. e.printStackTrace();
  18. }
  19. }
  20. //获取SqlSession的方法
  21. public static SqlSession getSqlSession() {
  22. SqlSession sqlSession = null;
  23. if( factory != null){
  24. sqlSession = factory.openSession();// 非自动提交事务
  25. }
  26. return sqlSession;
  27. }
  28. }

QueryParam

  1. package com.bjpowernode.vo;
  2. public class QueryParam {
  3. private String paramName;
  4. private Integer paramAge;
  5. public String getParamName() {
  6. return paramName;
  7. }
  8. public void setParamName(String paramName) {
  9. this.paramName = paramName;
  10. }
  11. public Integer getParamAge() {
  12. return paramAge;
  13. }
  14. public void setParamAge(Integer paramAge) {
  15. this.paramAge = paramAge;
  16. }
  17. }

ViewStudent

  1. package com.bjpowernode.vo;
  2. public class ViewStudent {
  3. private Integer id;
  4. private String name;
  5. public Integer getId() {
  6. return id;
  7. }
  8. public void setId(Integer id) {
  9. this.id = id;
  10. }
  11. public String getName() {
  12. return name;
  13. }
  14. public void setName(String name) {
  15. this.name = name;
  16. }
  17. @Override
  18. public String toString() {
  19. return "ViewStudent{" +
  20. "id=" + id +
  21. ", name='" + name + '\'' +
  22. '}';
  23. }
  24. }

mybatis.xml

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration
  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <configuration>
  6. <!--settings:控制mybatis全局行为-->
  7. <settings>
  8. <!--设置mybatis输出日志-->
  9. <setting name="logImpl" value="STDOUT_LOGGING"/>
  10. </settings>
  11. <!--定义别名-->
  12. <typeAliases>
  13. <!--
  14. 第一种方式:
  15. 可以指定一个类型一个自定义别名
  16. type:自定义类型的全限定名称
  17. alias:别名(短小,容易记忆的)
  18. -->
  19. <!--<typeAlias type="com.bjpowernode.domain.Student" alias="stu" />
  20. <typeAlias type="com.bjpowernode.vo.ViewStudent" alias="vstu" />-->
  21. <!--
  22. 第二种方式
  23. <package> name是包名, 这个包中的所有类,类名就是别名(类名不区分大小写)
  24. -->
  25. <package name="com.bjpowernode.domain"/>
  26. <package name="com.bjpowernode.vo"/>
  27. </typeAliases>
  28. <environments default="mydev">
  29. <environment id="mydev">
  30. <transactionManager type="JDBC"/>
  31. <dataSource type="POOLED">
  32. <!--数据库的驱动类名-->
  33. <property name="driver" value="com.mysql.jdbc.Driver"/>
  34. <!--连接数据库的url字符串-->
  35. <property name="url" value="jdbc:mysql://localhost:3306/springdb"/>
  36. <!--访问数据库的用户名-->
  37. <property name="username" value="root"/>
  38. <!--密码-->
  39. <property name="password" value="123456"/>
  40. </dataSource>
  41. </environment>
  42. </environments>
  43. <!-- sql mapper(sql映射文件)的位置-->
  44. <mappers>
  45. <mapper resource="com/bjpowernode/dao/StudentDao.xml"/>
  46. <!--<mapper resource="com/bjpowernode/dao/SchoolDao.xml" />-->
  47. </mappers>
  48. </configuration>

pom.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <groupId>com.bjpowernode</groupId>
  6. <artifactId>ch05-return-result</artifactId>
  7. <version>1.0-SNAPSHOT</version>
  8. <properties>
  9. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  10. <maven.compiler.source>1.8</maven.compiler.source>
  11. <maven.compiler.target>1.8</maven.compiler.target>
  12. </properties>
  13. <dependencies>
  14. <dependency>
  15. <groupId>junit</groupId>
  16. <artifactId>junit</artifactId>
  17. <version>4.11</version>
  18. <scope>test</scope>
  19. </dependency>
  20. <!--mybatis依赖-->
  21. <dependency>
  22. <groupId>org.mybatis</groupId>
  23. <artifactId>mybatis</artifactId>
  24. <version>3.5.1</version>
  25. </dependency>
  26. <!--mysql驱动-->
  27. <dependency>
  28. <groupId>mysql</groupId>
  29. <artifactId>mysql-connector-java</artifactId>
  30. <version>5.1.9</version>
  31. </dependency>
  32. </dependencies>
  33. <build>
  34. <resources>
  35. <resource>
  36. <directory>src/main/java</directory><!--所在的目录-->
  37. <includes><!--包括目录下的.properties,.xml 文件都会扫描到-->
  38. <include>**/*.properties</include>
  39. <include>**/*.xml</include>
  40. </includes>
  41. <filtering>false</filtering>
  42. </resource>
  43. </resources>
  44. </build>
  45. </project>

测试类

  1. package com.bjpowernode;
  2. import com.bjpowernode.dao.StudentDao;
  3. import com.bjpowernode.domain.MyStudent;
  4. import com.bjpowernode.domain.Student;
  5. import com.bjpowernode.utils.MyBatisUtils;
  6. import com.bjpowernode.vo.QueryParam;
  7. import com.bjpowernode.vo.ViewStudent;
  8. import org.apache.ibatis.session.SqlSession;
  9. import org.apache.ibatis.session.SqlSessionFactory;
  10. import org.junit.Test;
  11. import java.util.HashMap;
  12. import java.util.List;
  13. import java.util.Map;
  14. public class TestMyBatis {
  15. @Test
  16. public void testSelectStudentById(){
  17. SqlSession sqlSession = MyBatisUtils.getSqlSession();
  18. StudentDao dao = sqlSession.getMapper(StudentDao.class);
  19. Student student = dao.selectStudentById(1001);
  20. System.out.println("student="+student);
  21. }
  22. @Test
  23. public void testSelectMultiParam(){
  24. SqlSession sqlSession = MyBatisUtils.getSqlSession();
  25. StudentDao dao = sqlSession.getMapper(StudentDao.class);
  26. List<Student> students = dao.selectMultiParam("李四",20);
  27. for(Student stu: students){
  28. System.out.println("学生="+stu);
  29. }
  30. sqlSession.close();
  31. }
  32. @Test
  33. public void testSelectViewStudent(){
  34. SqlSession sqlSession = MyBatisUtils.getSqlSession();
  35. StudentDao dao = sqlSession.getMapper(StudentDao.class);
  36. ViewStudent student = dao.selectStudentReturnViewStudent(1005);
  37. System.out.println("1005 student="+student);
  38. }
  39. @Test
  40. public void testSelectCount(){
  41. SqlSession sqlSession = MyBatisUtils.getSqlSession();
  42. StudentDao dao = sqlSession.getMapper(StudentDao.class);
  43. int counts = dao.countStudent();
  44. System.out.println("学生数量="+counts);
  45. }
  46. //返回Map
  47. @Test
  48. public void testSelecMap(){
  49. SqlSession sqlSession = MyBatisUtils.getSqlSession();
  50. StudentDao dao = sqlSession.getMapper(StudentDao.class);
  51. Map<Object,Object> map = dao.selectMapById(1001);
  52. System.out.println("map=="+map);
  53. }
  54. //=======================================
  55. @Test
  56. public void testSelectAllStudents(){
  57. SqlSession sqlSession = MyBatisUtils.getSqlSession();
  58. StudentDao dao = sqlSession.getMapper(StudentDao.class);
  59. List<Student> students = dao.selectAllStudents();
  60. for(Student stu: students){
  61. System.out.println("学生="+stu);
  62. }
  63. sqlSession.close();
  64. }
  65. @Test
  66. public void testSelectAllStudents2(){
  67. SqlSession sqlSession = MyBatisUtils.getSqlSession();
  68. StudentDao dao = sqlSession.getMapper(StudentDao.class);
  69. List<MyStudent> students = dao.selectMyStudent();
  70. for(MyStudent stu: students){
  71. System.out.println("学生="+stu);
  72. }
  73. sqlSession.close();
  74. }
  75. @Test
  76. public void testSelectDiffColProperty(){
  77. SqlSession sqlSession = MyBatisUtils.getSqlSession();
  78. StudentDao dao = sqlSession.getMapper(StudentDao.class);
  79. List<MyStudent> students = dao.selectDiffColProperty();
  80. for(MyStudent stu: students){
  81. System.out.println("#######学生="+stu);
  82. }
  83. sqlSession.close();
  84. }
  85. @Test
  86. public void testSelectLikeOne(){
  87. SqlSession sqlSession = MyBatisUtils.getSqlSession();
  88. StudentDao dao = sqlSession.getMapper(StudentDao.class);
  89. //准备好like的内容
  90. String name = "%李%";
  91. List<Student> students = dao.selectLikeOne(name);
  92. for(Student stu: students){
  93. System.out.println("#######学生="+stu);
  94. }
  95. sqlSession.close();
  96. }
  97. @Test
  98. public void testSelectLikeTwo(){
  99. SqlSession sqlSession = MyBatisUtils.getSqlSession();
  100. StudentDao dao = sqlSession.getMapper(StudentDao.class);
  101. //准备好like的内容
  102. String name = "张";
  103. List<Student> students = dao.selectLikeTwo(name);
  104. for(Student stu: students){
  105. System.out.println("*******学生="+stu);
  106. }
  107. sqlSession.close();
  108. }
  109. }

第四章

1. 动态sql:

sql的内容是变化的,可以根据条件获取到不同的sql语句。主要是where部分发生变化。

  1. 动态sql的实现,使用的是mybatis提供的标签, <if> ,<where>,<foreach><br /> 1)<if>是判断条件的,<br /> 语法<if test="判断java对象的属性值"><br /> 部分sql语句<br /> </if><br /> 2)<where> 用来包含 多个<if>的, 当多个if有一个成立的, <where>会自动增加一个where关键字,并去掉 if中多余的 and or等。

3) 循环java中的数组,list集合的。 主要用在sql的in语句中。
学生id是 1001,1002,1003的三个学生
select * from student where id in (1001,1002,1003)
public List selectFor(List idlist)
List list = new …
list.add(1001);
list.add(1002);
list.add(1003);
dao.selectFor(list)

#{xxx}

collection:表示接口中的方法参数的类型, 如果是数组使用array , 如果是list集合使用list
item:自定义的,表示数组和集合成员的变量
open:循环开始是的字符
close:循环结束时的字符
separator:集合成员之间的分隔符

4)sql代码片段, 就是复用一些语法
步骤
1.先定义 sql语句, 表名,字段等
2.再使用,

2. settings

  1. <!-- settings是 MyBatis 中全局的调整设置,它们会改变 MyBatis 的运行时行为,应谨慎设置 --> <br /> <settings> <br /> <!-- 该配置影响的所有映射器中配置的缓存的全局开关。默认值true --> <br /> <setting name="cacheEnabled" value="true"/> <br /> <!--延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。特定关联关系中可通过设置fetchType属性来覆盖该项的开关状态。默认值false --> <br /> <setting name="lazyLoadingEnabled" value="true"/> <br /> <!-- 是否允许单一语句返回多结果集(需要兼容驱动)。默认值true --> <br /> <setting name="multipleResultSetsEnabled" value="true"/> <br /> <!-- 使用列标签代替列名。不同的驱动在这方面会有不同的表现,具体可参考相关驱动文档或通过测试这两种不同的模式来观察所用驱动的结果。默认值true --> <br /> <setting name="useColumnLabel" value="true"/> <br /> <!-- 允许 JDBC 支持自动生成主键,需要驱动兼容。如果设置为 true 则这个设置强制使用自动生成主键,尽管一些驱动不能兼容但仍可正常工作(比如 Derby)。 默认值false --> <br /> <setting name="useGeneratedKeys" value="false"/> <br /> <!-- 指定 MyBatis 应如何自动映射列到字段或属性。 NONE 表示取消自动映射;PARTIAL 只会自动映射没有定义嵌套结果集映射的结果集。 FULL 会自动映射任意复杂的结果集(无论是否嵌套)。 --> <br /> <!-- 默认值PARTIAL --> <br /> <setting name="autoMappingBehavior" value="PARTIAL"/> <br /> <br /> <setting name="autoMappingUnknownColumnBehavior" value="WARNING"/> <br /> <!-- 配置默认的执行器。SIMPLE 就是普通的执行器;REUSE 执行器会重用预处理语句(prepared statements); BATCH 执行器将重用语句并执行批量更新。默认SIMPLE --> <br /> <setting name="defaultExecutorType" value="SIMPLE"/> <br /> <!-- 设置超时时间,它决定驱动等待数据库响应的秒数。 --> <br /> <setting name="defaultStatementTimeout" value="25"/> <br /> <br /> <setting name="defaultFetchSize" value="100"/> <br /> <!-- 允许在嵌套语句中使用分页(RowBounds)默认值False --> <br /> <setting name="safeRowBoundsEnabled" value="false"/> <br /> <!-- 是否开启自动驼峰命名规则(camel case)映射,即从经典数据库列名 A_COLUMN 到经典 Java 属性名 aColumn 的类似映射。 默认false --> <br /> <setting name="mapUnderscoreToCamelCase" value="false"/> <br /> <!-- MyBatis 利用本地缓存机制(Local Cache)防止循环引用(circular references)和加速重复嵌套查询。 <br /> 默认值为 SESSION,这种情况下会缓存一个会话中执行的所有查询。 <br /> 若设置值为 STATEMENT,本地会话仅用在语句执行上,对相同 SqlSession 的不同调用将不会共享数据。 --> <br /> <setting name="localCacheScope" value="SESSION"/> <br /> <!-- 当没有为参数提供特定的 JDBC 类型时,为空值指定 JDBC 类型。 某些驱动需要指定列的 JDBC 类型,多数情况直接用一般类型即可,比如 NULL、VARCHAR 或 OTHER。 --> <br /> <setting name="jdbcTypeForNull" value="OTHER"/> <br /> <!-- 指定哪个对象的方法触发一次延迟加载。 --> <br /> <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/> <br /> </settings>

第五章

1. 数据库的属性配置文件:

把数据库连接信息放到一个单独的文件中。 和mybatis主配置文件分开。
目的是便于修改,保存,处理多个数据库的信息。
1)在resources目录中定义一个属性配置文件, xxxx.properties ,例如 jdbc.properties
在属性配置文件中, 定义数据,格式是 key=value
key: 一般使用 . 做多级目录的。
例如 jdbc.mysql.driver , jdbc.driver, mydriver
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql//…..
jdbc.username=root
jdbc.password=123456

2)在mybatis的主配置文件,使用 指定文件的位置
在需要使用值的地方, ${key}

2.mapper文件,使用package指定路径

  1. <mappers><br /> <!--第二种方式: 使用包名<br /> name: xml文件(mapper文件)所在的包名, 这个包中所有xml文件一次都能加载给mybatis<br /> 使用package的要求:<br /> 1. mapper文件名称需要和接口名称一样, 区分大小写的一样<br /> 2. mapper文件和dao接口需要在同一目录<br /> --><br /> <package name="com.bjpowernode.dao"/><br /> </mappers>

第六章:

PageHelper

PageHelper做数据分页的。

四、五、六章示例代码:

OrderDao

  1. package com.bjpowernode.dao;
  2. import com.bjpowernode.domain.Student;
  3. import java.util.List;
  4. public interface OrderDao {
  5. //动态sql ,使用java对象作为参数
  6. List<Student> selectStudentIf(Student student);
  7. //where使用
  8. List<Student> selectStudentWhere(Student student);
  9. //foreach 用法 1
  10. List<Student> selectForeachOne(List<Integer> idlist);
  11. //foreach 用法 2
  12. List<Student> selectForeachTwo(List<Student> stulist);
  13. }

OrderDao.xml

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="com.bjpowernode.dao.OrderDao">
  6. <!--定义sql片段-->
  7. <sql id="studentSql">
  8. select id,name, age, email from student
  9. </sql>
  10. <sql id="studentSqlOne">
  11. id,name, age, email
  12. </sql>
  13. <!-- if
  14. <if:test="使用参数java对象的属性值作为判断条件,语法 属性=XXX值">
  15. -->
  16. <select id="selectStudentIf" resultType="com.bjpowernode.domain.Student">
  17. select <include refid="studentSqlOne" /> from student
  18. where id > 0
  19. <if test="name !=null and name !='' ">
  20. and name = #{name}
  21. </if>
  22. <if test="age > 0">
  23. or age > #{age}
  24. </if>
  25. </select>
  26. <!--
  27. where: <where> <if> <if>...</where>
  28. -->
  29. <select id="selectStudentWhere" resultType="com.bjpowernode.domain.Student">
  30. <include refid="studentSql" />
  31. <where>
  32. <if test="name !=null and name !='' ">
  33. name = #{name}
  34. </if>
  35. <if test="age > 0">
  36. or age > #{age}
  37. </if>
  38. </where>
  39. </select>
  40. <!--foreach使用1 List<Integer>-->
  41. <select id="selectForeachOne" resultType="com.bjpowernode.domain.Student">
  42. select * from student where id in
  43. <foreach collection="list" item="myid" open="(" close=")" separator=",">
  44. #{myid}
  45. </foreach>
  46. </select>
  47. <!--<select id="selectForeachTwo" resultType="com.bjpowernode.domain.Student">
  48. select * from student where id in
  49. <foreach collection="list" item="stu" open="(" close=")" separator=",">
  50. #{stu.id}
  51. </foreach>
  52. </select>-->
  53. <select id="selectForeachTwo" resultType="com.bjpowernode.domain.Student">
  54. <include refid="studentSql" /> where id in (
  55. <foreach collection="list" item="stu" >
  56. #{stu.id},
  57. </foreach>
  58. -1 )
  59. </select>
  60. </mapper>

StudentDao

  1. package com.bjpowernode.dao;
  2. import com.bjpowernode.domain.Student;
  3. import java.util.List;
  4. public interface StudentDao {
  5. //动态sql ,使用java对象作为参数
  6. List<Student> selectStudentIf(Student student);
  7. //where使用
  8. List<Student> selectStudentWhere(Student student);
  9. //foreach 用法 1
  10. List<Student> selectForeachOne(List<Integer> idlist);
  11. //foreach 用法 2
  12. List<Student> selectForeachTwo(List<Student> stulist);
  13. //使用PageHelper分页数据
  14. List<Student> selectAll();
  15. }

StudentDao.xml

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="com.bjpowernode.dao.StudentDao">
  6. <!--定义sql片段-->
  7. <sql id="studentSql">
  8. select id,name, age, email from student
  9. </sql>
  10. <sql id="studentSqlOne">
  11. id,name, age, email
  12. </sql>
  13. <!-- if
  14. <if:test="使用参数java对象的属性值作为判断条件,语法 属性=XXX值">
  15. -->
  16. <select id="selectStudentIf" resultType="com.bjpowernode.domain.Student">
  17. select <include refid="studentSqlOne" /> from student
  18. where id > 0
  19. <if test="name !=null and name !='' ">
  20. and name = #{name}
  21. </if>
  22. <if test="age > 0">
  23. or age > #{age}
  24. </if>
  25. </select>
  26. <!--
  27. where: <where> <if> <if>...</where>
  28. -->
  29. <select id="selectStudentWhere" resultType="com.bjpowernode.domain.Student">
  30. <include refid="studentSql" />
  31. <where>
  32. <if test="name !=null and name !='' ">
  33. name = #{name}
  34. </if>
  35. <if test="age > 0">
  36. or age > #{age}
  37. </if>
  38. </where>
  39. </select>
  40. <!--foreach使用1 List<Integer>-->
  41. <select id="selectForeachOne" resultType="com.bjpowernode.domain.Student">
  42. select * from student where id in
  43. <foreach collection="list" item="myid" open="(" close=")" separator=",">
  44. #{myid}
  45. </foreach>
  46. </select>
  47. <!--<select id="selectForeachTwo" resultType="com.bjpowernode.domain.Student">
  48. select * from student where id in
  49. <foreach collection="list" item="stu" open="(" close=")" separator=",">
  50. #{stu.id}
  51. </foreach>
  52. </select>-->
  53. <select id="selectForeachTwo" resultType="com.bjpowernode.domain.Student">
  54. <include refid="studentSql" /> where id in (
  55. <foreach collection="list" item="stu" >
  56. #{stu.id},
  57. </foreach>
  58. -1 )
  59. </select>
  60. <!--查询所有-->
  61. <select id="selectAll" resultType="com.bjpowernode.domain.Student">
  62. select * from student order by id
  63. </select>
  64. </mapper>

Student

  1. package com.bjpowernode.domain;
  2. public class Student {
  3. private Integer id;
  4. private String name;
  5. private String email;
  6. private Integer age;
  7. public Integer getId() {
  8. return id;
  9. }
  10. public void setId(Integer id) {
  11. this.id = id;
  12. }
  13. public String getName() {
  14. return name;
  15. }
  16. public void setName(String name) {
  17. this.name = name;
  18. }
  19. public String getEmail() {
  20. return email;
  21. }
  22. public void setEmail(String email) {
  23. this.email = email;
  24. }
  25. public Integer getAge() {
  26. return age;
  27. }
  28. public void setAge(Integer age) {
  29. this.age = age;
  30. }
  31. @Override
  32. public String toString() {
  33. return "Student{" +
  34. "id=" + id +
  35. ", name='" + name + '\'' +
  36. ", email='" + email + '\'' +
  37. ", age=" + age +
  38. '}';
  39. }
  40. }

工具类

  1. package com.bjpowernode.utils;
  2. import org.apache.ibatis.io.Resources;
  3. import org.apache.ibatis.session.SqlSession;
  4. import org.apache.ibatis.session.SqlSessionFactory;
  5. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
  6. import java.io.IOException;
  7. import java.io.InputStream;
  8. public class MyBatisUtils {
  9. private static SqlSessionFactory factory = null;
  10. static {
  11. String config="mybatis.xml"; // 需要和你的项目中的文件名一样
  12. try {
  13. InputStream in = Resources.getResourceAsStream(config);
  14. //创建SqlSessionFactory对象,使用SqlSessionFactoryBuild
  15. factory = new SqlSessionFactoryBuilder().build(in);
  16. } catch (IOException e) {
  17. e.printStackTrace();
  18. }
  19. }
  20. //获取SqlSession的方法
  21. public static SqlSession getSqlSession() {
  22. SqlSession sqlSession = null;
  23. if( factory != null){
  24. sqlSession = factory.openSession();// 非自动提交事务
  25. }
  26. return sqlSession;
  27. }
  28. }

QueryParam

  1. package com.bjpowernode.vo;
  2. public class QueryParam {
  3. private String paramName;
  4. private Integer paramAge;
  5. public String getParamName() {
  6. return paramName;
  7. }
  8. public void setParamName(String paramName) {
  9. this.paramName = paramName;
  10. }
  11. public Integer getParamAge() {
  12. return paramAge;
  13. }
  14. public void setParamAge(Integer paramAge) {
  15. this.paramAge = paramAge;
  16. }
  17. }

.properties文件

  1. jdbc.driver=com.mysql.jdbc.Driver
  2. jdbc.url=jdbc:mysql://localhost:3306/springdb
  3. jdbc.user=root
  4. jdbc.passwd=123456

mybatis.xml

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration
  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <configuration>
  6. <!--指定properties文件的位置,从类路径根开始找文件-->
  7. <properties resource="jdbc.properties" />
  8. <!--settings:控制mybatis全局行为-->
  9. <settings>
  10. <!--设置mybatis输出日志-->
  11. <setting name="logImpl" value="STDOUT_LOGGING"/>
  12. </settings>
  13. <!--定义别名-->
  14. <typeAliases>
  15. <!--
  16. 第一种方式:
  17. 可以指定一个类型一个自定义别名
  18. type:自定义类型的全限定名称
  19. alias:别名(短小,容易记忆的)
  20. -->
  21. <!--<typeAlias type="com.bjpowernode.domain.Student" alias="stu" />
  22. <typeAlias type="com.bjpowernode.vo.ViewStudent" alias="vstu" />-->
  23. <!--
  24. 第二种方式
  25. <package> name是包名, 这个包中的所有类,类名就是别名(类名不区分大小写)
  26. -->
  27. <package name="com.bjpowernode.domain"/>
  28. <package name="com.bjpowernode.vo"/>
  29. </typeAliases>
  30. <!--配置插件-->
  31. <plugins>
  32. <plugin interceptor="com.github.pagehelper.PageInterceptor" />
  33. </plugins>
  34. <environments default="mydev">
  35. <environment id="mydev">
  36. <!--
  37. transactionManager:mybatis提交事务,回顾事务的方式
  38. type: 事务的处理的类型
  39. 1JDBC : 表示mybatis底层是调用JDBC中的Connection对象的,commit rollback
  40. 2MANAGED : mybatis的事务处理委托给其它的容器(一个服务器软件,一个框架(spring))
  41. -->
  42. <transactionManager type="JDBC"/>
  43. <!--
  44. dataSource:表示数据源,java体系中,规定实现了javax.sql.DataSource接口的都是数据源。
  45. 数据源表示Connection对象的。
  46. type:指定数据源的类型
  47. 1POOLED: 使用连接池, mybatis会创建PooledDataSource
  48. 2UPOOLED: 不使用连接池, 在每次执行sql语句,先创建连接,执行sql,在关闭连接
  49. mybatis会创建一个UnPooledDataSource,管理Connection对象的使用
  50. 3JNDIjava命名和目录服务(windows注册表)
  51. -->
  52. <dataSource type="POOLED">
  53. <!--数据库的驱动类名-->
  54. <property name="driver" value="${jdbc.driver}"/>
  55. <!--连接数据库的url字符串-->
  56. <property name="url" value="${jdbc.url}"/>
  57. <!--访问数据库的用户名-->
  58. <property name="username" value="${jdbc.user}"/>
  59. <!--密码-->
  60. <property name="password" value="${jdbc.passwd}"/>
  61. </dataSource>
  62. </environment>
  63. </environments>
  64. <!-- sql mapper(sql映射文件)的位置-->
  65. <mappers>
  66. <!--第一种方式:指定多个mapper文件-->
  67. <!--<mapper resource="com/bjpowernode/dao/StudentDao.xml"/>
  68. <mapper resource="com/bjpowernode/dao/OrderDao.xml" />-->
  69. <!--第二种方式: 使用包名
  70. name: xml文件(mapper文件)所在的包名, 这个包中所有xml文件一次都能加载给mybatis
  71. 使用package的要求:
  72. 1. mapper文件名称需要和接口名称一样, 区分大小写的一样
  73. 2. mapper文件和dao接口需要在同一目录
  74. -->
  75. <package name="com.bjpowernode.dao"/>
  76. <!-- <package name="com.bjpowernode.dao2"/>
  77. <package name="com.bjpowernode.dao3"/>-->
  78. </mappers>
  79. </configuration>

pom.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <groupId>com.bjpowernode</groupId>
  6. <artifactId>ch06-dynamic-sql</artifactId>
  7. <version>1.0-SNAPSHOT</version>
  8. <properties>
  9. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  10. <maven.compiler.source>1.8</maven.compiler.source>
  11. <maven.compiler.target>1.8</maven.compiler.target>
  12. </properties>
  13. <dependencies>
  14. <dependency>
  15. <groupId>junit</groupId>
  16. <artifactId>junit</artifactId>
  17. <version>4.11</version>
  18. <scope>test</scope>
  19. </dependency>
  20. <!--PageHelper依赖-->
  21. <dependency>
  22. <groupId>com.github.pagehelper</groupId>
  23. <artifactId>pagehelper</artifactId>
  24. <version>5.1.10</version>
  25. </dependency>
  26. <!--mybatis依赖-->
  27. <dependency>
  28. <groupId>org.mybatis</groupId>
  29. <artifactId>mybatis</artifactId>
  30. <version>3.5.1</version>
  31. </dependency>
  32. <!--mysql驱动-->
  33. <dependency>
  34. <groupId>mysql</groupId>
  35. <artifactId>mysql-connector-java</artifactId>
  36. <version>5.1.9</version>
  37. </dependency>
  38. </dependencies>
  39. <build>
  40. <resources>
  41. <resource>
  42. <directory>src/main/java</directory><!--所在的目录-->
  43. <includes><!--包括目录下的.properties,.xml 文件都会扫描到-->
  44. <include>**/*.properties</include>
  45. <include>**/*.xml</include>
  46. </includes>
  47. <filtering>false</filtering>
  48. </resource>
  49. </resources>
  50. </build>
  51. </project>

测试类

  1. package com.bjpowernode;
  2. import com.bjpowernode.dao.StudentDao;
  3. import com.bjpowernode.domain.Student;
  4. import com.bjpowernode.utils.MyBatisUtils;
  5. import com.github.pagehelper.PageHelper;
  6. import org.apache.ibatis.session.SqlSession;
  7. import org.junit.Test;
  8. import java.util.ArrayList;
  9. import java.util.List;
  10. public class TestMyBatis {
  11. @Test
  12. public void testSelectStudentIf(){
  13. SqlSession sqlSession = MyBatisUtils.getSqlSession();
  14. StudentDao dao = sqlSession.getMapper(StudentDao.class);
  15. Student student = new Student();
  16. // student.setName("李四");
  17. // student.setAge(18);
  18. student.setName("李四");
  19. student.setAge(20);
  20. List<Student> students = dao.selectStudentIf(student);
  21. for(Student stu:students){
  22. System.out.println("if==="+stu);
  23. }
  24. }
  25. @Test
  26. public void testSelectStudentWhere(){
  27. SqlSession sqlSession = MyBatisUtils.getSqlSession();
  28. StudentDao dao = sqlSession.getMapper(StudentDao.class);
  29. Student student = new Student();
  30. //student.setName("李四");
  31. //student.setAge(18);
  32. List<Student> students = dao.selectStudentWhere(student);
  33. for(Student stu:students){
  34. System.out.println("where==="+stu);
  35. }
  36. }
  37. @Test
  38. public void testfor(){
  39. List<Integer> list = new ArrayList<>();
  40. list.add(1001);
  41. list.add(1002);
  42. list.add(1003);
  43. //String sql="select * from student where id in (1001,1002,1003)";
  44. String sql="select * from student where id in";
  45. StringBuilder builder = new StringBuilder("");
  46. int init=0;
  47. int len = list.size();
  48. //添加开始的 (
  49. builder.append("(");
  50. for(Integer i:list){
  51. builder.append(i).append(",");
  52. }
  53. builder.deleteCharAt(builder.length()-1);
  54. //循环结尾
  55. builder.append(")");
  56. sql = sql + builder.toString();
  57. System.out.println("sql=="+sql);
  58. }
  59. @Test
  60. public void testSelectForEach(){
  61. SqlSession sqlSession = MyBatisUtils.getSqlSession();
  62. StudentDao dao = sqlSession.getMapper(StudentDao.class);
  63. List<Integer> list = new ArrayList<>();
  64. list.add(1001);
  65. list.add(1002);
  66. list.add(1003);
  67. List<Student> students = dao.selectForeachOne(list);
  68. for(Student stu:students){
  69. System.out.println("foreach--one ==="+stu);
  70. }
  71. }
  72. @Test
  73. public void testSelectForTwo(){
  74. SqlSession sqlSession = MyBatisUtils.getSqlSession();
  75. StudentDao dao = sqlSession.getMapper(StudentDao.class);
  76. List<Student> stuList = new ArrayList<>();
  77. Student s1 = new Student();
  78. s1.setId(1002);
  79. s1.setName("lisi");
  80. stuList.add(s1);
  81. s1 = new Student();
  82. s1.setId(1005);;
  83. s1.setName("zs");
  84. stuList.add(s1);
  85. List<Student> students = dao.selectForeachTwo(stuList);
  86. for(Student stu:students){
  87. System.out.println("foreach--two ==="+stu);
  88. }
  89. }
  90. @Test
  91. public void testSelectAllPageHelper(){
  92. SqlSession sqlSession = MyBatisUtils.getSqlSession();
  93. StudentDao dao = sqlSession.getMapper(StudentDao.class);
  94. //加入PageHelper的方法,分页
  95. // pageNum: 第几页, 从1开始
  96. // pageSize: 一页中有多少行数据
  97. PageHelper.startPage(1,3);
  98. List<Student> students = dao.selectAll();
  99. for(Student stu:students){
  100. System.out.println("foreach--one ==="+stu);
  101. }
  102. }
  103. }