1、入门程序实现需求

根据用户id查询一个用户信息

根据用户名称模糊查询用户信息列表

添加用户(二)

更新用户(二)

删除用户(二)

2、引入Mybatis所需 jar 包(Maven工程)

<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.7</version>
</dependency> <dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.0</version>
</dependency> <dependency>
<groupId>cglib</groupId>
<artifactId>cglib-nodep</artifactId>
<version>2.2</version>
</dependency> <dependency>
<groupId>asm</groupId>
<artifactId>asm</artifactId>
<version>3.3.1</version>
</dependency> <dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.1</version>
</dependency> <dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.5</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.5</version>
<scope>test</scope>
</dependency> <dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
</dependencies>

  最终引入jar包:

 

2、在classpath下创建log4j.properties如下:

# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

3、在classpath下创建SqlMapConfig.xml,如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 和spring整合后 environments配置将废除-->
<environments default="development">
<environment id="development">
<!-- 使用jdbc事务管理-->
<transactionManager type="JDBC" />
<!-- 数据库连接池-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8" />
<property name="username" value="root" />
<property name="password" value="root" />
</dataSource>
</environment>
</environments> </configuration>

4、在classpath下的sqlmap目录下创建sql映射文件Users.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="test">
<!--
parameterType:指定输入参数的类型,这里指定int型
#{id}:其中的id表示接收输入的参数,参数的名称为id,如果输入参数是简单类型,
#{}中参数名可以任意,可以是value或其他的名称
resultType:指定sql输出结果所映射的java类型,select 指定resultType表示将单条记录映射成的Java对象
-->
<select id="findUserByIDd" parameterType="int" resultType="com.bjxb.mybatis.pojo.User">
SELECT * FROM USER WHERE ID = #{id}
</select>
</mapper>

5、pojo类作为mybatis进行sql映射使用,pojo类通常与数据库表对应,User.java如下:

Public class User {
private int id;
private String username;// 用户姓名
private String sex;// 性别
private Date birthday;// 生日
private String address;// 地址
get/set……
}

6、在 sqlMapConfig.xml 中加载 User.xml

<!-- 加载映射文件 -->
<mappers>
<mapper resource="sqlMap/User.xml"/>
</mappers>

7、根据id查询用户信息,编写程序

public class MybatisFirst {

    // 根据id查询用户的信息,得到一条记录的结果
@Test
public void findUserByIdTest() {
SqlSession sqlSession = null; try {
// mybatis配置文件
String resource = "config/SqlMapConfig.xml";// 得到配置文件流
InputStream inputStream = Resources.getResourceAsStream(resource); // 创建会话工厂,传入mybatis的配置文件信息
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); // 通过工厂的到SQLSession
sqlSession = sqlSessionFactory.openSession(); // 通过SQLSession操作数据库
// 第一个参数:就是映射文件中statement中的id,等于=namespace+statement的id
// 第二个参数:指定和映射文件中所匹配的parameterType类型的参数
// sqlSession.selectOne结果是与映射文件中所匹配resultType类型的对象
User user = sqlSession.selectOne("test.findUserById", 1); System.out.println(user);
} catch (Exception e) {
// TODO: handle exception
}finally {
// 释放资源
sqlSession.close();
} }
}

8、根据用户名模糊查询用户信息,编写程序

  (1)User.xml,添加根据用户名称模糊查询用户信息的 sql 语句

<!-- 根据用户名称模糊查询用户信息,可能返回多条
resultType:指定的就是单条记录所映射的java对象类型
${}:表示拼接sql串,将接收到的参数的内容,不加任何的修饰拼接在sql中。
使用${}拼接sql,可能会引起sql注入
${value}:接收输入参数的内容,如果传入类型是简单类型,${}中只能使用value
-->
<select id="findUserByName" parameterType="java.lang.String" resultType="com.bjxb.mybatis.pojo.User">
SELECT * FROM USER WHERE USERNAME LIKE '%${value}%'
</select>

  

  我们观察到,输出的 SQL 语句,like后面并没有出现 ?,即占位符。这种情况就有可能出现 SQL 注入

 

  

  (2)编程:

// 根据用户名称来模糊查询用户列表
@Test
public void findUserByNameTest() {
SqlSession sqlSession = null; try {
// mybatis配置文件
String resource = "config/SqlMapConfig.xml";
// 得到配置文件流
InputStream inputStream = Resources.getResourceAsStream(resource); // 创建会话工厂,传入mybatis的配置文件信息
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); // 通过工厂的到SQLSession
sqlSession = sqlSessionFactory.openSession(); // list中的User和映射文件中的resultType所指定的类型一致
List<User> list = sqlSession.selectList("test.findUserByName", "小明");
/**
* 方案一(不可行):我们直接传入参数"小明", 映射文件对应为 '%#{value}%'
* 不可行原因: 因为#{}使用的是占位符 ? ,在实际编译过程中,因为我们传入的是字符串,会自动在小明两边加上''
* 最终效果为 name like '%'小明'%' 显然查不出
*
* 方案二(可行):我们可以传入参数 "%小明%",映射文件中用#{}接收
* 优点:防止sql注入; 缺点:却需要我们每次都传入两个%
*
* 方案三(可行):我们依然直接传入"小明",映射文件对应为 '%${}%'
* 优点:我们不需要传入%,只需要传入查询名 ; 缺点:由于${}不会使用占位符 ? 而是直接拼接在SQL中, 会出现如下情况:
* SQL注入可以点击查看博主另一篇博客
*
*/
System.out.println(list); } catch (Exception e) {
// TODO: handle exception
}finally {
sqlSession.close();
} }

9、小结

  9.1:parameterType:在映射文件中通过 parameterType 指定输入参数的类型

  9.2:resultType:在映射文件中通过 resultType 指定输出结果的类型

  9.3:#{ }和 ${ }的区别:

    #{ } 表示一个占位符,#{ }接收输入参数,类型可以是简单类型,pojo,HashMap。

    如果接收的是简单类型,#{ } 中可以写成value或者其他名称。

    #{ } 接收 pojo 对象值,通过 OGNL 来读取对象中的属性值,通过属性.属性.属性...的方式获取对象属性值。

    

    ${ } 表示一个拼接符,会引起SQL注入,所以不建议使用 ${ }。${ }接收输入参数,类型可以是简单类型,pojo,HashMap。

    如果接收的是简单类型,${ } 中只可以写成value。

    ${ } 接收 pojo 对象值,通过 OGNL 来读取对象中的属性值,通过属性.属性.属性...的方式获取对象属性值。    

  9.4:selectOne :表示查询出一条记录进行映射,一条记录也可以用 selectList 实现(查询出的 list 中只有一个对象)

  9.5:selectList :表示查询出一个列表(多条记录)进行映射,多条记录不可以用 selectOne

    如果查询结果是 List,我们使用 selectOne 报错:

    

最新文章

  1. 使用THINKPHP中的控制器和模块查询数据库
  2. [转]Objective-c中@interface、@implementation、@protocal
  3. LeetCode5:Longest Palindromic Substring
  4. Vault 不同版本的API的异同
  5. 【TYVJ 1463】智商问题 (闲得无聊)
  6. 用Quartz进行作业调度(转)
  7. Servlet中的cookie和session
  8. 两个异步处理AsyncTask和Handler的优缺点
  9. [codility]Falling-discs
  10. BestCoder 2nd Anniversary 1001 Oracle
  11. 基于visual Studio2013解决面试题之0503取最大数字字符串
  12. Gentoo挂载ntfs的NTFS分区
  13. 以setTimeout来聊聊Event Loop
  14. winfrom中将panel另存为图片
  15. python 基础(四) 正则,递归 生成器
  16. Unity3D Shader 高斯模糊
  17. python简说(十九)操作redis
  18. ui选型
  19. spring-boot-starter-data-elasticsearch 整合elasticsearch 5.x详解
  20. 为什么你用不好Numpy的random函数?

热门文章

  1. HashMap常用方法(简版)
  2. npm cnpm yarn 安装
  3. vue实时显示当前时间且转化为“yyyy-MM-dd hh:mm:ss”格式
  4. iframe和伪造ajax
  5. Spark SQL和CSl
  6. zabbix--客户端部署(新手入门)
  7. (转载)字符编码那点事:快速理解ASCII、Unicode、GBK和UTF-8
  8. ESXI 虚拟化误删除管理端口Management Network (vmk0),导致无法访问后台解决方案
  9. CF258D题解
  10. Linux上搭建meterSphere