mybatis就是一个封装来jdbc的持久层框架,它和hibernate都属于ORM框架
Mybatis让程序员只关注sql本身,而不需要去关注如连接等操作。
Mybatis会将输入参数、输出结果进行映射。
ORM(Object Relational Mapping)框架用来描述对象与关系映射的细节提供了持久化类与表的映射关系
根据id查询用户
步骤:
1 准备数据 导入数据库
2 导入mybatis相关jar包
3 创建PO类User
persistant object 持久对象 通常对应数据库表
4 创建xml配置文件,配置mybatis连接数据库
可以参照mybatis文档
5 创建User类的映射文件User.xml
6 在User.xml中配合根据id查询学生信息
7 在mybatis配置文件中加载user.xml文件
< mappers >
< mapper resource=“User.xml” />
< /mappers>
8 测试类
//读取配置文件
String resource = “SqlMapConfig.xml”;
InputStream inputStream = Resources.getResourceAsStream(resource);
//创建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//创建SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//调用SqlSession的增删改查方法
//第一个参数:表示配置文件中sql语句的唯一标示
User user = sqlSession.selectOne(“test.findUserById”, 1);
System.out.println(user);
//关闭资源
sqlSession.close();
< select id=“findAll” resultType=“cn.lanou.po.User”>
select * from USER
< /select>
List list = sqlSession.selectList(“test.findAll”);
根据用户名模糊查询
根据用户名称模糊查询用户列表
$ {value}:里面的value表示输入参数的参数名称,如果该参数是简单类型,那么$ {}里面的参数名称必须是value
< select id=“findUsersByName” parameterType=“java.lang.String”
resultType=“mybatis.po.User”>
SELECT * FROM USER WHERE username LIKE ‘%${value}%’
< /select>
List users = sqlSession.selectList(“test.findUsersByName”, “明”);
防止Sql注入
${value} 是原样输出字符串,参数为字符串时使用
会
将
传
入
的
参
数
完
全
拼
接
到
s
q
l
语
句
中
,
也
就
是
相
当
于
一
个
拼
接
符
号
。
也
就
是
,
最
后
的
处
理
方
式
就
相
当
于
S
t
r
i
n
g
s
q
l
=
s
e
l
e
c
t
∗
f
r
o
m
u
s
e
r
w
h
e
r
e
i
d
=
{} 会将传入的参数完全拼接到sql语句中,也就是相当于一个拼接符号。 也就是,最后的处理方式就相当于 String sql = select * from user where id=
会将传入的参数完全拼接到sql语句中,也就是相当于一个拼接符号。也就是,最后的处理方式就相当于Stringsql=select∗fromuserwhereid={value}
select * from user where id=‘张’ or ‘1=1’
缺点,引发sql注入,例如下面传入参数
List list = dao.findUsersByName(“小 ’ or '1=1”);
防止sql注入
SELECT * FROM USER WHERE username LIKE concat(’%’, #{value} ,’%’)
Concat 合并多个字符串
#{} 是一个占位符, mybatis最后会将这个占位符,替换成?
测试类
sqlSession.insert(“test.insertUser”, user);
sqlSession.commit();
插入新用户同时获取新用户id
INSERT INTO USER
(username,birthday,sex,address)
VALUES(#{username},#{birthday},#{sex},#{address})
测试类中:
User user = new User();
user.setUsername(“李明”);
user.setAddress(“大连市高新园区”);
String strDate=“1985-02-28 10:12:11”;
SimpleDateFormat sDateFormat=new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”); //加上时间
Date date=sDateFormat.parse(strDate);
user.setBirthday(date);
sqlSession.insert(“test.insertUser”, user);
// 获取新插入的id
System.out.println(“新插入的id是”+user.getId());
//提交
sqlSession.commit();
说明:
插入一条新的信息之后,我们有时候会需要得到刚插入时自动生成的id
比如电商,下单时,需要好几张表操作,订单表,订单明细表,联系人表,在这些表中
当你一添加订单时,生成的订单id就需要紧接着给其他表,例如订单明细表用
当做成其他表的外键来使用
mybatis的DAO方式
查询根据name模糊查询User信息
步骤:
1 创建DAO层,创建根据name查询的方法
2 实现类中sqlSession对象操作数据库
List list = sqlSession.selectList(“test.findUsersByName”, name);
3 配置User.xml文件
SELECT * FROM USER WHERE username LIKE ‘%${value}%’
4 创建PO类User
5 测试类
List list = dao.findUsersByName(“小”);
Mybatis的Mapper代理开发方式
推荐使用Mapper方式
比Dao方式少了实现类
步骤
1 创建PO类 User
2 创建接口 UserMapper,定义添加用户方法
3 在config下创建UserMapper.xml文件,配置插入用户sql信息
4 在mybatis配置文件中加载UserMapper.xml文件
5 使用sqlSession获取UserMapper对象,并执行插入操作
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
mapper.insertUser(user);
sqlSession.commit();
批量加载mybatis映射文件
首先优化配置
创建属性配置文件 db.properties
db.driver=com.mysql.jdbc.Driver
db.url=jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf8
db.username=yutao
db.password=111111
将SqlMapConfig.xml配置文件修改如下
<!-- 加载java的配置文件或者声明属性信息 -->
<properties resource="db.properties">
<!--可以修改某个属性值-->
<property name="db.username" value="123" />
</properties>
<!-- 配置mybatis的环境信息 -->
<environments default="development">
<environment id="development">
<!-- 配置JDBC事务控制,由mybatis进行管理 -->
<transactionManager type="JDBC"></transactionManager>
<!-- 配置数据源,采用dbcp连接池 -->
<dataSource type="POOLED">
<property name="driver" value="${db.driver}" />
<property name="url" value="${db.url}" />
<property name="username" value="${db.username}" />
<property name="password" value="${db.password}" />
</dataSource>
</environment>
</environments>
<!-- 加载映射文件 -->
<mappers>
<mapper resource="User.xml" />
<!-- 批量加载,加载src下的mybatis.mapper包下所有 -->
<package name="mybatis.mapper" />
</mappers>