java - mybatis
mybatis是用来负责和数据库进行交互的框架(DAO (data access object))。
数据库交互的方法:
1. jdbc: java自带的最原始的方法,调用连接方法(数据库ip,账号密码,查询条件等都是参数),然后拼接sql语句进行操作
耦合性太大(修改数据库后需要修改所有java相关代码,sql语句和配置在java的class类里),所以放弃了
2. hibernet: 通过对象关系映射(Object Relational Mapping,简称ORM),直接把数据库表映射成class类,字段一一对应。通过操作class类和使用hibernet提供的方法来操作数据库。
黑盒操作,sql语句被封装,复杂的业务逻辑和多表关联查询操作起来会很不灵活。而且还要学习hibernet自己的“sql”,工作量反而大了。
3.mybatis:通过配置文件连接数据库,方便维护,除了数据库连接和sql语句,其他全部自动完成。
综合了上面两种的优点,开发方便,耦合度低,可以定制sql。
下面写一个简单的例子:
工具:idea,sqlyog
其实mybatis用普通java工程就能运行,不过还要下载导入jar包,创建xml之类的,真工作了也不可能那么干,这里为了方便就直接用maven了。
mybatis有两种查询方法,一种是xml配置文件,一种是用注解写在dao层。
以前我都是用注解- -后来据说如果是多表关联和复杂查询,一般用xml,所以整理一下xml的方法。
reference: https://mybatis.org/mybatis-3/zh/getting-started.html
mybatis中文官网
mybatis查询mysql数据库
1.创建数据库和表
CREATE DATABASE mybatis_test; #创建数据库 USE mybatis_test; #使用数据库 #创建account表 CREATE TABLE account( account_id INT PRIMARY KEY AUTO_INCREMENT, account_username VARCHAR(20), account_password VARCHAR(20), user_id INT ); #创建userinfo表 CREATE TABLE userinfo( user_id INT PRIMARY KEY, user_name VARCHAR(20), user_age INT ); #插入数据 INSERT INTO account VALUES(1, 'aaa', 111, 1); INSERT INTO account VALUES(2, 'bbb', 222, 2); INSERT INTO userinfo VALUES(1, 'zhang', 21); INSERT INTO userinfo VALUES(2, 'wang', 22);
2. IDEA新建ssm架构的工程 (不过我们只实现mybatis部分就可以了)
File - new - Project
Maven - 勾选Create from archetype - 选择maven的webapp (有很多webapp- -别选错了),上面是选择JDK版本,貌似现在开发都用8(1.8),我这个是最新的10(也就是1.10)
填写组信息
然后一直next,到最后,起个项目名字,点finish。
项目创建完成。
3. 导入jar包
在pom.xml里<properties></properties>部分的下面加上
<dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.6</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.5</version> </dependency> </dependencies>
相当于导入了jar包 (等build或者启动工程的时候就会自动导入jar包了)
一个连接mysql数据库的,一个mybatis的
4.添加必要文件夹
main下面创建2个新文件夹,java 和 resources
然后java设为source root (相当于直接创建普通java工程中的src的作用)
resources设为resources root (相当于普通java工程中的conf)
java下面创建com package, 然后com package下面创建4个package用来存放 controller,service,entities,dao
mybatis主要用到dao层和entities
3. 在enetities包中创建Account类 和 Userinfo类,用来映射刚才数据库新建的Account表 和 userinfo表中的数据。
Account
package com.entities; public class Account { private int account_id; private String account_username; private String account_password; private Userinfo userinfo; public int getAccount_id() { return account_id; } public void setAccount_id(int account_id) { this.account_id = account_id; } public String getAccount_username() { return account_username; } public void setAccount_username(String account_username) { this.account_username = account_username; } public String getAccount_password() { return account_password; } public void setAccount_password(String account_password) { this.account_password = account_password; } public Userinfo getUserinfo() { return userinfo; } public void setUserinfo(Userinfo userinfo) { this.userinfo = userinfo; } @Override public String toString() { return "Account{" + "account_id=" + account_id + ", account_username='" + account_username + '\'' + ", account_password='" + account_password + '\'' + ", userinfo=" + userinfo + '}'; } }
Userinfo
package com.entities; public class Userinfo { private int user_id; private String user_name; private int user_age; public int getUser_id() { return user_id; } public void setUser_id(int user_id) { this.user_id = user_id; } public String getUser_name() { return user_name; } public void setUser_name(String user_name) { this.user_name = user_name; } public int getUser_age() { return user_age; } public void setUser_age(int user_age) { this.user_age = user_age; } @Override public String toString() { return "Userinfo{" + "user_id=" + user_id + ", user_name='" + user_name + '\'' + ", user_age=" + user_age + '}'; } }
4. 先只测最简单的根据id查找,在dao层中创建接口 UserinfoDao
package com.dao; import com.entities.Userinfo; public interface UserinfoDao { public Userinfo getUserById(int user_id); }
5. 添加配置文件:
在resources下面创建两个xml
mybatis.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> <environments default="mysql"> <environment id="mysql"> <transactionManager type="JDBC"></transactionManager> <dataSource type="pooled"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatis_test"/> <!--mysql的库连接--> <property name="username" value="root"/> <!--mysql的账户密码,根据自己的mysql实际情况修改--> <property name="password" value="Zy1990526"/> </dataSource> </environment> </environments> <mappers> <mapper resource="UserinfoDao.xml"/> <!--扫描xml, 生成dao接口的实现类用来对数据进行操作--> </mappers> </configuration>
UserinfoDao.xml
mybatis底层其实就是jdbc,他会根据这个xml访问数据库,实现dao接口中的方法。
名字和上面配置文件里的对应就好
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.dao.UserinfoDao"> <!--对象接口的全类名--> <select id="getUserById" parameterType="int" resultType="com.entities.Userinfo"> <!--id是方法名, resulttype是返回类型--> select * from userinfo where user_id = #{user_id} <!--sql语句,参数用 #{方法的参数名} 表示--> </select> </mapper>
6. 创建测试:
在java下面创建test package,然后创建 MybatisTest 类, 利用用junit来单元测试。
package test; import com.dao.UserinfoDao; import com.entities.Userinfo; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.Test; import java.io.IOException; import java.io.InputStream; public class MybatisTest { @Test public void test(){ String resource = "mybatisConfig.xml"; //配置文件 InputStream inputStream = null; try { inputStream = Resources.getResourceAsStream(resource); } catch (IOException e) { e.printStackTrace(); } SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); SqlSession openSession = sqlSessionFactory.openSession(); UserinfoDao userinfoDao = openSession.getMapper(UserinfoDao.class); Userinfo u = userinfoDao.getUserById(1); System.out.println(u.toString()); } }
然后就可以测试了
结果:
上面的警告查了一下是因为java版本过高-提醒你将来可能出问题 - -,无视好了。。。