JDBC流程:
- 加载驱动
- 获取链接
- 获取操作对象
- 操作数据库
- 返回结果
JDBCDemo(以MySql为例):
1 //加载驱动
2 Class.forName("com.mysql.jdbc.Driver");
3 String url = "jdbc:mysql://127.0.0.1:3306/mysql";//jdbc:mysql://localhost:3306/+数据库名称
4 String userName = "root";//数据库账号
5 String passWord = "root";//数据库密码
6 //获取链接
7 Connection connection = DriverManager.getConnection(url, userName, passWord);
8 //获取操作对象
9 Statement statement = connection.createStatement();
10 //操作数据库
11 String querySql = "SELECT * FROM USER";//查询语句
12 String addSql = "INSERT INTO USER VALUES ('001','zhangsan','001');";//增加语句
13 String deleteSql = "DELETE FROM USER WHERE id = '001';";//删除语句
14 String updateSql = "UPDATE USER SET userName = 'lisi' WHERE id = '001';";//更新语句
15 //返回结果
16 ResultSet resultSet = statement.executeQuery(querySql);
17 int addFlag = statement.executeUpdate(addSql);//返回操作行数
18 int deleteFlag = statement.executeUpdate(deleteSql);//返回操作行数
19 int updateFlag = statement.executeUpdate(updateSql);//返回操作行数
Mybatis介绍:
百度:
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。
项目Demo:
数据库准备:新建库:mybatis,然后建表:user,插入几行数据。
CREATE TABLE USER (
userId varchar(100),
userName varchar(100),
phoneNum varchar(100),
passWorld varchar(100)
);
INSERT INTO USER VALUES ('001','张三','13888888888','123');
INSERT INTO USER VALUES ('002','李四','13888888888','456');
INSERT INTO USER VALUES ('003','王五','13888888888','789');
Pom.xml:
![](https://i-blog.csdnimg.cn/blog_migrate/6420d816f1a9ff3ecefc9a4e2d0486ec.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/5208b6f832d92b8420c0c9aa948a9b2d.gif)
1 <?xml version="1.0" encoding="UTF-8"?>
2
3 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5 <modelVersion>4.0.0</modelVersion>
6
7 <groupId>com.demo.ibatis</groupId>
8 <artifactId>ibatis</artifactId>
9 <version>1.0-SNAPSHOT</version>
10 <packaging>war</packaging>
11
12 <name>ibatis Maven Webapp</name>
13 <!-- FIXME change it to the project's website -->
14 <url>http://www.example.com</url>
15
16 <properties>
17 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
18 <maven.compiler.source>1.8</maven.compiler.source>
19 <maven.compiler.target>1.8</maven.compiler.target>
20 </properties>
21
22 <dependencies>
23 <dependency>
24 <groupId>junit</groupId>
25 <artifactId>junit</artifactId>
26 <version>4.11</version>
27 <scope>test</scope>
28 </dependency>
29 <dependency>
30 <groupId>org.springframework</groupId>
31 <artifactId>spring-webmvc</artifactId>
32 <version>5.1.7.RELEASE</version>
33 </dependency>
34 <dependency>
35 <groupId>org.slf4j</groupId>
36 <artifactId>slf4j-log4j12</artifactId>
37 <version>1.7.12</version>
38 </dependency>
39 <dependency>
40 <groupId>jstl</groupId>
41 <artifactId>jstl</artifactId>
42 <version>1.2</version>
43 </dependency>
44 <dependency>
45 <groupId>javax.servlet</groupId>
46 <artifactId>servlet-api</artifactId>
47 <version>2.5</version>
48 </dependency>
49 <!-- MySql -->
50 <dependency>
51 <groupId>mysql</groupId>
52 <artifactId>mysql-connector-java</artifactId>
53 <version>8.0.16</version>
54 </dependency>
55 <dependency>
56 <groupId>org.mybatis</groupId>
57 <artifactId>mybatis</artifactId>
58 <version>3.5.1</version>
59 </dependency>
60 </dependencies>
61
62 <build>
63 <finalName>ibatis</finalName>
64 <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
65 <plugins>
66 <plugin>
67 <artifactId>maven-clean-plugin</artifactId>
68 <version>3.1.0</version>
69 </plugin>
70 <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
71 <plugin>
72 <artifactId>maven-resources-plugin</artifactId>
73 <version>3.0.2</version>
74 </plugin>
75 <plugin>
76 <artifactId>maven-compiler-plugin</artifactId>
77 <version>3.8.0</version>
78 </plugin>
79 <plugin>
80 <artifactId>maven-surefire-plugin</artifactId>
81 <version>2.22.1</version>
82 </plugin>
83 <plugin>
84 <artifactId>maven-war-plugin</artifactId>
85 <version>3.2.2</version>
86 </plugin>
87 <plugin>
88 <artifactId>maven-install-plugin</artifactId>
89 <version>2.5.2</version>
90 </plugin>
91 <plugin>
92 <artifactId>maven-deploy-plugin</artifactId>
93 <version>2.8.2</version>
94 </plugin>
95 </plugins>
96 </pluginManagement>
97 </build>
98 </project>
Web.xml:不用动,使用创建项目时默认的即可。
下面四个文件放在项目的“Resources”目录下。
jdbc.properties(数据库信息):
![](https://i-blog.csdnimg.cn/blog_migrate/b6019a615543de791ae7b8937759bb8b.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/94d08761c916c251b70e9bee7a153bc4.gif)
1 driver=com.mysql.jdbc.Driver
2 url=jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
3 username=root
4 password=root
log4j.properties(日志信息):
![](https://i-blog.csdnimg.cn/blog_migrate/80912b70de08d8fee255d3f494caf33a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/19ce44e352366fd7028b7429a61481e2.gif)
1 ### direct log messages to stdout ###
2 log4j.appender.stdout=org.apache.log4j.ConsoleAppender
3 log4j.appender.stdout.Target=System.out
4 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
5 log4j.appender.stdout.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c]-[%p] %m%n
6
7 ### direct messages to file mylog.log ###
8 log4j.appender.file=org.apache.log4j.FileAppender
9 log4j.appender.file.File=e:/mylog.log
10 log4j.appender.file.layout=org.apache.log4j.PatternLayout
11 log4j.appender.file.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c]-[%p] %m%n
12
13 ### set log levels - for more verbose logging change 'info' to 'debug' ###
14
15 log4j.rootLogger=debug, stdout,file
mybatis-config.xml(mybatis配置文件★★★):
![](https://i-blog.csdnimg.cn/blog_migrate/63bbd502f07f150105945fee2b145d6d.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/d4f404f87211537ec6c57c29cf560d36.gif)
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 <!--获取JDBC的相关信息-->
7 <properties resource="jdbc.properties"></properties>
8 <!-- 配置环境:可以配置多个环境,default:配置某一个环境的唯一标识,表示默认使用哪个环境 -->
9 <environments default="development">
10 <!-- 配置环境,id:环境的唯一标识 -->
11 <environment id="development">
12 <!-- 事务管理器,type:使用jdbc的事务管理器 -->
13 <transactionManager type="JDBC"/>
14 <!-- 数据源,type:数据源类型,池类型的数据源 -->
15 <dataSource type="POOLED">
16 <!-- 配置连接信息 -->
17 <property name="driver" value="${driver}" />
18 <property name="url" value="${url}" />
19 <property name="username" value="${username}" />
20 <property name="password" value="${password}" />
21 </dataSource>
22 </environment>
23 </environments>
24 <!-- 配置映射文件:用来配置sql语句和结果集类型等 -->
25 <mappers>
26 <mapper resource="UserMapper.xml"/>
27 </mappers>
28 </configuration>
UserMapper.xml(代码操作数据库的映射文件):
![](https://i-blog.csdnimg.cn/blog_migrate/6e30c34f92e6644931f8c1571604cb09.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/0197f6b12e35558c11311874549bd238.gif)
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 <!--
6 mapper标签:配置各类声明
7 namespace:名称空间,由于映射文件有多个,为了防止crud语句的唯一标识被重复,可以设置空间名称。
8 -->
9 <mapper namespace="com.demo.mapper.UserMapper">
10 <!--
11 select:查询的statement(声明),用来编写查询语句
12 id:语句的唯一标识
13 resultType:配置返回的结果集类型
14 parameterType:传递的参数类型,可以省略
15 -->
16 <select id="queryUserById" resultType="com.demo.bean.User">
17 select * from user where userId = #{id} ;
18 </select>
19 <select id="queryUserList" resultType="com.demo.bean.User">
20 select * from user ;
21 </select>
22 <!--
23 insert:插入的statement,编写插入语句
24 id:插入语句的唯一标识
25 parameterType:插入语句的参数,可以省略
26 -->
27 <insert id="insertUser" parameterType="com.demo.bean.User">
28 insert into user VALUES (
29 #{userId},
30 #{userName},
31 #{phoneNum},
32 #{passWorld}
33 );
34 </insert>
35 <!--
36 update:更新的statement,用来编写更新语句
37 id:语句的唯一标识
38 parameterType:语句的参数,可以省略
39 -->
40 <update id="updateUser">
41 update user set userName = #{userName} where userId = #{userId};
42 </update>
43 <!--
44 delete:删除的statement,用来编写删除语句
45 id:语句的唯一标识
46 parameterType:语句的参数,可以省略
47 -->
48 <delete id="deleteUserById">
49 delete from user where userId = #{id};
50 </delete>
51
52 </mapper>
User:
![](https://i-blog.csdnimg.cn/blog_migrate/ae3d482c0cea0b6714dae14b2fdcae48.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/e11fa21a916ed1fa599d9824adb8b494.gif)
1 public class User {
2 private String userId;
3 private String userName;
4 private String phoneNum;
5 private String passWorld;
6
7 public User() {
8 }
9
10 public User(String userId, String userName, String phoneNum, String passWorld) {
11 this.userId = userId;
12 this.userName = userName;
13 this.phoneNum = phoneNum;
14 this.passWorld = passWorld;
15 }
16
17 public void setUserId(String userId) {
18 this.userId = userId;
19 }
20
21 public void setUserName(String userName) {
22 this.userName = userName;
23 }
24
25 public void setPhoneNum(String phoneNum) {
26 this.phoneNum = phoneNum;
27 }
28
29 public void setPassWorld(String passWorld) {
30 this.passWorld = passWorld;
31 }
32
33 public String getUserId() {
34 return userId;
35 }
36
37 public String getUserName() {
38 return userName;
39 }
40
41 public String getPhoneNum() {
42 return phoneNum;
43 }
44
45 public String getPassWorld() {
46 return passWorld;
47 }
48
49 @Override
50 public String toString() {
51 return "User{" +
52 "userId='" + userId + '\'' +
53 ", userName='" + userName + '\'' +
54 ", phoneNum='" + phoneNum + '\'' +
55 ", passWorld='" + passWorld + '\'' +
56 '}';
57 }
58 }
UserMapper(上面的时配置文件,这个时代码文件):
![](https://i-blog.csdnimg.cn/blog_migrate/5a2d6516b323e83608fe2f3221d061de.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/bce162a2b4e1ce6d3a2baa35f980283f.gif)
1 public interface UserMapper {
2 /**
3 * 通过id查询user对象
4 * @param id
5 * @return
6 */
7 User queryUserById(String id);
8 /**
9 * 查询所有用户
10 * @return
11 */
12 List<User> queryUserList();
13
14 /**
15 * 插入用户
16 * @param user
17 */
18 void insertUser(User user);
19
20 /**
21 * 更新用户
22 * @param user
23 */
24 void updateUser(User user);
25 /**
26 * 通过id删除用户
27 * @param id
28 */
29 void deleteUserById(String id);
30
31 }
测试:
![](https://i-blog.csdnimg.cn/blog_migrate/49c278aa5fd8bfd59a9429139773a941.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f7cb7b2d120ac9ed7f94984b68911168.gif)
1 public class MyController {
2 public static void main(String[] args) throws IOException {
3 //获取全局配置文件的输入流
4 InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
5 //加载全局配置文件获取sqlSessionFactory
6 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
7 //获取sqlSession,参数:true,自动开启事务
8 SqlSession sqlSession = sqlSessionFactory.openSession(true);
9 UserMapper mapper = sqlSession.getMapper(UserMapper.class);
10 //单个查询
11 User user1 = mapper.queryUserById("001");
12 System.out.println(user1);
13 //多个查询
14 List<User> users = mapper.queryUserList();
15 for (User user2 : users) {
16 System.out.println(user2);
17 }
18 User user3 = new User();
19 user3.setUserId("004");
20 user3.setUserName("赵六");
21 user3.setPhoneNum("13888888888");
22 user3.setPassWorld("000");
23 //增加
24 mapper.insertUser(user3);
25 //修改(把张三改为吴彦祖)
26 User user4 = new User("001","吴彦祖","13888888888","123");
27 mapper.updateUser(user4);
28 //删除
29 mapper.deleteUserById("002");
30 }
31 }
结果:
配置文件:
配置步骤:
1、 配置全局配置文件
设置环境(事务、数据源)
管理映射文件XxxMapper.xml
2、 配置映射文件
Mapper标签:用来配置不同的statement
Namespace属性:用来配置名称空间,来区分不同的映射文件中的statement
编写crud的statement:select 、update 、insert 、delete
Select:专门用于查询的statement,可以编写查询语句
Id属性:该statement的唯一标识,一般用来被引用
resultType:结果集类型
paramterType:参数类型,可以省略,一般都省略
使用步骤:
1、获取全局配置文件的数据流,加载全局配置文件
2、通过全局配置文件的输入流创建SqlSessionFactory
3、通过SqlSessionFactory获取SqlSession
4、通过SqlSession操作crud
5、关闭SqlSession,释放资源。
补充:
![](https://i-blog.csdnimg.cn/blog_migrate/46abddf1b09e66dc09061703c7c1ae39.png)
#{}:
1、 是预编译
2、 编译成占位符
3、 可以防止sql注入
4、 自动判断数据类型
5、 一个参数时,可以使用任意参数名称进行接收
${}:
1、 非预编译
2、 sql的直接拼接
3、 不能防止sql注入
4、 需要判断数据类型,如果是字符串,需要手动添加引号。
5、 一个参数时,参数名称必须是value,才能接收参数。
ResultMap:
ResultMap是mybatis中最重要最强大的元素,使用ResultMap可以解决两大问题:
- POJO属性名和表结构字段名不一致的问题(有些情况下也不是标准的驼峰格式,比如id和userId)
- 完成高级查询,比如说,一对一、一对多、多对多。