- mybatis简介
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。
MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。
Mybatis通过xml或注解的方式将要执行的各种statement(statement、preparedStatemnt、CallableStatement)配置起来,并通过java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回。 - mybatis解决jdbc的问题
1、数据库连接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库连接池可解决此问题。
解决:在SqlMapConfig.xml中配置数据连接池,使用连接池管理数据库链接。
2、Sql语句写在代码中造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。
解决:将Sql语句配置在XXXXmapper.xml文件中与java代码分离。
3、向sql语句传参数麻烦,因为sql语句的where条件不一定,可能多也可能少,占位符需要和参数一一对应。
解决:Mybatis自动将java对象映射至sql语句,通过statement中的parameterType定义输入参数的类型。
4、对结果集解析麻烦,sql变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成pojo对象解析比较方便。
解决:Mybatis自动将sql执行结果映射至java对象,通过statement中的resultType定义输出结果的类型。 - mybatis的入门详解
-|导包
mybatis的核心包:
核心包
mybatis-3.2.7.jar
mysql-connector-java-5.1.7-bin.jar
依赖包:主要第打印log及其他
asm-3.3.1.jar
cglib-2.2.2.jar
commons-logging-1.1.1.jar
/javassist-3.17.1-GA.jar
log4j-1.2.17.jar
log4j-api-2.0-rc1.jar
log4j-core-2.0-rc1.jar
slf4j-api-1.7.5.jar
slf4j-log4j12-1.7.5.jar
导包完成
- 准备数据库:测试用的bos_puya32数据库,操作的表为t_customer
-|t_customer分别有
id,name,station,telephone,address,decidedzone_id 这几个字段,
5.准备接入数据,创建t_t_customer对应的实体类,包名为com.puya.mybatis.pojo
package com.puya.mybatis.pojo;
import java.io.Serializable;
public class User implements Serializable {
private Integer id;
private String name;
private String station;
private String telephone;
private String address;
private String decidedzone_id;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getStation() {
return station;
}
public void setStation(String station) {
this.station = station;
}
public String getTelephone() {
return telephone;
}
public void setTelephone(String telephone) {
this.telephone = telephone;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getDecidedzone_id() {
return decidedzone_id;
}
public void setDecidedzone_id(String decidedzone_id) {
this.decidedzone_id = decidedzone_id;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", station=" + station + ", telephone=" + telephone + ", address="
+ address + ", decidedzone_id=" + decidedzone_id + "]";
}
}
- 配置log4j,创建一个log4j.properties,内容如下,主要是打印log的作用
# 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
- 配置mybatis,创建一个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">
- 填写mybatis的configuration内容,注意数据库的名字和登录的账号和密码,否则jdbc连接不上
<?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/bos_puya32?characterEncoding=utf-8" />
<property name="username" value="root" />
<property name="password" value="123456" />
</dataSource>
</environment>
</environments>
<!-- Mapper的位置 Mapper.xml 写Sql语句的文件的位置 -->
<mappers>
<mapper resource="com/puya/mybatis/sqlmap/User.xml"/>
</mappers>
</configuration>
- 书写测试的代码,通过id查找一个对象
@Test
public void testMybatis() throws Exception {
//加载核心的配置文件
String path ="sqlMapConfig.xml";
//读取配置文件获取流
InputStream in = Resources.getResourceAsStream(path);
//创建sqlSessionFactory
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(in);
//创建session
SqlSession session = sessionFactory.openSession();
//执行sql语句
User user = session.selectOne("user.findUserById", 1);
System.out.println(user);
}
- 在这里就疑问sql语句写在哪里? 每一个实体类都需要对应一个实体类的xml文件,然后配置在mybatis的文件中去
User类对应的实体xml文件,User.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">
<!-- 写sql语句的地方 -->
<mapper namespace="user">
<!--
mapper参数详解:
namespace:命名空间,区分不同的sql,调用的时候使用 user.findUserById
select 参数详解
parameterType : 传入参数的类型,mybatis封装了基本类,只需要写
resultType : 返回的数据类型,一般是全类名
-->
<select id="findUserById" parameterType="Integer" resultType="com.puya.mybatis.pojo.User">
select * from t_customer where id = #{v}
</select>
<!--
#{v} 表示占位符v可以是任何字符 select * from t_customer where id = ?
${value} 表示字符拼接,只能是value select * from t_customer where name like '%张三%' ,有单引号的
为了防止sql注入 ${value} 可以这样写 select * from t_customer where name like "%"#{value}"%"
-->
<select id="findUserByUserName" parameterType="String" resultType="com.puya.mybatis.pojo.User">
<!-- select * from t_customer where username like '%${value}%' -->
select * from t_customer where name like "%"#{value}"%" <!-- 这个可以防止sql注入 -->
</select>
<insert id="insertUser" parameterType="com.puya.mybatis.pojo.User">
<!--private Integer id;
private String name;
private String station;
private String telephone;
private String address;
private String decidedzone_id; -->
<selectKey keyProperty="id" resultType="Integer" order="AFTER">
select LAST_INSERT_ID() <!-- 这个表示执行最新的id 服装到User的id中去-->
</selectKey>
insert into t_customer (name,station,telephone,address,decidedzone_id) value(#{name},#{station},#{telephone},#{address},#{decidedzone_id})
</insert>
<update id="updateUserById" parameterType="com.puya.mybatis.pojo.User">
update t_customer
set name=#{name},station=#{station},telephone=#{telephone},address=#{address},decidedzone_id=#{decidedzone_id}
where id=#{id}
</update>
<delete id="deleteUserById" parameterType="Integer">
delete from t_customer where id =#{value}
</delete>
</mapper>
一定要记得配置到sqlMapConfig.xml 文件中去,路径配置正确即可
<!-- Mapper的位置 Mapper.xml 写Sql语句的文件的位置 -->
<mappers>
<mapper resource="com/puya/mybatis/sqlmap/User.xml"/>
</mappers>
//执行sql语句
User user = session.selectOne("user.findUserById", 1);
这句代码执行的时候就会执行User.xml文件中的
<select id="findUserById" parameterType="Integer" resultType="com.puya.mybatis.pojo.User">
select * from t_customer where id = #{v}
</select>
语句,就查询到了响应的User对象
- 根据用户名字模糊查询
@Test
public void findUserByUserName() throws Exception {
//加载核心的配置文件
String path ="sqlMapConfig.xml";
//读取配置文件获取流
InputStream in = Resources.getResourceAsStream(path);
//创建sqlSessionFactory
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(in);
//创建session
SqlSession session = sessionFactory.openSession();
//执行sql语句
List<User> data = session.selectList("user.findUserByUserName", "张三");
for (User user2 : data) {
System.out.println(user2);
}
}
对应的User.xml文件中的sql语句
<!--
#{v} 表示占位符v可以是任何字符 select * from t_customer where id = ?
${value} 表示字符拼接,只能是value select * from t_customer where name like '%张三%' ,有单引号的
为了防止sql注入 ${value} 可以这样写 select * from t_customer where name like "%"#{value}"%"
-->
<select id="findUserByUserName" parameterType="String" resultType="com.puya.mybatis.pojo.User">
<!-- select * from t_customer where username like '%${value}%' -->
select * from t_customer where name like "%"#{value}"%" <!-- 这个可以防止sql注入 -->
</select>
<!-- 注意这些占位符和字符串拼接的书写
#{v} 表示占位符v可以是任何字符 select * from t_customer where id = ?
${value} 表示字符拼接,只能是value select * from t_customer where name like '%张三%' ,有单引号的
为了防止sql注入 ${value} 可以这样写 select * from t_customer where name like "%"#{value}"%"
- 插入一个用户
@Test
public void insertUser() throws Exception {
//加载核心的配置文件
String path ="sqlMapConfig.xml";
//读取配置文件获取流
InputStream in = Resources.getResourceAsStream(path);
//创建sqlSessionFactory
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(in);
//创建session
SqlSession session = sessionFactory.openSession();
User user = new User();
user.setAddress("湖北省咸宁市通城县");
user.setName("纱布都");
user.setStation("文员");
user.setTelephone("15526896541");
session.insert("user.insertUser", user);
//插入数据,一定要交事务
session.commit();
System.out.println(user.getId());
}
- 更新一个用户
@Test
public void updateUser() throws Exception {
//加载核心的配置文件
String path ="sqlMapConfig.xml";
//读取配置文件获取流
InputStream in = Resources.getResourceAsStream(path);
//创建sqlSessionFactory
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(in);
//创建session
SqlSession session = sessionFactory.openSession();
User user = new User();
user.setAddress("湖北省咸宁市通城县22222222");
user.setId(10);
user.setName("纱布都");
user.setStation("文员2222222");
user.setTelephone("15526896541");
session.update("user.updateUserById", user);
//插入数据,一定要交事务
session.commit();
}
- 删除一个用户
@Test
public void deleteUserByid() throws Exception {
//加载核心的配置文件
String path ="sqlMapConfig.xml";
//读取配置文件获取流
InputStream in = Resources.getResourceAsStream(path);
//创建sqlSessionFactory
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(in);
//创建session
SqlSession session = sessionFactory.openSession();
session.update("user.deleteUserById", 10);
//插入数据,一定要交事务
session.commit();
}
增删改的响应的sql语句都在上面的User.xml文件中相对应,可以嘻嘻查看
这就是mybatis的基本使用了,希望对您有帮助