利用mybatis實現增刪改查 的小專案,單表,雙表一對多,
簡介:
MyBatis 本是apache的一個開源專案iBatis, 2010年這個專案由apache software foundation 遷移到了google code,並且改名為MyBatis 。2013年11月遷移到Github。
iBATIS一詞來源於”internet”和”abatis”的組合,是一個基於Java的持久層框架。iBATIS提供的持久層框架包括SQL Maps和Data Access Objects(DAO)
MyBatis 是支援普通 SQL查詢,儲存過程和高階對映的優秀持久層框架。MyBatis 消除了幾乎所有的JDBC程式碼和引數的手工設定以及結果集的檢索。MyBatis 使用簡單的 XML或註解用於配置和原始對映,將介面和 Java 的POJOs(Plain Old Java Objects,普通的 Java物件)對映成資料庫中的記錄。
每個MyBatis應用程式主要都是使用SqlSessionFactory例項的,一個SqlSessionFactory例項可以通過SqlSessionFactoryBuilder獲得。SqlSessionFactoryBuilder可以從一個xml配置檔案或者一個預定義的配置類的例項獲得。
下面開始我們的小專案:
1.我們已經在自己的資料庫中建立好了將要展示的三個表,並新增好了某些資料
user表:
CREATE TABLE `user` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`username` VARCHAR(50) NOT NULL COLLATE 'utf8_bin',
`psw` VARCHAR(50) NOT NULL COLLATE 'utf8_bin',
PRIMARY KEY (`id`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=12
;
Company表:
CREATE TABLE `company` (
`cid` INT(11) NOT NULL,
`name` VARCHAR(10) NOT NULL COLLATE 'utf8_bin',
`address` VARCHAR (10) NOT NULL COLLATE 'utf8_bin',
`pro` VARCHAR(10) NOT NULL COLLATE 'utf8_bin',
`city` VARCHAR(10) NOT NULL COLLATE 'utf8_bin',
`price` FLOAT NULL DEFAULT NULL,
PRIMARY KEY (`cid`)
)
COLLATE='latin1_swedish_ci'
ENGINE=InnoDB
;
Emp表:
CREATE TABLE `emp` (
`eid` INT(11) NOT NULL,
`name` VARCHAR(10) NOT NULL COLLATE 'utf8_bin',
`sex` VARCHAR(2) NULL DEFAULT NULL,
`email` VARCHAR(50) NULL DEFAULT NULL,
`salary` FLOAT NULL DEFAULT NULL,
`cid` INT(11) NULL DEFAULT NULL,
PRIMARY KEY (`eid`),
INDEX `c_e_cid` (`cid`),
CONSTRAINT `c_e_cid` FOREIGN KEY (`cid`) REFERENCES `company` (`cid`)
)
COLLATE='latin1_swedish_ci'
ENGINE=InnoDB
;
company和emp是一對多的關係
2.通過幫助文件,建立核心MyBatis配置檔案generator.xml,
在該檔案中已經告訴MyBatis所連結的資料庫,所使用哪種方式對資料表進行對映。以及一些其他資訊。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<!-- 資料庫驅動包位置 -->
<!-- <classPathEntry location="C:\Users\fangjiejie\.IntelliJIdea2016.1\config\jdbc-drivers\mysql-connector-java-5.1.35.jar" /> -->
<classPathEntry location="C:\Users\fangjiejie\.IntelliJIdea2016.1\config\jdbc-drivers\mysql-connector-java-5.1.35-bin.jar" />
<context id="mysqltools" targetRuntime="MyBatis3">
<commentGenerator>
<property name="suppressAllComments" value="true" />
</commentGenerator>
<!-- 資料庫連結URL、使用者名稱、密碼 -->
<!-- <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/sy" userId="sypro" password="sypro"> -->
<jdbcConnection driverClass="org.gjt.mm.mysql.Driver"
connectionURL="jdbc:mysql://127.0.0.1/test?useUnicode=true&characterEncoding=utf-8"
userId="root" password="******">
</jdbcConnection>
<javaTypeResolver>
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<!-- 生成模型的包名和位置 -->
<javaModelGenerator targetPackage="com.lyf.model"
targetProject="D:\web\mybitsUse">
<property name="enableSubPackages" value="true" />
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!-- 生成的對映檔案包名和位置 -->
<sqlMapGenerator targetPackage="com.lyf.mapping"
targetProject="D:\web\mybitsUse">
<property name="enableSubPackages" value="true" />
</sqlMapGenerator>
<!-- 生成DAO的包名和位置 -->
<javaClientGenerator type="ANNOTATEDMAPPER" targetPackage="com.lyf.mapper"
targetProject="D:\web\mybitsUse">
<property name="enableSubPackages" value="true" />
</javaClientGenerator>
<!-- 要生成那些表(更改tableName和domainObjectName就可以)
更復雜的方式如下: 但基本不常用
<table tableName="tmenu" domainObjectName="Menu" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false" />
-->
<table tableName="company" domainObjectName="Company" />
<table tableName="emp" domainObjectName="Emp" />
<table tableName="user" domainObjectName="User" />
</context>
</generatorConfiguration>
3.將generator.xml文件和mybatis的jar 置於某個目錄下,本例目錄為:D:\web\mybitsUse
4.由java命令生成model,mappper
命令為:java -jar mybatis-generator-core-1.3.2.jar -configfile generator.xml -overwrite
就會在當前目錄下生成我們需要的目錄com
5.建立一個maven專案
在pom.xml中要加入jar包
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.31</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.1</version>
</dependency>
6.將我們建立好的com目錄移到maven專案中,
7.建立好resources下的資源配置文件mybatis.cfg.xml
注意標清連結的資料庫,mapper對映之類
<?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="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="org.gjt.mm.mysql.Driver" />
<property name="url" value="jdbc:mysql://127.0.0.1/test?useUnicode=true&characterEncoding=utf-8" />
<property name="username" value="root" />
<property name="password" value="******" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper class="com.lyf.mapper.CompanyMapper"/>
<mapper class="com.lyf.mapper.EmpMapper"/>
<mapper class="com.lyf.mapper.UserMapper"/>
</mappers>
</configuration>
8.整個專案的目錄結構就建立好了
9.下面實現單表操作的增刪改查
package com.lyf.service;
import com.lyf.model.User;
import com.lyf.model.UserExample;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import java.util.List;
/**
* Created by fangjiejie on 2017/5/29.
*/
public class UserServiceImp {
SqlSessionFactory ssf;
public UserServiceImp() {
ssf=new SqlSessionFactoryBuilder().build(this.getClass().getClassLoader().getResourceAsStream("mybatis.cfg.xml"));
}
public static void main(String[] args) {
new UserServiceImp();
}
@Test
public void add(){
SqlSession sqlSession=ssf.openSession();
User user=new User();
user.setUsername("lyf");
user.setPsw("hahaha");
sqlSession.insert("com.lyf.mapper.UserMapper.insert",user);
sqlSession.commit();
sqlSession.close();
}
@Test
public void del(){
SqlSession sqlSession=ssf.openSession();
User user=new User();
user.setId(8);
sqlSession.delete("com.lyf.mapper.UserMapper.deleteByPrimaryKey",user);
//sqlSession.delete("com.lyf.mapper.UserMapper.deleteByPrimaryKey",8);
sqlSession.commit();
sqlSession.close();
}
@Test
public void Update(){
SqlSession sqlSession=ssf.openSession();
User user=new User();
user.setId(11);
user.setUsername("hahahaaa");
sqlSession.update("com.lyf.mapper.UserMapper.updateByPrimaryKeySelective",user);
sqlSession.commit();
sqlSession.close();
}
@Test
public void selectUser(){
SqlSession sqlSession=ssf.openSession();
UserExample userExample=new UserExample();
userExample.createCriteria().andUsernameLike("l%");
List<User> list= sqlSession.selectList("com.lyf.mapper.UserMapper.selectByExample",userExample);
for(User u:list){
System.out.println(u.getUsername());
}
sqlSession.close();
}
}
10.下面演示主從表一對多,多對一的查詢
1.在Company類中新增屬性物件elist(emp的集合),並作getter和setter
private Object elist;
public Object getElist() {
return elist;
}
public void setElist(Object elist) {
this.elist = elist;
}
在Emp類中新增物件屬性comp(company),並做getter和setter
private Object comp;
public Object getComp() {
return comp;
}
public void setComp(Object comp) {
this.comp = comp;
}
2.在mapper中新增修改對映關係,新增對映方法
CompanyMapper類
修改:
@Select({
"select",
"cid, name, address, pro, city, price",
"from company",
"where cid = #{cid,jdbcType=INTEGER}"
})
@Results({
@Result(column="cid", property="cid", jdbcType=JdbcType.INTEGER, id=true),
@Result(column="name", property="name", jdbcType=JdbcType.VARCHAR),
@Result(column="address", property="address", jdbcType=JdbcType.VARCHAR),
@Result(column="pro", property="pro", jdbcType=JdbcType.VARCHAR),
@Result(column="city", property="city", jdbcType=JdbcType.VARCHAR),
@Result(column="price", property="price", jdbcType=JdbcType.REAL),
@Result(property="elist",javaType = List.class,column="cid",
many = @Many(select="com.lyf.mapper.EmpMapper.selectEmpByCom"))
})
Company selectByPrimaryKey(Integer cid);
新增selectComByEmp方法:
@Select({
"select",
"cid, name, address, pro, city, price",
"from company",
"where cid = #{cid,jdbcType=INTEGER}"
})
@Results({
@Result(column="cid", property="cid", jdbcType=JdbcType.INTEGER, id=true),
@Result(column="name", property="name", jdbcType=JdbcType.VARCHAR),
@Result(column="address", property="address", jdbcType=JdbcType.VARCHAR),
@Result(column="pro", property="pro", jdbcType=JdbcType.VARCHAR),
@Result(column="city", property="city", jdbcType=JdbcType.VARCHAR),
@Result(column="price", property="price", jdbcType=JdbcType.REAL)
})
Company selectComByEmp(Integer cid);
EmpMapper類:
修改:
@Select({
"select",
"eid, name, sex, email, salary, cid",
"from emp",
"where eid = #{eid,jdbcType=INTEGER}"
})
@Results({
@Result(column="eid", property="eid", jdbcType=JdbcType.INTEGER, id=true),
@Result(column="name", property="name", jdbcType=JdbcType.VARCHAR),
@Result(column="sex", property="sex", jdbcType=JdbcType.VARCHAR),
@Result(column="email", property="email", jdbcType=JdbcType.VARCHAR),
@Result(column="salary", property="salary", jdbcType=JdbcType.REAL),
@Result(column="cid", property="cid", jdbcType=JdbcType.INTEGER),
@Result(property = "comp",column="cid",
one = @One(select="com.lyf.mapper.CompanyMapper.selectComByEmp"))
})
Emp selectByPrimaryKey(Integer eid);
新增selectEmpByCom方法:
@Select({
"select",
"eid, name, sex, email, salary, cid",
"from emp",
"where cid = #{cid,jdbcType=INTEGER}"
})
@Results({
@Result(column="eid", property="eid", jdbcType=JdbcType.INTEGER, id=true),
@Result(column="name", property="name", jdbcType=JdbcType.VARCHAR),
@Result(column="sex", property="sex", jdbcType=JdbcType.VARCHAR),
@Result(column="email", property="email", jdbcType=JdbcType.VARCHAR),
@Result(column="salary", property="salary", jdbcType=JdbcType.REAL),
@Result(column="cid", property="cid", jdbcType=JdbcType.INTEGER)
})
List<Emp> selectEmpByCom(Integer cid);
測試程式碼:
package com.lyf.service;
import com.lyf.model.Company;
import com.lyf.model.Emp;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import java.util.List;
/**
* Created by fangjiejie on 2017/5/29.
*/
public class CompanyServiceImp {
private SqlSessionFactory ssf;
public CompanyServiceImp(){
ssf= new SqlSessionFactoryBuilder().build(this.getClass().getClassLoader().getResourceAsStream("mybatis.cfg.xml"));
}
@Test
public void queryEmpByCompany(){
SqlSession session=ssf.openSession();
Company company=new Company();
company.setCid(1);
Company company1=session.selectOne("com.lyf.mapper.CompanyMapper.selectByPrimaryKey",company);
List<Emp> list=(List<Emp>)company1.getElist();
for(Emp e:list){
System.out.println(e.getName());
}
session.close();
}
//執行結果:
MIKE
JACK
@Test
public void queryComByEmp(){
SqlSession session=ssf.openSession();
Emp emp1=session.selectOne("com.lyf.mapper.EmpMapper.selectByPrimaryKey",4);
List<Company> company=(List<Company>) emp1.getComp();
System.out.println(company.get(0).getName());
session.close();
}
}
//執行結果:
京東