准备工作
1.新建数据库表
首先新建一个user和user_copy两张数据库表
字段为id,username,birthday,sex,address
(user里的id为自增user_copy里的id不为自增)
2.新建pojo类
user和user2类
以下为user类代码
public class User {
private int id;
private String username;
private String sex;
private Date birthday;
private String address;
public int getId ( ) {
return id;
}
public void setId ( int id) {
this . id = id;
}
public String getUsername ( ) {
return username;
}
public void setUsername ( String username) {
this . username = username;
}
public String getSex ( ) {
return sex;
}
public void setSex ( String sex) {
this . sex = sex;
}
public Date getBirthday ( ) {
return birthday;
}
public void setBirthday ( Date birthday) {
this . birthday = birthday;
}
public String getAddress ( ) {
return address;
}
public void setAddress ( String address) {
this . address = address;
}
@Override
public String toString ( ) {
return "User [id=" + id + ", username=" + username + ", sex=" + sex + ", birthday=" + birthday + ", address="
+ address + ", ordersList=" + ordersList + "]" ;
}
}
3.新建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" >
< configuration>
< ! -- 配置数据源 和事务信息 -- >
< environments default = "development" >
< environment id= "development" >
< ! -- 事务管理器 使用jdbc事务 -- >
< transactionManager type= "JDBC" > < / transactionManager>
< ! -- 连接数据池 -- >
< dataSource type= "POOLED" >
< ! -- 属性 -- >
< property name= "driver" value= "com.mysql.jdbc.Driver" / >
< property name= "url" value= "jdbc:mysql://localhost:3306/mybatis0202?characterEncoding=utf-8" / >
< property name= "username" value= "root" / >
< property name= "password" value= "zzj6660534" / >
< / dataSource>
< / environment>
< / environments>
< mappers>
< ! -- 加载映射文件 -- >
< mapper resource= "sqlmap/Users.xml" / >
< / mappers>
< / configuration>
4.新建映射文件信息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" >
< mapper namespace= "test" > < ! -- 命名空间namespace -- >
< ! -- 映射文件信息
id: 映射sql的一个表示
parameterType 输入参数的类型 int
#{ } 表示一个占位符,简单类型里面的参数名任意
resultType sql输出结果映射的对象类型
-- >
< select id= "findUserById" parameterType= "int" resultType= "cn.mybatis.po.User" >
select * from user where id= #{ value}
< / select>
< ! -- 模糊检索 -- >
< ! -- ${ } 拼接sql串 但是有可能引起sql注入
${ value} 接收输入参数的内容 如果是简单类型 ${ } 只能用value
-- >
< select id= "findUserByName" parameterType= "java.lang.String" resultType= "cn.mybatis.po.User" >
select * from user where username like '%${value}%'
< / select>
< ! -- 模糊检索使用#{ } 方式 -- >
< select id= "findUserByName1" parameterType= "java.lang.String" resultType= "cn.mybatis.po.User" >
select * from user where username like "%" #{ value} "%"
< / select>
< ! -- 添加用户
parameterType输入参数类型 pojo
#{ } 中指定的属性名
-- >
< insert id= "insertUser" parameterType= "cn.mybatis.po.User" >
< ! --
主键自增
将插入数据的主键 返回到user对象里
keyProperty将查询到的主键值设置到parameterType指定的那个属性中(这里是id中)
order: select last_insert_id ( ) 执行顺序 相对与insert之后-- >
< selectKey keyProperty= "id" order= "AFTER" resultType= "java.lang.Integer" >
select last_insert_id ( )
< / selectKey>
insert into user ( username, birthday, sex, address) values ( #{ username} , #{ birthday} , #{ sex} , #{ address} )
< / insert>
< insert id= "insertUserByUuid" parameterType= "cn.mybatis.po.User2" >
< ! --
插入自动生成主键
将插入数据的主键 返回到user对象里
keyProperty将查询到的主键值设置到parameterType指定的那个属性中
order: select last_insert_id ( ) 执行顺序 相对与insert之前-- >
< selectKey keyProperty= "id" order= "BEFORE" resultType= "java.lang.String" >
select uuid ( )
< / selectKey>
insert into user_copy ( id, username, birthday, sex, address) values ( #{ id} , #{ username} , #{ birthday} , #{ sex} , #{ address} )
< / insert>
< ! -- 使用oracle 用序列当主键
< insert id= "insertUser" parameterType= "cn.mybatis.po.User" >
< selectKey keyProperty= "id" order= "BEFORE" resultType= "java.lang.Integer" >
select 序列名nextval ( )
< / selectKey>
insert into user ( id, username, birthday, sex, address) values ( #{ id} , #{ username} , #{ birthday} , #{ sex} , #{ address} )
< / insert> -- >
< ! -- 删除用户 -- >
< delete id= "deleteUser" parameterType= "java.lang.Integer" >
delete from user where id = #{ id}
< / delete>
< ! -- 修改 -- >
< update id= "updateUser" parameterType= "cn.mybatis.po.User" >
update user set username = #{ username} , birthday = #{ birthday} , sex = #{ sex} , address = #{ address}
where id = #{ id}
< / update>
< / mapper>
5.在MyBatisFirst类使用Test单元测试
package cn. mybatis. first;
import java. io. IOException;
import java. io. InputStream;
import java. util. Date;
import java. util. List;
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 cn. mybatis. po. User;
import cn. mybatis. po. User2;
public class MybatisFrist {
@Test
public void findUserByIdTest ( ) throws Exception{
String resource = "SqlMapConfig.xml" ;
InputStream inputStream = Resources. getResourceAsStream ( resource) ;
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder ( ) . build ( inputStream) ;
SqlSession sqlSession = sqlSessionFactory. openSession ( ) ;
User user = sqlSession. selectOne ( "test.findUserById" , 10 ) ;
System. out. println ( user) ;
sqlSession. close ( ) ;
}
@Test
public void findUserByNameTest ( ) throws Exception {
String resource = "SqlMapConfig.xml" ;
InputStream inputStream = Resources. getResourceAsStream ( resource) ;
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder ( ) . build ( inputStream) ;
SqlSession sqlSession = sqlSessionFactory. openSession ( ) ;
List< User> list = sqlSession. selectList ( "test.findUserByName1" , "明" ) ;
System. out. println ( list) ;
sqlSession. close ( ) ;
}
@Test
public void insertUserTest ( ) throws Exception{
String resource = "SqlMapConfig.xml" ;
InputStream inputStream = Resources. getResourceAsStream ( resource) ;
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder ( ) . build ( inputStream) ;
SqlSession sqlSession = sqlSessionFactory. openSession ( ) ;
User user = new User ( ) ;
user. setUsername ( "tom" ) ;
user. setBirthday ( new Date ( ) ) ;
user. setSex ( "1" ) ;
user. setAddress ( "天津" ) ;
System. out. println ( "执行前" + user) ;
int res = sqlSession. insert ( "test.insertUser" , user) ;
System. out. println ( res) ;
System. out. println ( "执行后" + user) ;
sqlSession. commit ( ) ;
sqlSession. close ( ) ;
}
@Test
public void insertUserByUuidTest ( ) throws Exception{
String resource = "SqlMapConfig.xml" ;
InputStream inputStream = Resources. getResourceAsStream ( resource) ;
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder ( ) . build ( inputStream) ;
SqlSession sqlSession = sqlSessionFactory. openSession ( ) ;
User2 user = new User2 ( ) ;
user. setUsername ( "jack" ) ;
user. setBirthday ( new Date ( ) ) ;
user. setSex ( "1" ) ;
user. setAddress ( "天津" ) ;
System. out. println ( "执行前" + user) ;
int res = sqlSession. insert ( "test.insertUserByUuid" , user) ;
System. out. println ( res) ;
System. out. println ( "执行后" + user) ;
sqlSession. commit ( ) ;
sqlSession. close ( ) ;
}
@Test
public void deleteUserTest ( ) throws Exception{
String resource = "SqlMapConfig.xml" ;
InputStream inputStream = Resources. getResourceAsStream ( resource) ;
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder ( ) . build ( inputStream) ;
SqlSession sqlSession = sqlSessionFactory. openSession ( ) ;
sqlSession. delete ( "test.deleteUser" , 31 ) ;
sqlSession. commit ( ) ;
sqlSession. close ( ) ;
}
@Test
public void updateUserTest ( ) throws Exception{
String resource = "SqlMapConfig.xml" ;
InputStream inputStream = Resources. getResourceAsStream ( resource) ;
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder ( ) . build ( inputStream) ;
SqlSession sqlSession = sqlSessionFactory. openSession ( ) ;
User user = new User ( ) ;
user. setUsername ( "zhangsan123" ) ;
user. setBirthday ( new Date ( ) ) ;
user. setSex ( "1" ) ;
user. setAddress ( "天津" ) ;
user. setId ( 30 ) ;
sqlSession. update ( "test.updateUser" , user) ;
sqlSession. commit ( ) ;
sqlSession. close ( ) ;
}
}
总结
1.parameterType 在映射文件中通过parameterType指定输入参数类型
2.resultType 在映射文件中通过resultType指定输出结果类型
3.#{}/${}
1.#{}表示一个占位符号,接收输入参数,类型可以是简单类型,pojo hasmap。
如果接收简单类型,可以写成value或其他名称;
接收pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性……的方式来获取对象属性
2.${}表示一个拼接符号,会引入sql注入(所以不建议使用)接收输入参数 可以是简单类型,pojo,hasmap
如果接收简单类型 只能写value
接收pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性……的方式获取对象属性值
4.selectOne和selectList
1.selectOne表示查询出一条记录进行映射。如果使用selectOne可以实现(list中也只有一个对象)
2.selectList表示查询出一个列表(多条记录)进行映射。如果使用selectList查询多条记录,不能使用selectOne
5.mybatis和hibernate本质区别和应用场景
1.hibernate是一个标准ORM框架(对象映射关系)。不需要程序写sql,sql语句自动生成。对sql语句进行优化,修改比较困难的。
应用适用于需求变化不多的中小型项目,如后台管理系统 erp orm oa……
2.mybatis专注是sql本身,需要程序员自己编写sql语句,sql修改,优化比较方便。
mybatis是一个不完全的orm框架,虽然程序员自己写sql,mybatis也可以实现映射(输出映射,输入映射)
使用与需求变化较多的项目,如互联网项目
5.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定义输出结果类型