早期ssh框架:spring struts2 hibernate.
目前使用ssm:spring(service) springMVC(servlet) mybatis(jdbc DbUtil)
@Test
public void test() throws Exception{
// 1 加载驱动
Connection connection =null;
PreparedStatement Statement = null;
ResultSet resultSet = null;
try {
Class.forName("com.mysql.jdbc.Driver");
// 2 获取连接
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis","root","1234");
// 3 获取preparestatement
String sql = "select * from tb_user where id = ?";
Statement = connection.prepareStatement(sql);
// 4 设置参数
Statement.setLong(1,1L);
// 5 执行查询,获取结果集
resultSet = Statement.executeQuery();
// 6 解析结果集
while (resultSet.next()){
System.out.println(resultSet.getString("user_name"));
System.out.println(resultSet.getString("password"));
System.out.println(resultSet.getInt("age"));
}
} finally {
resultSet.close();
Statement.close();
connection.close();
}
}
原是apache的一个开源项目iBatis,后迁移到google code,ibatis3.x正式更名为Mybatis,ibatis 是一种“半自动化”的ORM实现。
Mybatis中文帮助文档
mybatis特点总结
需求:对tb_user表进行CRUD操作
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis" />
<property name="username" value="root" />
<property name="password" value="1234" />
dataSource>
environment>
environments>
<mappers>
<mapper resource="UserDaoMapper.xml" />
mappers>
configuration>
ps:全局配置文件详解
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/mybatis
username=root
password=root
可以在mybatis-config.xml中修改:
<properties resource="jdbc.properties" />
<property name="driver" value="${driver}" />
- cacheEnabled:该配置影响的所有映射器中配置的缓存的全局开关。默认为true
- lazyLoadingEnabled:延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。特定关联关系中可通过设置fetchType属性来覆盖该项的开关状态。
默认为false- aggressiveLazyLoading:当启用时,带有延迟加载属性的对象的加载与否完全取决于对任意延迟属性的调用;反之,每种属性将会按需加载。
默认true- mapUnderscoreToCamelCase:是否开启自动驼峰命名规则(camel case)映射,即从经典数据库列名 A_COLUMN 到经典 Java 属性名 aColumn 的类似映射。 默认false
数据库的字段名是user_name,POJO中的属性名字是userName,两端不一致,造成mybatis无法填充对应的字段信息。可以采用别名和开启mapUnderscoreToCamelCase(驼峰匹配)
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
settings>
<typeAliases>
<typeAlias type="com.atguigu.mybatis.pojo.User" alias="User"/>
typeAliases>
缺点:每个pojo类都要去配置。
方式二:package
<typeAliases>
<package name="com.atguigu.mybatis.pojo"/>
typeAliases>
//构建sqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream,"test");
添加UserDaoMapper.xml映射文件
<mapper namespace="UserDaoMapper">
<select id="queryUserById" resultType="com.atguigu.mybatis.pojo.User">
select *,user_name as username from tb_user where id=#{id}
select>
mapper>
对于映射文件,CRUD标签相当于设置statement,其中有属性id,resultType,parameterType以及内容
- id:在同一个命名空间下的唯一标识;使用动态代理之后,要求和mapper接口的方法名一致。必须属性
- resultType:sql语句的结果集封装类型;使用动态代理之后,要求和mapper接口方法的返回类型一致。和resultMap二选一
- parameterType:参数类型;使用动态代理之后,要求和mapper接口的方法参数类型一致。可省略,这里就省略了
- 内容:查询的sql语句
public class User {
private Long id;
private String userName;
private String password;
private String name;
private Integer age;
private Integer sex;
private Date birthday;
private Date created;
private Date updated;
}
public interface UserDao {
/**
* 根据id获取用户信息
* @param id
* @return
*/
public User queryUserById(long id);
/**
* 查询全部用户信息
* @return
*/
public List<User> queryUserAll();
/**
* 新增用户
* @param user
*/
public void insertUser(User user);
/**
* 更新用户信息
* @param user
*/
public void updateUser(User user);
/**
* 根据id删除用户信息
* @param id
*/
public void deleteUserById(Long id);
}
public class UserDaoImpl implements UserDao {
private SqlSession sqlSession;
public UserDaoImpl(SqlSession sqlSession) {
this.sqlSession = sqlSession;
}
@Override
public User queryUserById(long id) {
return this.sqlSession.selectOne("UserDaoMapper.queryUserById",id);
}
@Override
public List<User> queryUserAll() {
return this.sqlSession.selectList("UserDaoMapper.queryUserAll");
}
@Override
public void insertUser(User user) {
this.sqlSession.insert("UserDaoMapper.insertUser",user);
//提交
this.sqlSession.commit();
}
@Override
public void updateUser(User user) {
this.sqlSession.update("UserDaoMapper.updateUser", user);
this.sqlSession.commit();
}
@Override
public void deleteUserById(Long id) {
this.sqlSession.delete("UserDaoMapper.deleteUserById", id);
this.sqlSession.commit();
}
}
在idea中,在接口中使用快捷键ctrl+shift+t 可以快捷创建测试类
public class UserDaoTest {
private UserDao userDao;
@Before
public void setUp() throws Exception {
String resource = "mybatis-config.xml";
//读取配置文件
InputStream inputStream = Resources.getResourceAsStream(resource);
//构建sqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//获取sqlsession
SqlSession sqlSession = sqlSessionFactory.openSession();
this.userDao = new UserDaoImpl(sqlSession);
}
@Test
public void queryUserById() {
System.out.println(userDao.queryUserById(1l));
}
@Test
public void queryUserAll() {
userDao.queryUserAll().forEach(System.out::println);
}
//仅展示前两个功能测试代码
}
运行测试通过!!
在写程序的时候,因为MyBatis是“半自动的”,生成sql语句和javaBean的,报错很难进行调试,需要使用日志进行调试。
使用log日志步骤
log4j.rootLogger=DEBUG,A1
log4j.logger.org.apache=DEBUG
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c]-[%p] %m%n
得一寸进一寸,得一尺进一尺,不断积累,飞跃必来,突破随之!!!